0

我有一个 DLL 文件,我需要从中获取类过程的内存地址。我正在获取 DLL 文件的句柄,但是当我使用 GetProcAddress 时,我无法获取该过程的地址。我已经为进程名称参数尝试了以下字符串:

"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"

在任何情况下,我都没有得到程序的内存地址。我很确定这个程序是公开的。

这样做的字符串格式是什么?声明一个指向外部过程的函数并稍后获取地址会更容易吗?像这样:

procedure ProcName(); stdcall; far; external 'Example.DLL';

ProcPointer := @ProcName;
4

3 回答 3

5

GetProcAddress只为您提供导出函数的地址。您的 DLL 肯定不会导出类的方法!

使用PE资源管理器查找导出的名称。例如,使用GExpertsPE中可用的资源管理器。我在 GExperts 菜单下有一个“PE 信息”菜单条目。

于 2011-03-18T13:53:46.500 回答
1

你在这里进入逆向工程领域。

我认为如果我是你,我会在调试器的 CPU 视图中单步执行,然后调用感兴趣的方法,然后找到入口点地址。我会从 DLL 的基地址中减去它,这就是偏移量。然后要在运行时计算地址,只需将偏移量添加到当时内存中 DLL 的基地址即可。您可以通过调用 LoadLibrary 或 GetModuleHandle 找出基地址。

为什么要硬编码偏移量?好吧,既然你不能修改你的 DLL,它似乎并没有太大的限制。如果硬编码偏移量不可行,那么还有其他定位入口点的方法,但我必须承认我不是世界上最伟大的专家。

最后,当你实现替换方法时,你需要用一个带有额外参数的全局函数/过程来替换它,第一个参数代替了 Self。

于 2011-03-18T14:00:45.530 回答
0

我可能读错了。但在我看来,您编写了 DLL。

您应该编写一个不属于任何类的函数,并将其从您的 DLL 中导出。在该函数中,调用您的类方法。

如果您没有编写 DLL,您仍然需要找出它导出的函数,而且它们中的任何一个都不太可能是类方法,至少在 Pascal 中不是。

如果有人用 C++ 编写了一个 dll 并导出了它的方法,那么您将不得不调查 C++ 名称修改规则。

于 2011-03-19T02:55:44.227 回答