我有一个现有的 Win32 .exe,一开始有一个 PE 存根,我有另一个 PE 存根存储在一个单独的文件中。这个单独的 PE stub 长于 20 KiB,原始 PE stub 最多为 512 字节。我没有源代码,所以我无法重新编译或重新链接。如何替换 Win32 .exe 中的 PE 存根?
可能我需要一个工具来更新节文件偏移量。但这还不够:根据 的输出差异objdump -x file.exe
,这些还必须更新:AddressOfEntryPoint、BaseOfCode、BaseOfData、SizeOfImage、SizeOfHeaders、数据目录中的偏移量、重定位修正中的地址。
TL:DR使用pe-setstub 中的 Perl 脚本替换 PE .exe 中的 DOS 存根。
带有大存根(甚至大于 100 000 字节)的 Win32 PE .exe 文件可以在各种 Windows 版本上运行,但有一个要求:每个部分的 VirtualAddress 不得小于标头大小(包括存根、PE头和 PE 节表)。因此,如果程序用更大的存根替换存根,则该程序还必须增加每个部分的虚拟地址。这听起来像是一个非常复杂的操作,因此不太可能有一些现成的工具。
仅供参考 在 Win32s 上,还有一个额外要求:PE 标头(以最后一个节标头的最后一个字节结尾)必须适合 0x800(2048)个字节。
即使有这些要求,也可以添加一个长存根,而无需触及部分的 VirtualAddress 或 ImageBase。PE .exe 看起来像这样:
MZ
。偏移量 8 处的头字段指向 DOS 存根代码 (#3)。PE
,以最后一个段头结束。我已经在pe-setstub 中实现了这样的存根替换和拆分作为 Perl 脚本。
它之所以有效,是因为 #3 的大小没有(小)上限。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句