2

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

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

4

4 回答 4

4

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

于 2010-09-21T21:28:02.323 回答
3

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

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

即使您为挂钩程序的每个版本更新您的 DLL,仍然无法保证您的代码可以正常工作。您正在做的正是地址空间布局随机化应该防止的那种事情。每次运行时,程序可能会加载到不同的地址。

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

于 2010-09-21T20:05:18.820 回答
0

这取决于。默认情况下,Delphi 编译为本机机器码。大多数情况下没有这样的元数据。(很多人认为这是一项安全功能;它使人们无法完全按照您在此处尝试执行的操作,这可能被用于邪恶目的。)但是任何具有 RTTI 可用的方法都将在 RTTI 表中具有其地址. 这包括 D2010 和 Delphi XE 中所有已发布的方法和所有公共方法(至少默认情况下)。这些 RTTI 表是可以读取的,但是要找到它们需要大量的底层知识。

此外,一些程序在安装文件夹中或作为资源嵌入了各种地图文件,以便在出现问题时进行错误报告。如果这个程序有一个,并且你可以弄清楚它的格式,你也许可以从那里得到方法地址。

于 2010-09-21T20:03:11.583 回答
0

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

于 2010-09-22T08:09:55.127 回答