2010-09-21 32 views
2

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

请注意,这不是恶意的意图,我只是在目标EXE中挂钩了一些程序以用于记录目的。

+0

我要指出的是,功能/我钩子程序不导出函数/过程 – kirkdmo 2010-09-21 19:34:28

回答

4

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

+0

这听起来像最符合逻辑我真的忘记了madDisasm。我会试一试。感谢您的回应! – kirkdmo 2010-09-22 15:48:55

0

这取决于。默认情况下,Delphi编译为本机机器码。大多数情况下没有这样的元数据。 (许多人将这看作是一项安全功能;它使人们无法完成你想要做的事情,这可以用于恶意目的。)但是任何RTTI可用的方法都会将其地址放在RTTI表中。这包括所有发布的方法,以及所有public方法(默认情况下,至少)在D2010和Delphi XE中。这些RTTI表格可以被读取,但需要很多低级知识才能找到它们。

另外,有些程序会在安装文件夹中附带各种映射文件,或作为资源嵌入,以便在发生错误时方便进行错误报告。如果这个程序有一个,并且你可以计算出它的格式,你可以从那里获得方法地址。

3

如果没有您所关注的计划的合作,就没有简单的方法来做您所需要的。

通常,这种合作是以模块的导出表格的形式出现的,但它也可能来自于提供API的程序,用它来询问其功能的地址。

即使您更新DLL的每个版本的挂钩程序,仍然不能保证您的代码将工作。你所做的就是address space layout randomization应该防止的事情。每次运行时,程序可能会加载到不同的地址。

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

0

,如果你使用的是DLL u可以使用GetProcAddress函数的DLL中以检索的功能ADRESS

+0

您只能对导出的函数执行此操作,而Kdunlapmo所说的情况并非如此。 – 2010-09-22 13:40:46

相关问题