我正在尝试在 IDA 和 OllyDbg 中加载一个 DLL,但它说该文件已被压缩。我检查了几个工具,发现文件是用 PECompact 压缩的。我认为它还启用了逆向工程保护,因为调试器无法加载它,但其他工具可以反汇编它。
所以,我的问题是如何解压 DLL 并开始调试?
我正在尝试在 IDA 和 OllyDbg 中加载一个 DLL,但它说该文件已被压缩。我检查了几个工具,发现文件是用 PECompact 压缩的。我认为它还启用了逆向工程保护,因为调试器无法加载它,但其他工具可以反汇编它。
所以,我的问题是如何解压 DLL 并开始调试?
存在用于 PECompact 的解包器。
试试unpecompact2,我觉得有两个版本。 http://www.woodmann.com/collaborative/tools/index.php/UnPECompact2_(MadMickael_version) http://www.woodmann.com/collaborative/tools/index.php/UnPECompact2_(smola_version)
如果这些不起作用,您可以尝试通用解包器,例如RL!dePacker、linxerUnpacker、Quick Unpack
因为在我下载了一些解包并对其进行测试之前,我从未使用过 PECompact。它看起来是一个非常容易解压的系统。
atom0s的脚本PeCompact 2.xx - 3.xx OEP Finder为我测试的每个解包正确找到了 OEP。请注意,您需要忽略一些异常(INT3 中断和内存访问冲突),但反调试将被DBH
ODBGScript 中的指令打败。
对于一些解包,我发现还存在一个简单的 API 重定向:对 KERNEL32 API 的每个引用都被重定向到几个指令,其中正确的值被加载到 EAX 中,然后是一条JMP EAX
指令(见图):
对于这种情况,我写了这个小脚本来解决重定向问题(您需要将硬编码值设置为第一个错误条目的地址):
var oep
var next
mov oep, eip
mov next, 00460974 // FIXME
FIX:
mov eip, [next]
sto
mov [next], eax
add next, 4
cmp [next], 0
jne FIX
mov eip, oep
ret
完成第二个脚本后,您可以转储文件并照常修复 IAT。
此外,您的帖子中不清楚您的问题是否是由于您正在处理 DLL 而不是 EXE 文件。如果是这样的话,你可以使用LOADDLL工具或修改PE头加载DLL为EXE(下面是一个例子,如何做到这一点的LordPE)。