我正在尝试编写一些函数来检测 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 个不匹配。