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



我有一个现有的Win32.exe,它的开头有一个PE存根,我有另一个存储在单独文件中的PE存根。这个单独的PE存根比20KiB长,原始PE存根最多为512个字节。我没有源代码,所以我无法重新编译或重新链接。如何替换Win32.exe中的PE存根?

也许我需要一个更新剖面文件偏移量的工具。但这还不够:根据objdump -x file.exe输出的差异,还必须更新这些输出:AddressOfEntryPoint、BaseOfCode、BaseOfData、SizeOfImage、SizeOfHeaders、数据目录中的偏移量、重新定位修正中的地址。

TL:DR使用pe setstub中的Perl脚本替换pe.exe.中的DOS存根

具有大存根(甚至大于100000字节(的Win32 PE.exe文件可以在各种Windows版本上工作,但有一个要求:每个节的VirtualAddress必须不小于标头大小(包括存根、PE标头和PE节表(。因此,如果一个程序用一个更大的存根替换存根,该程序还必须增加每个部分的VirtualAddress。这听起来是一个非常复杂的操作,所以不太可能有现成的工具。

仅供参考在Win32s上,还有一个额外的要求:PE标头(以最后一节标头的最后一个字节结尾(必须容纳0x800(2048(字节。

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

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

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

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

最新更新