SMC(Self-Modifying Code)
如何识别SMC?
- 伪代码常见模式,不明异或
// 典型的SMC解密循环,与一个数异或
void init() {
for (int i = 0; i < 0x100; i++) {
*(code_start + i) ^= key[i % keylen];
}
}
- 不明调用函数
- 修改代码段权限:
VirtualProtect+PAGE_EXECUTE_* - 在
.rodata或.data段中发现高熵值的字节序列(看起来像加密数据) - 调试器检测
比方说这题

VirtualProtect+PAGE_EXECUTE_*:修改代码段权限- 异或 0x66
解决办法
方法一,动态调试,u+c+p
以上题为例,
-
先静态跟进loc_4014D0
加密后的字节码是33开头,下方红色报错 -
开始动态调试 在return处下断点 运行后,跟进loc_4014D0
可以看到下方红色报错了,字节码==55==开头,55=push,是一个特征
这个时候我们在开始位置(55)按下“u”,重新定义函数 接着“c”,创建汇编代码 “p”生成函数
- 返回,可以看到smc被去除了

方法二,python自动化处理
exp:
import idc addr=0x004014D0 #替换为 实际的地址
size=122 #替换为 实际加密片段的大小
for i in range(addr, addr+size):
idc.patch_byte(i, get_wide_byte(i)^0x66) #秘钥 0x66 根据实际情况替换
print("ok")
以上题为例:
- 先到33字节码处,按“u”取消函数定义
- file -> script commond

run,下方输出框返回ok
- 回到刚刚代码开始的地址,看到字节码变为55了

- 按c,直接创建一个函数loc_4014F4

- 返回,加入这个函数,可以看到代码逻辑恢复了

// comments
评论
正在读取评论…