替换现有 Win32 .exe 中的 PE 存根

我有一个现有的 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 看起来像这样:

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

我已经在pe-setstub 中实现了这样的存根替换和拆分作为 Perl 脚本

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PE文件中的DOS存根

在C ++ Win32项目的最终exe文件中未显示图像(PNG)

错误消息:Node.exe不是有效的Win32应用程序

Application.exe不是有效的Win32应用程序错误

EXE不是有效的Win32应用程序,但在64位上运行

从 Win32 启动 .exe 文件

在Win32中显示带有Alpha通道的32位图像

在sinon存根中替换多种方法

VS刚刚构建它之后,“ xxx.exe不是有效的Win32应用程序”

Pycharm与Electron -Runnerw.exe:CreateProcess失败,错误193:%1不是有效的Win32应用程序

MASM32 组装错误 - C:\masm32\bin\ml.exe 不是有效的 Win32 应用程序

Win32 API中的MK_CONTROL和VK_CONTROL有什么区别?

在哪里可以找到Win32 API中ManagementObjectSearcher中使用的所有表

在Win32中有多少种方法可以执行C ++

是否有Win32 API在字符串中添加双引号?

Win32 API 中的指针所有权

WIN32 和 UNIX 在 CMake 交叉编译中没有变化

Ruby on Rails中带有#的存根

py2exe和Win32 OLEObject错误

使用Sinon时,如何在存根实例中替换存根函数?

我如何在Win32系统中安装Mongo Db?有人在Win 32位系统中安装了Mongo DB

如何判断是否为PE Win32启用了/ GS编译器

如何使用MinGW创建微型PE(Win32)可执行文件

如何在Golang中实现存根?存根和模拟之间有什么区别?

如何禁用CMake 3.1中有关未定义cygwin WIN32的警告?

Win32中有任何易于使用的哈希函数来哈希ASCII字符串吗?

使用带有Win32 :: OLE的Perl修改Excel电子表格中的单元格范围

我的Visual C ++ Win32中有一个无法关闭的MessageBox!到底是怎么回事?

我如何使用sendmessage发送在Win32中具有计时器proc的wm_timer