Pe 32 通过扩展 dll 或修补 pe 添加导出功能段

逆向工程 视窗 C++ 聚乙烯 汇编
2021-07-04 22:58:08

我需要在 pe32 module.dll 导出表中添加新函数,如果可能的话以动态方式(通过使用 dll 扩展)或通过修补 pe32 module.dll

你有什么建议来解决这个问题?

1个回答

由于我不知道任何工具可以轻松解决您的问题,因此我将告诉您如何“手动”完成。

首先,你要熟悉PE格式。如果不是,您可以查看aldeidMSDN以了解我将描述的步骤。添加导出到dll只是扩展Export Directory并可能更改其他一些字段。所以,你需要做的是:

  1. 打开你dll的 PE 解析器。它可以是PE ExplorerCFF Explorer或在 IDA 等反汇编程序中(勾选手动加载,然后加载所有可能的部分)。
  2. 打开您最喜欢的十六进制编辑器以修补dll. 上面提到的 PE 解析器可能会进行一些更改,但不是全部。
  3. 增加ExportDirectory.NumberOfFunctions1,因为你添加新的功能。
  4. 做同样的事情ExportDirectory.NumberOfNames
  5. 现在,您必须向 中添加新条目Export Address Table,该条目位于ExportDirectory.AddressOfFunctions只需使用十六进制编辑器插入4新的 NULL 字节 - 您将在插入函数代码时设置它们的值。
  6. 在上一步之后,ExportDirectory.AddressOfNames可能已更改(按4字节)。你也必须调整它。
  7. 现在,插入新条目ExportDirectory.AddressOfNames-4使用十六进制编辑器插入另一个字节。稍后,您会将其更改为您的函数的名称。
  8. 与步骤 6. 和 7. 中一样,使用十六进制编辑器调整ExportDirectory.AddressOfNameOrdinals和添加2字节(最高序数+ 1,以小端顺序编写)。
  9. 由于您插入了几个新字节,因此您也必须更改ExportDirectory.Name以指向dll名称。
  10. 现在,将您的函数名称插入函数名称表的末尾(中的最后一个条目ExportDirectory.AddressOfNames)。
  11. 设置您在 7. 中创建的条目,使其指向您的函数名称。
  12. .text部分的末尾插入您的函数代码(如果它足够小,则不必调整其大小)。
  13. 设置你在5中创建的条目。
  14. 更改Export Directory Size以匹配您的新尺寸。
  15. 使用相同的值改变SectionHeader.VirtualSize.edata部分。
  16. 增加FileHeader.NumberOfSymbols1
  17. 无论是增加SectionTable.SizeOfRawDataExportDirectory通过字节数已利用插入十六进制编辑器,或删除,因为这数字NULL在结束字节ExportDirectory(如果存在的话)。
  18. 清零或计算 new OptionalHeader.CheckSum

如您所见,手动执行此操作是一个乏味的过程,即使您发现这样做太困难,我希望至少您看到“在低级别”必须完成的操作才能将新导出添加到dll.