Post AZB3cjp0I0kDEL0NSC by winguse@m.wingu.se
(DIR) More posts by winguse@m.wingu.se
(DIR) Post #AZAyfpOrVRjFd4QoxU by winguse@m.wingu.se
2023-08-28T02:45:52Z
0 likes, 0 repeats
这个周末基本都在折腾电子书。。因为想看几本书,所以在当当上买了。我并不是很喜欢当前这种市场环境,买了的电子书只能锁定在某一个平台上使用,所以我要动手转化成可以让我在其他地方使用的格式。。目前国内所有的电子书 PC 端都是把每个字符拆散了,用绝对坐标的方式处理的,所以我要做的就是前端把 HTML 拔下来,然后用浏览器打印成 PDF 就好了。。本来这个不是很难,但是这次我遇到了很奇怪的编码问题。。用 Ghostscript 合并后,Safari 或者 Preview 看起来都是没问题的,复制出来就是乱码,或者是别的中文字。这个耗了我好多时间,最后发现是因为 PDF 内嵌字体的问题,改了好几种字体,某个字符行了,又有别的字符不行。。最后是宋体好像没问题了。。坦白说,这种 DRM 对于想要盗版的人来说,其实没什么门槛。。但是好像确实没什么别的好办法了。。最后搞得我这种花钱买了书的人,却要这么折腾一圈。。不过想了一下,其实要做的更高级一点的 DRM 也还是有办法的,,就是市面上着这些平台,技术还不行。。不过所有人都用同一套技术,这里面是不是有些别的什么原因??
(DIR) Post #AZAyfret6pjidLweDQ by bgme@bgme.me
2023-08-28T02:53:11Z
0 likes, 0 repeats
@winguse 高级DRM实在不行,直接截图(录屏)+OCR重建。
(DIR) Post #AZAz6PPCGHD2pLGMHQ by winguse@m.wingu.se
2023-08-28T02:58:02Z
0 likes, 0 repeats
@bgme 没毛病。。OCR 有一定错误率,而 DRM 这种东西就是要提高盗版门槛而已。
(DIR) Post #AZB1aVPCiY2E22kGie by winguse@m.wingu.se
2023-08-28T03:20:57Z
0 likes, 0 repeats
把玩了一下行业老大微信读书,它用的就是 canvas,这个也是我的一个想法之一。。不过它用的太直接了,直接用了 fillText,所以我只要 proxy 一下,它所有加密的努力就都白费了,而且它还是顺序 draw 的。。oldFillText = CanvasRenderingContext2D.prototype.fillText;CanvasRenderingContext2D.prototype.fillText = function () { console.log(arguments) return oldFillText.apply(this, arguments);}然后我就看到了:Arguments(3) ['致', 208, 20.75, callee: ƒ, Symbol(Symbol.iterator): ƒ]app.7509a2af.js:1 Arguments(3) ['谢', 243, 20.75, callee: ƒ, Symbol(Symbol.iterator): ƒ]
(DIR) Post #AZB1gmhPKijVP9FnbE by winguse@m.wingu.se
2023-08-28T03:27:01Z
0 likes, 0 repeats
@bgme 对,所有平台都有网页端,而且很多客户的其实就是网页。。说到底,排版引擎什么的,还是很难的啊。
(DIR) Post #AZB2GG20GioaVonnV2 by bgme@bgme.me
2023-08-28T03:33:27Z
0 likes, 0 repeats
@winguse 另外,代理原始API,建议直接使用 ES6 Proxy。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy直接修改 prototype 只需要检测 prototype 是否被更改就可以发现。Proxy 对象,在浏览器环境中并不存在有效的检测方法。Node.js 中可以使用 util.types.isProxy。https://nodejs.org/api/util.html#utiltypesisproxyvalue
(DIR) Post #AZB3cjp0I0kDEL0NSC by winguse@m.wingu.se
2023-08-28T03:48:42Z
0 likes, 0 repeats
@bgme @bgme 有意思,现在娱乐圈这么好玩了嘛…不过大致看了一下,这个 Proxy 是按照实例去代理的?我要影响某个类所有的实例,这个还是要改 prototype 吧?只要检测是不是 native 还是可以发现吧?不过我觉得这种高频接口不好每次都去检查,再怎么说 js 代码定向爆破可比机器码简单多了,嘿嘿(Retoot 改一下权限)
(DIR) Post #AZB3nBv6fuelGuqOvo by bgme@bgme.me
2023-08-28T03:50:37Z
0 likes, 0 repeats
@winguse @winguse @winguse > 我要影响某个类所有的实例这个可以通过修改 construct() 方法来进行。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/construct保证 Hook 代码尽早加载,先 Hook construct() 方法,保证 new 出的都是修改后实例。再 Hook 修改后实例的 apply() 方法,修改 fillText 实现。
(DIR) Post #AZB4ScL7LvK75ElR0C by winguse@m.wingu.se
2023-08-28T03:58:04Z
0 likes, 0 repeats
@bgme 这个例子中,也要求别人使用你 proxy 后的入口创建实例?但是这个要动别人的代码?或者有办法改变这个 symbol ?不过在我现在 hack 的地方,我倒是等待它整个页面加载好了我才动手的,它早就生成好了实例,我只要切换一下页面它重新渲染我就能抓到文字…
(DIR) Post #AZB5ULM7ZKk0wUcWbQ by bgme@bgme.me
2023-08-28T04:09:37Z
0 likes, 0 repeats
@winguse 当然是通过浏览器插件来实现。使用 tabs.executeScript() (MV2)或 scripting.executeScript() (MV3)向 Page Script 在 document_start 注入代码,此时 DOM 还处在 loading 状态,注入的JS会先于网页JS运行。uBlock 资源库里的短代码相当一部分都是通过 Proxy 魔法来实现相应的效果。https://github.com/gorhill/uBlock/wiki/Resources-Library
(DIR) Post #AZB5cO17YfRLVrdIeG by bgme@bgme.me
2023-08-28T04:11:04Z
0 likes, 0 repeats
@winguse 觉得写插件太麻烦,也可以写个油猴脚本。
(DIR) Post #AZB5puGKyvXLHjCHi4 by winguse@m.wingu.se
2023-08-28T04:13:29Z
0 likes, 0 repeats
@bgme 嗯嗯,我倒是知道怎么提前加载啦。。我导出当当的那个代码,还是直接贴到 console 就解决了,哈哈。。。