简介
自修改代码(Self-Modified Code)是一类特殊的代码加密技术,即在运行时修改自身代码或数据,从而使得程序实际行为与反汇编结果不符,同时修改前的代码段数据也可能非合法指令,从而无法被反汇编器识别,这加大了软件逆向工程的难度
基本原理:是在编译可执行文件时,将需要加密的代码区段(如函数、代码块) 单独编译成一个section(段),并将其标记为可读,可写,不可执行,然后通过某种方法在程序运行的时候将section解密为可执行代码,并将其标记为可读、可执行、不可写,这样就不能直接在内存里面找到加密的代码,从而无法执行或修改加密的代码
SMC的实现方式有很多种,可以通过修改PE文件的Section Header、使用API Hook实现代码加密和解密、使用VMProtect等第三方加密工具等
SMC两种破解方式,第一种是根据静态分析结果直接修改程序二进制文件,第二种则是在动态调试时将解密后的程序从内存中 dump 下来
编写SMC程序
一般smc程序的执行流程(假设关键函数为func)
- main函数中获取func函数的地址
- 取消func函数处的页面保护
- 对func进行解密操作之后再调用func
为了编写smc程序,我们需要进行如下操作
- 先写好func函数和main函数中的解密代码(此时不能真正解密,还需要矫正)
- 编译后用ida打开exe程序,找到func地址及大小,从而修正主函数的参数
- 用ida对func函数进行patch,保存patch后的程序
|
|
如果直接运行该程序肯定会出错,因为此时相当于对func函数加密而非解密,所以需要用ida进行patch,idapython脚本进行patch
|
|
记得保存patch后的程序,再用ida打开patch后的程序,在解密func函数可用脚本解密或下断点动调观察
测试patch后的程序
解密前的func函数,无法正常识别
解密后的func,ida重新识别可反编译