认识代码混淆及常见方法原理

混淆目的

将程序代码,转换成功能不变,但难以阅读或理解的形式。

方法及应用

  1. 字符串加密:对应用程序中使用到的字符串进行 加密,防止通过IDA等工具获取关键词定位核心业务代码;如Ollvm就提供对字符串加密的api。
  2. 类名、方法名混淆:将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度;如开源项目 ProGuard,能够对Java字节码进行混淆、缩减体积、优化等处理。其中混淆环节就是使用a、b、c、d这样简短无意义的名称,对类、字段和方法进行重命名 。
  3. 程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。如Ollvm主要就是通过指令替换,混淆控制流,控制流平坦化实现对C++程序结构的混淆。
      1. 指令替换:随机选择一种功能上等效但更复杂的指令序列替换标准二元运算符;适用范围:加法操作、减法操作、布尔操作(与或非操作)且只能为整数类型。

      2. 混淆控制流:常增加大量if语句来混淆原本的控制流。

      3. 控制流平坦化:通过一个主分发器来控制程序基本块的执行流程,像是一个循环嵌套一个大块的switch语句。如图:

处理后:
处理后可以看到,原本各基本块之间清晰的关系变得不再清晰,需要搞清楚主分发器才能继续分析。(模糊了switch中case代码块之间的关系,从而增加分析难度)
具体如图:
 
 
 

JS代码

除了ProGuard可处理的Java和Ollvm可处理的C++代码,JS代码也可以通过混淆保护,主要是字符串加密、混淆、去log、变量名处理、压缩、函数名处理、平台识别、防篡改等。
编写一个hello world
 
function myFunction()
{
    alert("Hello World!");
}
选择高度混淆后的部分加密结果:
 

参考:

 
原文地址:https://www.cnblogs.com/Archimedes/p/15368244.html