JS逆向:AST还原极验混淆JS实战

本文介绍了如何使用AST(抽象语法树)对混淆的JS代码进行还原,帮助爬虫开发者理解混淆代码。通过遍历AST中的CallExpression节点,找到并替换特定函数调用,从而实现代码的还原。同时,文章提到了处理Unicode编码和控制流平坦化代码的方法,以提高代码可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文仅供学习交流使用,请勿用于商业用途或不正当行为

如果侵犯到贵公司的隐私或权益,请联系我立即删除

AST是抽象语法树,名字感觉很高级,其实也不用怕,可以简单理解为是将JS代码归类后的JSON,并且提供了很多方法给你对这个JSON进行增删改查。

学习一个新东西,首先一定要搞清楚它有什么用,都不知道有啥用,学习它干啥,对吧

作为一个爬虫攻城狮,JS逆向也是家常便饭了,JS逆向经常会遇到各种混淆过后的代码,极其难以阅读,这时候就可以使用AST对这些混淆代码进行一定的还原处理,得到一个相对容易阅读的JS代码,方便我们进行JS分析。

阅读本文需要有一点AST的基础,不要害怕,只需要稍微学习一点AST知识就行了,并不需要掌握AST的全部知识才能看得懂,不过最起码要对AST定位节点有一点认识,关于AST的学习大家肯定找蔡老板啊

相信只要能认真阅读完本文内容,理解其中的概念,就能对AST还原混淆代码有一点点感觉了,并会发现AST其实也不是那么难。

本次反混淆的是下面这个文件

https://static.geetest.com/static/js/fullpage.8.9.5.js复制代码

保存到本地,收缩一下代码看看整体结构

img

简单看下这几个function

img

img

img

img

img

img

嗯, 啥也看不懂…

别慌,静下心来,一点一点分析,一点一点解决!

观察代码发现里有很多地方调用了AJgjJ.DAi,搜索出515个匹配结果,如下图

img

在匹配结果中有两类调用,如上图红框标示的

第一个:带括号的AJgjJ.DAi(79); 暂时不知道是在干啥;

第二个,不带括号的AJgjJ.DAi,可以理解为

mZtVWz = ['qhicV'].concat(AJgjJ.DAi)复制代码

concat()是合并数组的作用

img

也就是说AJgjJ.DAi应该是一个数组

img

控制台打印看看

<think>好的,我现在需要帮助用户解决关于JS逆向没有思路的问题。首先,用户可能遇到了逆向JavaScript代码时的困难,不知道如何下手。我需要回忆常见的JS逆向方法和步骤,然后组织成一个结构清晰的回答,帮助用户逐步解决问题。 首先,我应该从基础开始,确认用户是否了解JS逆向的基本概念。然后,考虑常见的逆向场景,比如加密参数、混淆代码、反调试机制等。接下来,分步骤介绍应对方法,比如如何定位关键代码、处理混淆、调试技巧等。同时,需要提到常用的工具,比如浏览器开发者工具、AST解析、Hook技术等,可能还要举例说明具体操作。 还要注意用户可能缺乏经,所以需要将步骤分解得详细一些,并强调实践的重要性。此外,可能需要提醒常见的陷阱和注意事项,比如动态加载、环境检测等。最后,给出学习资源和进一步建议,帮助用户提升技能。 需要确保回答符合系统级指令,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但根据当前问题,可能数学公式较少,但如果有涉及算法的地方要正确应用。不过这个问题可能更多是技术步骤,数学内容可能不多,但要注意可能的加密算法中的公式,比如RSA的$n=p*q$之类的,如果有的话要正确使用格式。 现在需要检查是否有遗漏的步骤,是否覆盖了主要难点,比如反调试、混淆处理、AST还原、Hook方法等。同时,结构要清晰,分点说明,让用户能一步步跟着思路走。可能还需要加入实际案例,比如如何追踪加密参数生成过程,如何通过断点调试找到关键函数。 最后,确保语言通俗易懂,避免过于专业的术语,或者如果使用术语要简要解释。这样用户即使基础较弱也能理解大致方向,再通过提供的资源深入学习。</think>以下是针对JS逆向缺乏思路时的分步解决指南,结合实际场景和工具使用: $$逆向问题 = 理解逻辑 + 突破防御 + 还原算法$$ 一、定位关键代码(60%问题在此阶段解决) 1. 网络请求溯源 - 使用Chrome开发者工具的Network面板 - 筛选XHR/Fetch请求,定位目标加密参数(如`token`、`sign`) - 右键请求选择`Copy as Node.js fetch`获取完整调用栈 2. 断点调试技巧 ```javascript // 在可疑参数生成位置插入调试语句 console.trace("参数生成位置:", window._key); debugger; // 强制触发断点 ``` 二、突破常见防御机制 1. 反调试处理 - 禁用无限debugger循环: ```javascript // 在Console提前注入 window._originalDebugger = Function.prototype.constructor; Function.prototype.constructor = function() {   if (!arguments[0].includes('debugger')) {     return new window._originalDebugger(...arguments);   } }; ``` 2. 环境检测绕过 - 补全常见检测点: ```javascript Object.defineProperty(navigator, 'webdriver', {get: () => false}); window.chrome = {runtime: {}}; ``` 三、代码混淆处理(AST级解决方案) 1. 使用Babel工具链 ```bash npm install @babel/core @babel/traverse ``` 2. 典型还原步骤: - 常量折叠:$x = 0x2f3 ^ 0x44d; \rightarrow x = 752$ - 控制流平坦化:识别真实执行路径 - 字符串解密:还原`_0x12ab('0x1a')`类调用 四、算法还原模式识别 1. 常见加密特征识别 | 加密类型 | 关键特征                   | 识别方法                 | |----------|---------------------------|--------------------------| | AES     | `mode/padding`参数       | 搜索`CryptoJS.AES`       | | RSA     | `setPublicKey`调用       | 查找`new JSEncrypt()`   | | MD5     | `0x67452301`魔数         | 特征常量搜索             | 五、实战案例:某电商sign参数逆向 1. 抓包发现请求携带`sign: "a3d8f1..."` 2. 全局搜索`sign:`定位到加密函数 3. 下断点后发现执行流程: $$sign = md5(JSON.stringify(params) + timestamp + "salt_key")$$ 4. 通过Hook证: ```javascript let _oldMD5 = window.md5; window.md5 = function(str) {   console.log("MD5输入:", str);   return _oldMD5(str); } ``` 六、工具链推荐 1. 动态调试:Chrome DevTools + Fiddler 2. 静态分析:AST Explorer(https://astexplorer.net) 3. 自动化:Puppeteer + Mitmproxy 4. 逆向框架:Crypto-Anguish(密码学特征识别) 七、学习路径建议 1. 基础阶段(2周): - 掌握JavaScript原型链与作用域 - 熟练使用浏览器调试工具 2. 进阶阶段(1个月): - 学习WebAssembly逆向基础 - 掌握AST语法树操作 3. 实战阶段(持续): - 定期分析主流网站(如某宝、某东) - 关注Web安全会议(如HITCON) 遇到具体案例卡顿时,可采用「行为特征分析法」:通过输入输出变化推测算法类型,例如: - 输出长度固定 → 可能为哈希算法 - 输入相同输出不同 → 存在随机salt - 时间相关 → 结合timestamp证 建议从简单案例入手(如某天气网站加密),逐步过渡到复杂场景,保持每周分析3-5个案例的频率积累经
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值