windows - 替换现有 Win32 .exe 中的 PE stub

标签 windows stub portable-executable

我有一个现有的 Win32 .exe,开头有一个 PE stub ,并且我还有另一个 PE stub 存储在单独的文件中。这个单独的 PE stub 长度超过 20 KiB,原始 PE stub 最多 512 字节。我没有源代码,因此无法重新编译或重新链接。如何替换 Win32 .exe 中的 PE stub ?

可能我需要一个工具来更新节文件偏移量。但这还不够:根据 objdump -x file.exe 的输出差异,这些还必须更新:AddressOfEntryPoint、BaseOfCode、BaseOfData、SizeOfImage、SizeOfHeaders、数据目录中的偏移量、地址搬迁修复。

最佳答案

TL:DR Use the Perl script in pe-setstub to replace the DOS stub in a PE .exe.

具有大 stub (甚至大于 100 000 字节)的 Win32 PE .exe 文件可以在各种 Windows 版本上运行,但有一个要求:每个部分的 VirtualAddress 不得小于 header 大小(包括 stub ) 、PE 头和 PE 节表)。因此,如果程序用更大的 stub 替换 stub ,则程序还必须增加每个部分的虚拟地址。这听起来像是一个非常复杂的操作,因此不太可能有一些现成的工具。

仅供引用,在 Win32s 上,还有一个附加要求:PE header (以最后一个节 header 的最后一个字节结束)必须适合 0x800 (2048) 字节。

即使有这些要求,也可以添加长 stub ,而无需触及节的 VirtualAddress 或 ImageBase。 PE .exe 看起来像这样:

  1. 32 字节的 DOS .exe header (包括末尾的几个字节的填充),以 MZ 开头。偏移量 8 处的 header 字段指向 DOS stub 代码 (#3)。
  2. 大约 368 字节的 PE header (包含 4 个节 header ,每个节 header 40 字节),从 PE 开始,到最后一个节 header 结束。
  3. 其余的 DOS stub 代码将被加载到内存并由 DOS 运行。该大小可以小至 32 个字节,也可以大至数百 KiB。
  4. 一些填充字节,用于将第一个部分与 0x200 的倍数对齐。
  5. 部分数据,每个部分与 0x200 的倍数对齐。

我已经在 pe-setstub 中以 Perl 脚本的形式实现了这样的 stub 替换和分割。 .

它之所以有效,是因为 #3 的大小没有(小)上限。

关于windows - 替换现有 Win32 .exe 中的 PE stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63014541/

相关文章:

windows - 如何在Windows Batch中回显>不带引号的字符? [复制]

windows - 创建启动文件夹 - Windows

java - Tomcat : "The CATALINA_HOME environment variable is not defined correctly"

.net - 为 Windows 编写跨平台(32 位和 64 位兼容)程序(如 .NET 中的 AnyCPU)

windows - 如何在 Windows Server 2008 R2 中关闭(禁用)Web 代理自动发现 (WPAD)

rspec - 在 RSpec 中,是否有相当于 "unstub"但针对 "should_receive"的方法?

swift - 如何在结构/类中 stub Swift "Trait/Mixin"方法进行测试

ruby-on-rails - 如何测试使用 puntopagos 和 rest-client 的 Controller Action ?

c - 将入口点更改为PE文件中新添加的shellcode段后,如何恢复主进程?

c++ - 使用 C/C++ 获取正在运行的进程的当前 NT header 数据