如何使用C#更改PE导入地址表?

时间:2010-11-05 18:23:39

标签: c# portable-executable

我需要通过将导入的函数地址(在“导入地址表”部分中)替换为另一个函数地址(我已经创建)来创建一个小应用程序来修改exe文件(任何exe),所以问题是:如何使用C#解析exe(pe)并找到导入地址表的地址来改变导入的函数地址?

我在CodeProject

上找到了这个方法

注意:我不知道如何在c#

中使用pe

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  

我不知道如何在c#

中使用pe

这是您要解决的问题:)

PE只是一个文件。微软有一个很好的文档,在他们的网站上描述了它的格式。您可能需要注册才能下载它。它被称为Microsoft Portable Executable和Common Object File Format Specification。

http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx

如果你要替换一个函数,大概该函数在内存中,所以你要修改内存中的图像,而不是实际的PE。幸运的是,内存中PE的格式在概念上与在磁盘上的格式相同 - 现在,您只需要处理内存偏移而不是文件偏移。

重定向导入地址表(IAT)功能在概念上很容易。这应该让你去:

1)在文件头中找到指向PE头的指针,这是图像的最开始。

2)在PE标题中找到指向IAT的指针。

3)迭代IAT中的条目,直到找到要重定向的函数的名称。

4)使用VirtualProtect取消保护所需IAT条目的函数指针位置,因为它通常位于写保护部分。

5)在你自己的proc指针上写下以前的指针。

6)恢复以前的保护(实际上可能没有必要)

7)完成。

答案 1 :(得分:1)

您可以使用PeNet库添加仅一行代码的新导入。有关示例,请参见此处:Adding Imports

// Open executable on disk
var peFile = new PeFile("myapp.exe"); 
// add function StartPage of the gdi32.dll to the import table of the opened .exe file inside memory. It doesn't write changes to disk.
peFile.AddImport("gdi32.dll", "StartPage");
// save changes to disk
File.WriteAllBytes("D:\\PathWhereToSaveFile\\nameOfTheFile.exe", peFile.RawFile.ToArray());

图书馆创建者的原始答案在这里:https://stackoverflow.com/a/62216546/6693304