在Delphi中获取DLL类过程地址

在Delphi中获取DLL类过程地址,delphi,delphi-6,getprocaddress,Delphi,Delphi 6,Getprocaddress,我有一个DLL文件,从中我需要一个类过程的内存地址。我正在获取DLL文件的句柄,但是当我使用GetProcAddress时,我无法获取过程的地址。我已尝试使用以下字符串作为process name参数: "ProcName" "ProcClass.ProcName" "ProcClass::ProcName" "ProcInterface::ProcName" "ProcInterface.ProcName" 在所有情况下,我都没有得到程序的内存地址。我几乎可以肯定,这个程序是公开的 执行此操

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

"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"
在所有情况下,我都没有得到程序的内存地址。我几乎可以肯定,这个程序是公开的

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

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


GetProcAddress
仅提供导出函数的地址。你的DLL肯定不会导出类的方法


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

GetProcAddress
仅提供导出函数的地址。你的DLL肯定不会导出类的方法


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

您进入了反向工程领域

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

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


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

您进入了逆向工程领域

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

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


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

我可能读错了。但在我看来,DLL是你写的

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

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


如果有人在C++中写了一个DLL并导出了它的方法,那么你就必须研究C++名字的规则。

< P>我可能读错了。但在我看来,DLL是你写的

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

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


如果有人在C++中写了一个DLL并输出了它的方法,那么你就必须研究C++名字的规则。然而,你没有接受很多答案。我想你可以接受一些答案,这是表达你感激的好方法!你写了这个DLL吗?你怎么知道里面有一个课堂程序而不是一个常规程序?顺便说一下,你最近就这个话题问了不少问题,这很好。然而,你没有接受很多答案。我想你可以接受一些答案,这是表达你感激的好方法!你写了这个DLL吗?你怎么知道它里面有一个类过程而不是一个常规过程?@David,你能从DLL中的一个简单类函数中发布代码来实现这一点吗?由于无法从Delphi导出类成员(无论如何,AFAIK),因此我不确定如何获取类函数的地址。这是你的第一个答案,我有强烈的反对票的冲动,所以我有兴趣在这里被证明是错误的。:)@肯,没有密码。您只需一步一步地通过调试器,看看它会带您去哪里,阅读反汇编。目标是找到要替换的函数的入口点。IDispatch可能很棘手,或者不管它是什么,可能会有两层间接导航。@Ken我可能要做的是生成我自己的简单IDispatch(如果这确实是我们正在谈论的),然后看看如何在assembler中实现对其中一层的方法调用。然后,我会将其映射到真实的DLL并计算出入口点。一旦我得到了入口点地址,我会使用上一个问题中的代码,用JMP覆盖该代码到新代码。@Ken我已经尝试过澄清一下答案。我没有解释清楚。我心里很清楚,他

ProcPointer := @ProcName;