const fs = require("fs");//文件读写
const parse = require("@babel/parser"); //解析为ast
const traverse = require('@babel/traverse').default;//遍历节点
const t = require('@babel/types');//类型
const generator = require('@babel/generator').default;//ast解析为代码
const code = `
const _0x34e16a = '3,4,0,5,1,2'['split'](',');
let _0x2eff02 = 0x0;
while (!![]) {
switch (_0x34e16a[_0x2eff02++]) {
case'0':
let _0x38cb15 = _0x4588f1 + _0x470e97;
continue;
case'1':
let _0x1e0e5e = _0x37b9f3[_0x50cee0(0x2e0, 0x2e8, 0x2e1, 0x2e4)];
continue;
case'2':
let _0x35d732 = [_0x388d4b(-0x134, -0x134, -0x139, -0x138)](_0x38cb15 >> _0x4588f1);
continue;
case'3':
let _0x4588f1 = 0x1;
continue;
case'4':
let _0x470e97 = 0x2;
continue;
case'5':
let _0x37b9f3 = 0x5 || _0x38cb15;
continue;
}
break;
}
`
// 默认为 script,当代码中含有 import 、export 等关键字时会报错,需要指定为 module
const ast = parse.parse(code, {
sourceType: "module"})
// 思路A---正向思维(先实现目标)
// 1.获取控制流原始数组,将 '3,4,0,5,1,2'['split'](',') 之类的语句转化成 ['3','4','0','5','1','2'] 之类的数组,
// 得到该数组之后,也可以选择把 split 语句对应的节点删除掉,因为最终代码里这条语句就没用了;
//
// 2.遍历第一步得到的控制流数组,依次取出每个值所对应的 case 节点;
// 3.定义一个数组,储存每个 case 节点 consequent 数组里面的内容,并删除 continue 语句对应的节点;
// 4.遍历完成后,将第三步的数组替换掉整个 while 节点,也就是 WhileStatement。
// 总结:获取到 While 语句节点,然后使用 path.getAllPrevSiblings() 方法获取其前面的所有兄弟节点,
// 遍历每个兄弟节点,找到与 switch() 里面数组的变量名相同的节点,然后再取节点的值进行后续处理
《封号码罗》python爬虫之AST在js逆向中switch-case反控制流平坦化(二十二)
最新推荐文章于 2025-10-07 08:57:29 发布
这篇博客介绍了如何利用AST(抽象语法树)来解析和转换JavaScript代码。具体展示了两种方法,通过遍历AST节点,将含有switch-case的代码转换为正确的执行顺序,同时删除不必要的赋值语句。涉及的技术包括@babel/parser、@babel/traverse、@babel/types和@babel/generator。

最低0.47元/天 解锁文章
878

被折叠的 条评论
为什么被折叠?



