控制流平坦化是一种 JavaScript 代码混同技术,其目标是减少代码的复杂度以避免恶意代码剖析和反编译。
该技术通过从新组织代码中的控制流语句(如 if、for、while 语句等)来减少代码的复杂性。具体而言,它会将这些语句拆分成多个小的、互相嵌套的语句,使得代码中的控制流门路更加简单、难以了解。
以下是一个简略的控制流平坦化示例代码:
function foo(x, y) {
var a = x + y;
if (a > 10) {while (a < 100) {
a += x;
if (a < 50) {a -= y;} else {a += y;}
}
} else {for (var i = 0; i < a; i++) {if (i % 2 == 0) {a += x;} else {a -= y;}
}
}
return a;
}
foo(3, 4);
通过控制流平坦化解决后,上述代码的构造将变得更加简单和难以了解,如下所示:
function foo(x, y) {
var a = x + y;
if (a > 10) {if (a < 100) {while (true) {if (a < 50) {
a -= y;
continue;
}
a += y;
continue;
}
} else {while (true) {if (a < 50) {
a -= y;
continue;
}
a += y;
continue;
}
}
} else {for (var i = 0; i < a; i++) {if (i % 2 == 0) {
a += x;
continue;
}
a -= y;
continue;
}
}
return a;
}
foo(3, 4);
通过上述解决,代码中的控制流语句被拆分成了多个小的语句块,并应用了一些有限循环和 continue 语句来减少代码复杂性。这样解决后的代码更加难以了解和剖析,从而减少了代码的安全性。在这个例子中,本来的 if/else 分支语句和 while 循环被替换成了一系列的 goto 语句。这种扭转使得代码的执行流程变得更加简单和难以了解,减少了代码的混同水平,从而进步了程序的安全性。
值得注意的是,控制流平坦化并不会改变程序的行为,它只是扭转了程序的构造和执行流程。
以上是一个简略的例子,理论应用控制流平坦化技术时,可能会应用更加简单的算法和变换形式来混同代码。
jsjiami.com
如果您对文章内容有不同认识, 或者疑难,欢送到评论区留言,或者私信我都能够。
也能够到上方网站,底部有我联系方式详谈
如遇本人源码加密后没备份,能够找咱们解决解出复原源码,任何加密都能够。