检测DLL代码拼接

时间:2011-04-13 06:50:03

标签: dllimport portable-executable dll-injection

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

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

对于每个加载的dll:

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

现在我知道我做得不对,我可能会犯一个概念上的错误。

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

例如:
ntdll.dll:ordinal = 00000059,rva = 0007e098,fileoffs = 0007d498,功能VA:7c97e098
磁盘: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 function 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'中的函数没有。

1 个答案:

答案 0 :(得分:0)

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

参见例如Peering inside the PE中“PE文件库重定位”部分的格式。