调试技巧|如何动态调试经过还原后的某数VM文件
【摘要】
关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求
众所周知,某数的js不仅混淆了,而且还是动态的,非常的难以阅读,能让小白直接劝退。
我是研究js混淆代码还原的,希望有一种方法能动态调...
关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求
众所周知,某数的js不仅混淆了,而且还是动态的,非常的难以阅读,能让小白直接劝退。
我是研究js混淆代码还原的,希望有一种方法能动态调试还原后的VM,经过一番摸索,它来了。
2. 准备
因为需要替换html响应,需要安装 mitmproxy 这个库:
pip install mitmproxy
这个库是 @渔滒 推荐的,在此感谢!
这个库需要配合代理,因此需要修改系统的代理,win系统打开 网络和Internet 设置 ,如下图设置代理:
注意,设置好后一定要点击保存按钮。
3. 编写脚本,替换响应
编写如下脚本,保存为 main.py :
import mitmproxy.http
print('脚本初始化成功')
def request(flow: mitmproxy.http.HTTPFlow):
pass
def response(flow: mitmproxy.http.HTTPFlow):
if '某数4代URL' == flow.request.url:
html = flow.response.text
print("ret=" in html)
html = html.replace("{ret=","{debugger;ret=")
flow.response.text = html
这里将 "{ret=" 替换成 "{debugger;ret=" 这里将关键位置进行插桩,便于快速定位,至于为什么是这里,请参考其他大佬的文章。
运行如下命令:
mitmdump -q -p 8888 -s main.py
打开目标网站和调试面板,清空所有cookie和其他的缓存,再次刷新,停到这里:
控制台输出 _$OF 的值 :
聪明的你,肯定发现了它就是VM里的代码,并且它是被eval的对象。注意它是字符串,并非代码,因此,复制后,还需要将其 console.log ,转换成代码再进行还原:
复制保存,并对其进行还原处理,复制还原后的代码,赋值给_$OF :
注意在第一行加入 debugger; 回车后再次F8运行,停在第一行的debugger位置:
全局搜索cookie,在下面这个位置打上断点:
再次F8运行,停在断点位置:
堆栈往上追,进入假cookie生成的地方:
再次F8运行,J继续停在断点位置:
堆栈往上追,进入真cookie生成的地方:
说明替换是可以走正确逻辑的。
4. 后记
遇到了两个小问题,记录一下。
需要将字符串转换成代码,使用console.log;
需要将还原后的代码转换成字符串,使用了 JSON.stringify,在此感谢 @Echowxsy,后来发现保存为文件后复制,还是会报错,于是干脆直接复制到剪切板,使用了 copy-paste 这个库,问题解决。
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
欢迎加入知识星球,学习更多AST和爬虫技巧。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/126900160
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)