【问题标题】:Is it possible in Delphi to get the address of a function/procedure in another process?Delphi 是否可以在另一个进程中获取函数/过程的地址?
【发布时间】:2011-04-15 09:27:00
【问题描述】:

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

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

【问题讨论】:

  • 我应该注意我挂钩的函数/过程不是导出的函数/过程

标签: delphi function procedure dll-injection


【解决方案1】:

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

【讨论】:

  • 您只能对导出的函数执行此操作,Kdunlapmo 说这里不是这种情况。
【解决方案2】:

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

【讨论】:

  • 这听起来确实是最合乎逻辑的方式。我忘记了 madDisasm。我会试试看。感谢您的回复!
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2015-07-21
      • 2021-01-15
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多