【公众号】:小鱼神1024
【作者主页】:小鱼神1024
【知识星球】:小鱼神的逆向编程圈
【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系作者立即删除!
前言
相信补环境对大家来说并不陌生,但是如何补环境,补到什么程度,可能很多人还是不清楚,所以这里总结一下补环境的一些思路,希望能帮助到大家。以某书为例,分析一下 x-s、x-t 签名算法补环境的过程。
前置分析
首先,我们先找到入口,全局搜索 window._webmsxyw
,找到如下代码:
找到参数生成位置,如下:
将代码全部复制到文件中。然后,就是补环境了。但是如何补环境呢?思路是什么呢?
补环境思路
首先是在文件最底部打印 window._webmsxyw()
,直接执行js代码,根据报错信息,逐步补充缺少的环境。比如,缺少 window
。
当补充部分环境后,不再报错了。但是生成的 x-s
明显不对时,这时就需要用到 Proxy
代理了。这个可以手动写,比如看到有些博主使用的 watch
函数,可以检测对象的获取和设置。但缺点也明显,如果多层级调用,需要手动检测。很不方便。大家可以尝试下我封装好的 Proxy
代理,如下:
执行运行后,可以发现,可以看到许多有用的信息,如下:
这样根据日志信息,就可以补充缺失的环境了。
补到这里,也生成了 x-s
,但是生成的 x-t
也是不对的。
那接下来,又如何分析呢?
可以从以下几个点分析:
- 原型链检测
- 对象描述符检测
- 可枚举对象检测
- node环境检测
- 函数native检测
- Error堆栈检测
- toString检测
- RegExp匹配检测
- 等等
我在这里就不一一讲解了。我星球里都有相应的解决方案。如下:
干货很多,大家可以自行查看。持续更新,争取做全网最全的补环境、纯算教程。
废话不多说,接下来,我们分析最难的一个检测点。
我们在代理日志中发现,它通过 document.createElement('div')
创建一个 div
元素,然后设置 div
的 style
属性的 height
。大致创建过程如下代码:
const div = document.createElement('div');
console.log(div.offsetHeight); // 输出: 0
div.setAttribute('style', 'height: 20px'); // 设置高度
document.body.appendChild(div); // 将div添加到body中
console.log(div.style.height); // 输出: 20px
console.log(div.offsetHeight); // 输出: 20
通过这段代码,我们大致可以看出它如何检测的。首先在没给 div
设置高度之前,此时的 div.offsetHeight
是 0
。然后,给它设置高度后,div.offsetHeight
的值就变成了 20
。
通过对比前后的 offsetHeight
值来做检测。
同时,还有更为复杂的检测,如下:
const div = document.createElement('div');
div.appendChild(div); // 应抛出 HierarchyRequestError
当 div
元素被添加到自身时,会抛出 HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.
错误。
或者还可以这样:
const parent = document.createElement('div');
const child = document.createElement('div');
child.appendChild(parent); // 应抛出 HierarchyRequestError
当 child
元素被添加到 parent
元素时,会抛出 HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.
错误。
这样玩,绝对就难倒大部分玩家了。
当然我也找到它所有的环境检测点以及对应的纯手工补环境解决方案,我将其整理到星球里了。仅供学习交流使用,有需要的自取!
参数验证
有些小伙伴验证是否正确,可能按长度,或者按是否能请求成功,这都不是最好的验证方式。最好的验证方式,就是对比浏览器环境参数。
经过对比,发现和浏览器环境参数一致,这说明,我们的补环境是完全正确的。