2010-11-05 46 views
0

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

我发现CodeProject

注意此方法:我不知道如何与PE

由于工作在C#中的帮助。

回答

2

我不知道如何与PE在C#

工作,这是你要解决:)

一个PE只是一个文件的问题。微软有一个相当不错的文档,在他们的网站上描述了它的格式。您可能需要注册以便能够下载它。它被称为Microsoft可移植可执行文件和通用对象文件格式规范。

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)完成。

+0

谢谢,但如何使用C#来做这些步骤,我应该打开EXE作为常规文件?如何找到iat地址? – Radi 2010-11-06 11:44:38

+0

假设您正在修改已在运行的进程,请使用ReadProcessMemory,WriteProcessMemory。如果您试图修改磁盘上的PE,那就更复杂了,因为您现在必须以某种方式将修改后的例程嵌入到PE中。 – 2010-11-08 17:28:38