js逆向之补环境技术介绍
补环境即补充浏览器环境。那为什么要补充浏览器环境呢,因为大多数时候,我们执行js代码都是放在Node中执行。因为Node服务比浏览器更容易部署,所以更愿意用Node。
而Node环境和浏览器存在差异,所以我们需要补充浏览器环境。比如Node没有浏览器相关的对象如window, document等等。另外Node比浏览器多了一些require, module对象,这些也要去除。有同事说,Node没有浏览器中的dom树解析,没有渲染引擎等等,这也是对的。但是从js语言看,一切皆对象,Node是没有window, document等对象。为了让js代码能执行下去,我们只需要补充这些对象即可。例如window对象,有些校验不严格的情况下window = {}也是可以的。
对于Web反爬来说,大多数时候,都是想办法检测是不是Node环境,而这些检测手段,在js语言层面,大都是检测对象是否存在,检测原型链是否和浏览器一致,函数toString是否和浏览器一致。
Node比浏览器多了一些require, module对象,可以使用Node的vm2模块进行规避,vm2模块会构建沙盒环境,在沙盒里面少了很多Node特征。
Node比浏览器少的对象,可以使用proxy技术,缺啥补啥。目前市面上免费的课程,当属志远的补环境框架,讲的是真细。到这时候你会发现,js的语言基础很重要,原型链尤其重要。
有些时候,即便环境补好了,生成的token和浏览器还是不一样,这时需要看代码,对着浏览器进行比较,此时把混淆代码还原后更容易看懂。这就需要用到AST技术了,此时蔡老板的星球就派上用场了。
目前来看, 补环境技术遇到的一个难点是dom树操作,想在js里实现一个dom树操作真心不容易。而jsdom也算是补环境的一种,作为开源十多年的项目,jsdom实现了dom树操作,在jsdom上进行二次开发是个不错的选择。