JS逆向——2
逆向步骤
抓包查看--》寻找加密位置--》断点调试分析--》扣取JS代码 本地改写运行出结果
1.抓包一般为F12 或者抓包工具fiddler Charles等
2:寻找加密位置方法(常用):
- 搜索定位:定位位置精准 但是搜索位置较多 需要筛选 容易搜索不到 (搜索的JS文件名是框架的可以过滤)
- XHR断点:XHR断点 只能对XHR请求使用 通过堆栈找到加密位置
- DOM事件:定位位置一般位于加密前 要找到准确的加密位置,还需要进一步分析上下文才能确定
3:断点调试: 能对网站js进行一些调式 可以看到函数的执行顺序 参数的变化 属性的值 等等
4:扣取代码本地出值: 一般为python实现网站加密逻辑或扣取网站加密代码(常用) 最后给到python(python发起请求 所以要给python)
-
python实现加密逻辑: 需要根据网站加密逻辑把JS代码还原为python代码 简单加密还好 复杂转换难度较高 优点:并发效率高
-
扣取网站JS代码:网站加密也是执行某段JS代码得到加密结果 我们只需要找到他执行的代码 放到本地改写就能和网站一样得到加密结果 扣取JS代码常见的操作有:
扣代码:根据代码执行流程把必须的代码扣取下来 优点是 执行速度快 可以并发 但是比较吃经验 要对js比较熟
补环境:把网站JS代码扣取下来 对缺少的环境进行补充 需要对webapi比较熟悉
不必纠结必须要用哪种 混着用都行 最终的目的就是出结果
5:调试执行JS代码: 一般用到nodejs
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时
Node.js 是一个开源和跨平台的 JavaScript 运行时环境。
6:python执行JS代码: 一般常用的是 pyexecjs
6. python执行JS代码
pyexecjs库:安装命令 pip install pyexecjs (常用)
import execjs
# compile(js代码) 加载代码 返回编译后的JS call(方法名,方法所需要的参数,可多个多个逗号隔开))
js_code = """
function x() {
return 1
}
"""
js = execjs.compile(js_code) # 加载代码 返回编译后的JS
result = js.call('x') # 执行方法
print(result) # result = 1
print(execjs.get().name)
寻找加密位置技巧
一般来说 生成加密结果的 加密位置只有一处
当我们搜索到多处的时候 需要过滤一下 找到加密的地方
过滤:找嫌疑人(谁像加密的地方)
加密算法(md5 sha1) 函数调用 函数传参 关键字 (encrypt)
找到有嫌疑的地方 打断点(目的是确认这个地方是不是加密位置 是不是在这里生成了加密结果)