我正在反转一个恶意的32位x86 Windows可执行文件。在Ghidra中静态查看PE标头时,我看到ImageBase设置为预期的0x400000。但是,将二进制文件加载到内存中时,初始RVA与文件中定义的ImageBase不匹配。例如,我看到了内存中的基址设置为0x4B00000x900000。在干净的VM上以及在使用Immunity和x32dbg以及IDA Free进行调试时,会发生此行为。因为系统代码可以处理加载,并且我的系统在首次执行时是干净的,所以我认为异常的ImageBase是加载程序细微差别的征兆,而不是篡改。我从没遇到过这种情况,希望对您有任何见解。内存映射的PE标头中的ImageBase1f63d04ee95ea041f2f6b1e818d94a7c)与静态文件中设置的823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1不匹配:


评论

如果您的系统启用了aslr(任何> xp),则这是一项安全功能,Windows loader会在每次运行时随机分配地址空间布局

感谢您将ASLR引起我的注意@blabb。我会记住该功能。在全新的Windows 10 VM上禁用ASLR并重新启动后,将二进制文件加载到各种调试器时,我仍然看到非0x400000的ImageBase。我在这里注意到这一点仅仅是为了排除ASLR作为这种特殊情况下RVA随机化的原因。

#1 楼

这只是一个首选地址。 Windows可以在几乎任何地址处加载二进制文件,并将其重新设置到这个新位置。必须是64 K的倍数。DLL的默认值为0x10000000。 Windows CE EXE的默认值为0x00010000。 Windows NT,Windows 2000,Windows XP,Windows 95,Windows 98和Windows Me的默认值为0x00400000。

来源:MSDN

评论


...只要提供搬迁信息😁

– 0xC0000022L♦
8月17日11:27