李恒道 发表于 2022-10-19 23:57:56

JS混淆分析实战超星video.js加密

# 郑重声明
此处超星指代的是本人独立开发的自主单机游戏-》超级星星V0.1版
并非通俗意义的超星!请勿进行过度联想
本文全程为自攻自破
如有雷同纯属巧合
# 预览

![图片.png](data/attachment/forum/202210/19/230619s4h7hghjtp6odcj6.png)
# 开始
通过观察代码以及动态运行可以发现_0xdd65b4是解密函数
![图片.png](data/attachment/forum/202210/19/230801aifz65568k7z71d6.png)
点进去直接下个断
![图片.png](data/attachment/forum/202210/19/230847tsrs49i2sjspnpqn.png)
然后字符串化一下拷贝出去字符数组
![图片.png](data/attachment/forum/202210/19/230857fsi4ydssmregd9md.png)
在nodejs里写出来解密函数,并且parse一下拷贝的字符串
![图片.png](data/attachment/forum/202210/19/230920n26gdd7a9cce62cl.png)
观察代码发现是一个CallExpression节点
![图片.png](data/attachment/forum/202210/19/230955grrrxv6mxvr803bv.png)
然后我们直接写一下代码
```javascript
traverse(ast, {
CallExpression(path) {
    if (path.node.callee.name === "_0xdd65b4") {
      let loc = path.node.arguments.value;
      let str_node = types.stringLiteral(crp_str(loc));
      path.replaceInline(str_node);
    }
},
});
```
可以发现已经解开一大堆字符串了
![图片.png](data/attachment/forum/202210/19/231353z22c4ii5co2fog2o.png)
然后搜索一下,发现还有很多加密的函数调用
原来是在函数头上做了一下赋值,然后由函数的引用来做加密
![图片.png](data/attachment/forum/202210/19/231507cpepspwaixizn7cy.png)
我们丢到Ast看一下,可以发现是一个VariableDeclarator对象
id是赋值的名字,init是加密的字符串,那我们继续写VariableDeclarator的AST解析吧
![图片.png](data/attachment/forum/202210/19/231553s0uumpzsqu33m2q3.png)
但是根据测试发现一个比较头疼的问题
他对函数进行了多次赋值,所以我们必须写一个递归遍历的东西
![图片.png](data/attachment/forum/202210/19/233624thhc11wc5jnhccny.png)
直接上代码
```javascript
function find_and_fuck_crp(path, func_name) {
let bind = path.scope.getBinding(func_name);
let refer_list = bind.referencePaths;
refer_list.forEach((item) => {
    let parent_path = item.parentPath;
    if (parent_path.node.type === "CallExpression") {
      let loc = parent_path.node.arguments.value;
      let str_node = types.stringLiteral(crp_str(loc));
      parent_path.replaceInline(str_node);
    } else {
      if (parent_path.node.type === "VariableDeclarator") {
      find_and_fuck_crp(parent_path, parent_path.node.id.name);
      }
    }
});
path.remove()
}
traverse(ast, {
VariableDeclarator(path) {
    let func_name = path.node.id.name;
    let init_name = path.node.init?.name;
    if (init_name === "_0xdd65b4") {
      find_and_fuck_crp(path, func_name);
    }
},
});
```
经过递归遍历我们已经具备了一定的可读性了
![图片.png](data/attachment/forum/202210/19/234318j0c0fn14k4cbfff4.png)
然后发现还有一个加密的函数引用a0_0x1f3a,直接还按刚才的方法
![图片.png](data/attachment/forum/202210/19/234454cui9ihsamasp3lfp.png)
处理之后删除加密的函数
再看一下,可以发现已经有了初步的样子
![图片.png](data/attachment/forum/202210/19/235114mxeb6pw9oqvr4pq6.png)
但是部分字符串里还有混淆
![图片.png](data/attachment/forum/202210/19/235338yro7j3j7vl9oes90.png)
配置一下generator函数
```
let code = generator(ast, {
minified: true,
jsescOption: { minimal: true },
}).code;
```
到这里已经具备基本的调试条件了
剩下的大家也可以根据这个思路进行微妙
# 结语
撒花~

懒男孩 发表于 2022-10-20 08:54:02

哥哥是懂巧合的

dalao8888 发表于 2022-10-20 09:00:58

被超星骗过来的不止我一个人吧

mideng 发表于 2022-10-20 09:30:09

为什么不叫超级明星??super idol

maxzhang 发表于 2022-10-20 10:04:37

哥哥真刑啊

ljh2001 发表于 2022-10-20 17:59:03

ggnb!!!

大药科技 发表于 2022-11-15 10:15:33

ggnb!   YYDS{:4_93:}

doup 发表于 2022-11-22 11:27:54


ggnb{:4_94:}

大药科技 发表于 2022-12-22 09:50:57

ggnb啊{:4_86:}
页: [1]
查看完整版本: JS混淆分析实战超星video.js加密