【JavaScript 逆向】AST 反混淆

本文介绍了如何利用AST(A抽象语法树)对易盾混淆的代码进行解混淆,包括识别大数组、执行偏移、替换引用和大对象还原等步骤,涉及babel库的使用和eval函数。

本期目标网站为:

aHR0cHMlM0EvL2R1bi4xNjMuY29tL3RyaWFsL2ppZ3Nhdw==

市面上有许多好用的解混淆的工具,如v神的插件、蔡老板的一键还原等,效果都非常不错。

本文是对易盾加密代码的简单解混淆,主要是对 AST 进行一个初步的学习与了解。

AST 解混淆需要使用到 babel 库,关于babel库的使用可以看官方文档。这里不介绍库的用法,只对解混淆思路做一个简单分析。本案例代码在最下方。

大数组还原

对于易盾这类混淆来说,基本特征都是一样的。在开头或某个地方定义一个大数组,用于存储变量的值,然后定义一个方法,根据传入的参数来从大数组中取值。稍微复杂一点就如易盾一样,还会通过一个自执行函数来对数组进行偏移。所以如果我们需要将大数组进行还原,需要先要对大数组进行偏移,然后通过eval将所有引用了大数组的地方的值计算出来。

本案例中:

大数组变量名为:_0x5ea4

取值方法名为:_0x4139

取大数组取值方法名
//大数组取值方法名
const largeArray = ast1.program.body[0].declarations[0].id.name
// _0x4139
执行偏移代码

得到大数组变量名后再取大数组与偏移代码,观察代码结构,可以发现我们需要的为 body 下的 VariableDeclaration、FunctionDeclaration 与 ExpressionStatement下的第一个 CallExpression。

VariableDeclaration :大数组

FunctionDeclaration :大数组取值方法

CallExpression:大数组偏移代码

拿到这三个结构后我们就可以执行了,这里我们可以直接删除掉 AssignmentExpression 结构,剩余的就是我们要执行的结构。

在这里插入图片描述

traverse(ast, {
   
   
    enter(path) {
   
   
        if (path.node.type === 'AssignmentExpression' && path.node.left.type === 'MemberExpression') {
   
   
            path.remove()
        }
    }
})

offsetCode = generator(ast, {
   
   compact: true}).code
eval(offsetCode)
console.log(_0x4139(0xb34))
// toString

为了防止误删其他代码,这里多做了一层判断。为了验证代码是否正确执行,可以调用一下大数组取值方法,看看是否能够正确输出结果。(_0x4139 是本案例代码中大数组取值的方法名)

替换

能够正确执行偏移代码后,就可以将所有引用大数组的代码替换成真实的值了。如

    var _0x530fea = _0x4139
      , _0x1bbc44 = {
   
   }[_0x530fea(0xb34)]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BuerCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值