我有一个DLL文件,我需要一个类过程的内存地址。我正在获取DLL文件的句柄,但是当我使用GetProcAddress时,我无法获取该过程的地址。我已经为进程名称参数尝试了以下字符串:
"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"
在任何情况下我都没有得到程序的内存地址。我大多肯定该程序是公开的。
执行此操作的字符串格式是什么?声明一个指向外部过程的函数并稍后获取地址会更容易吗?像这样:
procedure ProcName(); stdcall; far; external 'Example.DLL';
ProcPointer := @ProcName;
答案 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 ++名称修改规则。