1

我正在尝试编写一些函数来检测 DLL 代码拼接。我认为 dll 代码拼接意味着在加载的 dll 中修改函数开头的字节,这样它就不会跳转到 dll 中的完整函数实现,而是跳转到其他位置。

到目前为止,我的方法是:
首先 - 加载 dll 信息(例如,加载的 dll 的图像库等)我从使用 Toolhelp32 库中获得。

对于每个加载的 dll:

  • 通过读取内存中 dll 的导出表来获取每个函数地址 (rva)
  • 在内存中的这个地址读取 8 个字节
  • 从磁盘上的 dll 版本获取函数 rva
  • 解析 dll-on-disk 的 PE 头,将 rva 转换为文件偏移量 - 在这里也读取 8 个字节
  • 比较这 8 个字节

现在我知道我做的不是很正确,我可能在概念上犯了错误。

我一直在使用 32 位的 notepad.exe 进行测试。对于加载的 DLL 中的大多数函数,比较成功,但它往往会发现一些差异。

例如:
ntdll.dll: ordinal=00000059, rva=0007e098, fileoffs=0007d498, function VA: 7c97e098
disk: 00 00 00 00 00 00 00 00
mem: e4 04 00 00 00 00 00 00

和:
ntdll.dll: ordinal=0000003d, rva=0009d0d8, fileoffs=0009c4d8 函数 VA: 77a9d0d8
磁盘: a1 5c 81 f9 77 c3 90 90
mem: a1 5c 81 ad 77 c3 90 90

有人向我提到这与搬迁有关。但是,我无法弄清楚这一点,并且我还没有找到任何关于如何在此处应用的文档。

有没有人有一些信息或链接?或者有谁知道我在哪里失败?提前谢谢了。

编辑: DLL正在其首选图像库中加载(将 OptionalHeader.ImageBase 与内存中加载模块的基地址进行比较时)。

因此,我一直试图弄清楚为什么会有差异 - 例如。上图:为什么 ntdll 中的 1312 个函数似乎匹配,但第 1313 个不匹配。

4

1 回答 1

0

重定位是包含绝对地址的虚拟偏移列表。如果图像未在其首选图像库中加载,则需要调整重定位表中列出的所有偏移量。如果您首选的映像库是 0x400000 并且 DLL 在 0x500000 加载,您只需在重定位列表中提到的偏移量处调整数据 0x100000。

有关格式,请参见例如 PE内部对等中的“PE 文件库重定位”部分。

于 2011-04-13T07:01:49.017 回答