
SMC自修改代码
自修改代码(Self-Modifying Code,SMC)指程序在运行过程中修改即将执行的代码。常见做法是把关键逻辑以加密形式保存在可执行文件或资源区中,运行时再动态解密、执行,执行后也可能再次加密,借此增加静态分析难度。
从逆向视角看,SMC 的核心特征通常包括:
- 程序会修改代码段权限,例如调用
VirtualProtect。 - 某段代码在静态视图中像乱码或无意义指令。
- 调试运行到特定位置后,原本异常的代码会被还原成可执行逻辑。
- 有些样本会在执行后重新加密,防止直接 dump。
一段展示 SMC 思路的伪代码:
1 | if(运行条件满足){ |
以下打造一个使用SMC进行静态分析对抗的示例,首先正常写一个程序:
1 |
|
然后我们想把check这个函数保护起来,先把其机器码摘出来进行加密:
1 |
|
另一种常见的实现方法是通过新增一个具备RWX属性的程序段,将需要保护的代码书写在其中,这样就可以避免调用 virtualAl1oc/virtualProtect/mprotect 这类API来暴露SMC 的意图。
对抗思路:
能动态调试最好直接动态调试,因为在程序运行的某一时刻,它一定是解密完成的,这时也就暴露了,使用动态分析运行到这一时刻即可过掉保护。
其次是根据静态分析获得解密算法,写出解密脚本提前解密这段代码。
解密得到的机器码可以通过IDAPython的patch_byte接口很方便地写回。
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自OVERTHINKER
评论 ()



