JavaScript 混淆 控制流平坦化

Code & Dev
JavaScript

变量名还原

控制流平坦化

控制流平坦化(Control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程:

其实简单来说,就是将所有的嵌套的条件判断转换成一个不断循环的while。

我们会用 @babel/parser来解析AST, @babel/traverse去遍历和修改AST。同时,还有 @babel/generator, @babel/types

我们可以用 astexplorer.net 在线地去解析JavaScript的AST,可以选择不同的JavaScript编译器。

例如要将下面的代码进行平坦化:

function a(){
    function b(){
        var bank = 234;
        count = "Have Fun!";
        for(var i=0;i<10;i++){
            if(i%2==0){
                console.log(count);
            }
            else{
                continue;
            }
        }
    }
    var count = 100;
    b();
}
var glob = 100;
a();

查看

ast explorer

我使用的是

const parser = require('@babel/parser');
const traverse = require('@babel/traverse).default;

const code = `
  const hello = 'world';
  console.log(hello);
`;

const ast = parser.parse(code);
traverse();

https://www.reveone.cn/article/99827d5d-4d4f-4a52-ae43-92e543ce46b3 https://bbs.kanxue.com/thread-266082.htm