ast反混淆进阶--自执行实参替换形参

本文介绍了一种JavaScript代码混淆优化技术,即自执行函数中实参替换形参的方法。优化包括形参与实参的置空逻辑改进和实参替换形参的全面匹配,以确保上下文安全。代码示例展示了如何使用AST遍历和转换实现这一过程。该技术有助于提升代码的安全性和可读性。
摘要由CSDN通过智能技术生成
实现目的:自执行实参替换形参
处理前:
	(function(_0xb28de8) {
	    _0xb28de8.bbb = ccc;
	}(window))
处理后:
	(function() {
	    window.bbb = ccc;
	}())
demo.js

function s() {
    let arr = [1, 2, 3, 4, 5, 6, 7, 8];
    return arr;
}

(function (_0xb28de8, _0xb28de9,_0xb28de10) {
    if(!_0xb28de10)_0xb28de10=10;
    function aa() {
        return _0xb28de8()[_0xb28de9];
    }
    let kk=_0xb28de8().length;
    console.log(aa(),kk,_0xb28de10);
})(s, 5);
dec_main.js

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解析为代码


//读取js文件
const jscode = fs.readFileSync(
    './demo.js', {
        encoding: 'utf-8'
    }
);
let ast = parse.parse(jscode);//js转ast
function convParam(path) {
    // 自执行函数实参替换形参
    var node = path.node;
    if (!t.isCallExpression(node.expression))//回调表达式判断
        return;
    //实参未定义|形参未定义|实参数大于形参数
    if (node.expression.arguments == undefined || node.expression.callee.params == undefined || node.expression.arguments.length > node.expression.callee.params.length)
        return;
    var argumentList = node.expression.arguments;//实参列表
    var paramList = node.expression.callee.params;//形参列表

    for (var i = 0; i < argumentList.length; i++) {//遍历实参
        var paramName = paramList[i].name;//形参
        let argumentName = generator(argumentList[i]).code//实参
        path.traverse({
            Identifier: function (_path) {
                if(_path.node.name.length!=paramName.length)return;//长度不等
                if (_path.node.name!==paramName)return;//名称不等
                _path.node.name=argumentName;//更改形参为实参名称
            }
        });
    }
     node.expression.arguments = [];//实参列表置空
     node.expression.callee.params = paramList.slice(argumentList.length,);//形参列表设置

}
traverse(ast, {ExpressionStatement: convParam,});           // 自执行实参替换形参

let {code} = generator(ast,opts = {jsescOption:{"minimal":true}})
//文件保存
fs.writeFile('./demoNew.js', code, (err) => {
});

function s() {
  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
  return arr;
}

(function (_0xb28de10) {
  if (!_0xb28de10) _0xb28de10 = 10;

  function aa() {
    return s()[5];
  }

  let kk = s().length;
  console.log(aa(), kk, _0xb28de10);
})();
优化及说明:
一、优化形参与实参的置空逻辑
	原来:实参列表与形参列表均置空
	现在:若实参数小于形参数,则实参数置空,形参保留多出的
二、实参替换形参逻辑修改
	原来:只匹配满足条件的成员表达式,进行实参替换形参,存在死角
	现在:标识符匹配,无死角实参替换形参
三、尽可能维护上下文,不修改执行逻辑依赖的变量,更安全
------------------------------------------------------------
特别说明及感谢:
此处核心源码来自于作者:丁仔
参考ob解混淆源码
https://github.com/DingZaiHub/ob-decrypt
----------------------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jia666666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值