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:
从新定义函数:
完成。
本文来自博客园,作者:漫宿骄盛,转载请注明原文链接:https://www.cnblogs.com/msjs/p/18784758
都是顺手发的,写的时候可能有错误,如果发现了,望各位指出。