SMC(动态代码加密)

一.介绍:

一种技术使得静态的代码被加密,阻碍静态分析,而一旦运行则会变为正常的代码。

这不就是壳吗?

不过在CTF中,一般只对局部加密,而且一般伴随着SMC出现的还有VirtualProtect
VirtualProtect 是 Windows 操作系统中的一个 API 函数,它允许应用程序改变一个内存页的保护属性。这个函数的原型如下:

BOOL VirtualProtect(
  LPCVOID lpAddress,  // 要改变保护属性的内存页的起始地址
  SIZE_T dwSize,      // 内存页的大小
  DWORD flNewProtect, // 新的保护属性
  PDWORD lpflOldProtect // 存储旧的保护属性
);

通过在程序运行时动态地修改代码的内存保护属性,使得代码在执行时可以被修改和执行,但在不执行时则不能被读取或修改

涉及到IDA可以要使用的快捷键有P,C,U

二.如何查看正常的代码?

以下都用[网鼎杯 2020 青龙组]jocker作为例子:

1.静态解密

这里面出现了VirtualProtect函数,大概可能出现了内存修改,题目有可能涉及到SMC或者Hook

直接去看 encrypt函数是打不开的:

但这道题直接把解密代码放主函数里了,可以直接使用IDApython解决,这样就不用动态调试了

import idc
addr = 0x401500  # encrypt函数的地址
for i in range(187):
    b = get_bytes(addr + i, 1)
    idc.patch_byte(addr + i, ord(b) ^ 0x41)

这样弄完了仍然是打不开,因为IDA并没有把解密的东西认作函数,需要手动去弄

直接去看汇编

可以发现调用了_Z7函数:

跳转过去,按P定义函数,再按F5反汇编就能直接看到加密函数了

2.动态解密:

将断点打到解密完后后的位置:

根之前一样,跳入Z7:

从新定义函数:

完成。

posted @ 2025-03-21 11:05  漫宿骄盛  阅读(39)  评论(0)    收藏  举报