// blog / 逆向笔记

SMC动态代码加密

SMC(Self-Modifying Code)

如何识别SMC?

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

比方说这题

  • VirtualProtect + PAGE_EXECUTE_*:修改代码段权限
  • 异或 0x66

解决办法

方法一,动态调试,u+c+p

以上题为例,

  1. 先静态跟进loc_4014D0 511 加密后的字节码是33开头,下方红色报错

  2. 开始动态调试 在return处下断点 运行后,跟进loc_4014D0 524 可以看到下方红色报错了,字节码==55==开头,55=push,是一个特征

这个时候我们在开始位置(55)按下“u”,重新定义函数 接着“c”,创建汇编代码 “p”生成函数

  1. 返回,可以看到smc被去除了 537

方法二,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")

以上题为例:

  1. 先到33字节码处,按“u”取消函数定义
  2. file -> script commond 313

466 run,下方输出框返回ok

  1. 回到刚刚代码开始的地址,看到字节码变为55了 443
  2. 按c,直接创建一个函数loc_4014F4 417
  3. 返回,加入这个函数,可以看到代码逻辑恢复了 498

// comments

评论

加载中…

正在读取评论…

// related

相关文章