IDA学习笔记-代码混淆和软件保护方法

Posted 千夫长-向往生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDA学习笔记-代码混淆和软件保护方法相关的知识,希望对你有一定的参考价值。

目录

一.花指令

1.什么是花指令

2.开发者添加花指令的目的

3.常见形式

4.应对策略

二、OLLVM代码混淆工具

1.什么是OLLVM

2.混淆的方法

3.什么是LLVM

三、其他干扰手段

1.动态计算地址

2.加壳


本文记录三种代码混淆方法,防止程序被IDA反编译。

一.花指令

1.什么是花指令

添加到程序中的无用指令或垃圾指令;

 

2.开发者添加花指令的目的

干扰反汇编静态分析,混淆IDA等分析工具对程序进行反汇编。

3.常见形式

1.push pop push pox  ADD SUB这样搞来搞去;

push edx
pop edx
dec ecx
add ESP,1
sub ESP,1

2.

jmp Lable1
db opcode
Label1:

3.

jz label
jnz label
db opcode
Lablel:

4.CALL指令之后没有POP,是异常的,所以是花指令搞的破坏,在call之后,按下U键,在这个位置点击按下U,使得这一行变成数据而非汇编指令。下一行在按C,变回指令代码区解析。

Jmp跳转到一个单数地址(不存在的地址),也有可能是一个花指令,按照之前的U,C的方法来让IDA识别数据而非编译为程序代码。

添加方法:在绝对跳转和下一条真正代码之间,插入各种混乱的无意义的数据,使得反编译器顺序解释被搞乱。

4.应对策略

使用按键U,告诉IDA,这是一个数据(通常是一个字节就够了),然后在下一个位置,点击C告诉IDA又可以开始按照代码来解释,如果花指令添加得很多,那就要用脚本来处理了。

二、OLLVM代码混淆工具

1.什么是OLLVM

是瑞士西北应用科技大学安全实验室于2010年6月发起的针对LLVM代码混淆工具。

2.混淆的方法

  • 控制流平展模式-CFF模式

                增加更多的分支,增加破解梳理的难度;

  • 指令替换模式-IS

                将正常的运算操作更改为等价但表述更加复杂的形式

  • 控制流伪造模式-BCF

                加入新的不同的代码块,使得流程跳转变得更加复杂,经过很多的条件判断,才去到原来正常的流程。

3.什么是LLVM

        用于代码编译和优化的平台;

三、其他干扰手段

1.动态计算地址

出入栈时,使用寄存器增加常量值,来做为函数返回地址,这样就很难判断程序下一步的走向。

2.加壳

  • 壳的定义:

                在一个程序的外面再包裹上另外一段代码,保护里面的程序不被非法修改或反编译。

  • 壳的加载过程:
  1. 保存现场
  2. 获得壳自己需要的API地址
  3. 解密或解压源程序
  4. IAT的初始化;
  5. 重定位;
  6. Hook-API;
  7. 跳转到OEP(原始入口点);

壳的分类:

压缩壳:UPX加壳,ASPack

加密壳:ASProtect俄国人开发,Armodilo穿山甲,Themida西班牙,VMProtect(纯虚拟机保护软件),其中VMProtect会修改目标地址,让部门指令在它创建的虚拟机里运行,跟原系统的汇编指令都不一样,所以还原难度非常非常大,可直接放弃。

总结

        了解常见的代码混淆和程序保护方法,原理和分类,可以进一步识别反编译的难度,确定逆向工程的边界和难度。

以上是关于IDA学习笔记-代码混淆和软件保护方法的主要内容,如果未能解决你的问题,请参考以下文章

IDA逆向笔记-使用脚本代码获取exe里的所有函数信息

IDA反汇编学习

《Java 解惑》学习笔记

《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码

《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码

《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码