在Delphi中获取DLL类过程地址

时间:2011-03-18 13:51:10

标签: delphi delphi-6 getprocaddress

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

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

在任何情况下我都没有得到程序的内存地址。我大多肯定该程序是公开的。

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

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

ProcPointer := @ProcName;

3 个答案:

答案 0 :(得分:5)

GetProcAddress仅为您提供导出功能的地址。您的DLL肯定不会导出类的方法!

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

答案 1 :(得分:1)

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

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

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

最后,当您实现替换方法时,您需要将其替换为带有额外参数的全局函数/过程,第一个参数取代Self。

答案 2 :(得分:0)

我可能会读错了。但在我看来你写了这个DLL。

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

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

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