在Delphi中,是否可以在另一个进程中获取函数/过程的地址?

在Delphi中,是否可以在另一个进程中获取函数/过程的地址?,delphi,function,procedure,dll-injection,Delphi,Function,Procedure,Dll Injection,我使用Madshi的madCodeHook组件在进程中注入DLL,然后钩住一个过程/函数。问题是每次出现新版本的EXE时,函数的地址都可能会改变。目前我这样做的方式是使用Ollydbg,然后硬编码DLL中的地址,我注入到进程中,这是非常丑陋和不安全的。我只是想知道,如果我可以动态地执行,是否有办法知道过程的定义 请注意,这不是出于恶意,我只是在目标EXE中挂接了几个过程以用于日志记录。这取决于具体情况。默认情况下,Delphi编译为本机机器代码。大多数情况下都没有这样的元数据。(很多人认为这是一

我使用Madshi的madCodeHook组件在进程中注入DLL,然后钩住一个过程/函数。问题是每次出现新版本的EXE时,函数的地址都可能会改变。目前我这样做的方式是使用Ollydbg,然后硬编码DLL中的地址,我注入到进程中,这是非常丑陋和不安全的。我只是想知道,如果我可以动态地执行,是否有办法知道过程的定义


请注意,这不是出于恶意,我只是在目标EXE中挂接了几个过程以用于日志记录。

这取决于具体情况。默认情况下,Delphi编译为本机机器代码。大多数情况下都没有这样的元数据。(很多人认为这是一种安全功能;它阻止人们做你在这里试图做的事情,这可能被用于邪恶的目的。)但是任何可用RTTI的方法都会在RTTI表中有它的地址。这包括D2010和Delphi XE中所有已发布的方法和所有公开的方法(至少默认情况下)。这些RTTI表是可以读取的,但要找到它们需要大量的底层知识


此外,有些程序在安装文件夹中或作为资源嵌入时附带了一些不同的映射文件,以便在出现错误时进行错误报告。如果这个程序有一个,并且您可以确定它的格式,您可能可以从那里获得方法地址。

如果没有您正在连接的程序的合作,就没有简单的方法来做您需要的事情

通常,这种协作是以模块的导出表的形式出现的,但也可能来自提供API的程序,该API用于请求模块提供其函数的地址

即使您为钩子程序的每个版本更新DLL,也不能保证您的代码能够正常工作。你所做的正是你应该保护自己不受伤害的事情。程序每次运行时可能会加载到不同的地址


我认为您最好的选择是,如果您能够以某种方式自动执行在Ollydbg中查找函数所使用的任何过程。然后您可以将其合并到DLL中,以便它可以搜索函数本身。

如果函数本身没有变化(很多),您可以搜索您需要的代码(搜索操作码或十六进制字节)或者出于同样的目的使用Madshi的disasm单元。

如果您使用dll,您可以在dll中使用getprocaddress来检索函数的地址。

我应该注意,我挂接的函数/过程不是导出函数/过程您只能对导出的函数执行此操作,Kdunlapmo所说的情况并非如此。这听起来是最符合逻辑的方式。我忘记了疯癫。我试试看。谢谢你的回复!