https://github.com/mrexodia/dumpulator
Dumpulator模拟执行工具下载,该工具底层利用了Unicorn模拟执行实现。
安装步骤如下,直接pip是最简单的
下载官方给出的示例
https://github.com/mrexodia/dumpulator/releases/download/v0.0.1/StringEncryptionFun_x64.dmp
可以看到官方给出了一个非常简单的加解密代码
main.cpp
static char g_encrypted[256] = "x1Cx00x12x0ex0fx15x46x0fx15x46x07x08x46x03x08x05x14x1fx16x12x03x02x46x15x12x14x0fx08x01x66";
void decrypt(char* decrypted, const char* encrypted);
int main()
{
char decrypted[256];
decrypt(decrypted, g_encrypted);
puts(decrypted);
}
decryption.cpp
__declspec(noinline) void decrypt(char* decrypted, const char* encrypted)
{
auto size = *(unsigned short*)encrypted;
encrypted += 2;
for (unsigned short i = 0; i < size; i++)
*decrypted++ = *encrypted++ ^ 0x66;
}
我们使用模拟执行的目的也变得清晰:
1、使用工具获取程序运行时的内存dump文件
2、定位解密函数在dump中的地址
3、使用模拟执行工具Dumpulator直接调用,这一步需要知道调用该解密函数时需要传入的参数
4、执行模拟执行工具,直接获取解密字符串
1、获取dump文件
这个示例是一个带有解密功能的程序示例dump,获取它的方法也很简单,官方推荐使用minidump而且该工具在已经在最新版本的x64dbg中集成。打开x64dbg调试StringEncryptionFun.exe,让程序直接断在入口点
断在入口点后直接输入minidump
默认dump到x64调试器的同级目录下
2、确认解密函数地址,由于官方给的程序带有pdb,我们很轻松的定位了解密函数地址0x0000000140001000
3、确定传入参数
在0x0000000140001000下断点,查看寄存器rcx和rdx两个参数
我们从源码得知rcx是需要存放解密的数据地址需要我们自己分配,rdx是样本中被加密字符串的地址这个地址需要我们记住是0x0000000140017000
4、编写模拟执行脚本
将dump放在同级目录下
脚本如下
from dumpulator import Dumpulator
dp = Dumpulator("StringEncryptionFun_x64.dmp") #为dump创建模拟器
temp_addr = dp.allocate(256) #模拟分配解密数据要存放的地址
dp.call(0x140001000, [temp_addr, 0x140017000]) #模拟执行解密函数0x140001000,参数用[]传递
decrypted = dp.read_str(temp_addr) #解密输出
print(f"decrypted: '{decrypted}'")
点击执行,获取解密数据
其它相关课程
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
-
恶意软件与免杀对抗视频教程
-
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
ios逆向
-
windbg
-
还有很多免费教程(限学员)
-
-
更多详细内容添加作者微信
-
原文始发于微信公众号(安全狗的自我修养):Dumpulator模拟执行解密tip