IDA学习笔记-代码混淆和软件保护方法
Posted 千夫长-向往生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDA学习笔记-代码混淆和软件保护方法相关的知识,希望对你有一定的参考价值。
目录
本文记录三种代码混淆方法,防止程序被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.加壳
- 壳的定义:
在一个程序的外面再包裹上另外一段代码,保护里面的程序不被非法修改或反编译。
- 壳的加载过程:
- 保存现场
- 获得壳自己需要的API地址
- 解密或解压源程序
- IAT的初始化;
- 重定位;
- Hook-API;
- 跳转到OEP(原始入口点);
壳的分类:
压缩壳:UPX加壳,ASPack
加密壳:ASProtect俄国人开发,Armodilo穿山甲,Themida西班牙,VMProtect(纯虚拟机保护软件),其中VMProtect会修改目标地址,让部门指令在它创建的虚拟机里运行,跟原系统的汇编指令都不一样,所以还原难度非常非常大,可直接放弃。
总结
了解常见的代码混淆和程序保护方法,原理和分类,可以进一步识别反编译的难度,确定逆向工程的边界和难度。
以上是关于IDA学习笔记-代码混淆和软件保护方法的主要内容,如果未能解决你的问题,请参考以下文章
《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码