3

到目前为止我做了什么:

我在 Aphex 的AfxCodeHook.pas单元中找到了它。

我还使用它浏览了一堆有趣的示例代码:

  • 注入库(如何将 DLL 注入另一个进程)。
  • Inject Library Ex(如何使用 Ex 方法将 DLL 注入另一个进程)。
  • Create Process Ex(如何使用 Ex 方法将 DLL 注入到创建的进程中)。
  • Inject Executable(InjectLibraryEx 的真正威力:注入 EXE 文件的能力)。
  • Simple Api Hooking(如何使用 afxcodehook 来操作对 windows apis 的调用)。

我也读过:


问题:

我寻求经验丰富的 Delphi 编码人员对 Layman 术语中的 {$IMAGEBASE $13140000} 指令的知情意见和简单解释。

4

1 回答 1

3

这指定了 DLL 的首选基地址。如果 DLL 可以在这个地址加载,那么加载器就会这样做。如果不能,则需要重新定位,DLL 中的所有绝对跳转都需要调整到新地址。

当加载器尝试将 DLL 映射到进程地址空间时,它首先读取首选基地址。然后它计算出 DLL 的大小。最后,它检查是否可以找到从基地址延伸到基地址 + 大小的连续内存块。如果是这样,那么 DLL 将加载到首选基地址。如果另一个 DLL 或 exe 驻留在首选基地址,则需要重新定位 DLL。如果应用程序保留了与首选 DLL 加载地址空间重叠的堆内存,则需要重新定位 DLL。

如果需要重新定位 DLL,则其物理页面不能在进程之间共享。Windows 系统 DLL 已经仔细选择了基地址,以确保没有冲突并且可以共享它们。

如今,地址空间布局随机化 (ASLR)使事情变得更加复杂。

您可以从这些文章中了解更多信息:

于 2012-04-19T10:11:19.253 回答