2011-04-13 85 views
1

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

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

对于每个加载DLL:

  • 通过读取导出表得到每个功能地址(RVA),在存储器中,该DLL
  • 在存储器
  • get函数中的8个字节在该地址读出的从DLL版本的磁盘上RVA
  • DLL的磁盘上的
  • 解析PE头,要转换的RVA文件偏移 - 读到这里8个字节太
  • 比较这8个字节

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

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

例如:
ntdll.dll的:序号= 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的:序号= 0000003d,RVA = 0009d0d8,fileoffs = 0009c4d8功能VA:77a9d0d8
磁盘:A1 5C 81 F9 77 90 C3 90
MEM:A1 5C 81广告77 c3 90 90

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

有没有人有一些信息,或链接呢?还是有人知道我失败的地方? 非常感谢提前。

编辑: DLL的在它们的优选图像碱被加载(比较OptionalHeader.ImageBase到在存储器中的加载模块的基地址时)。

因此,我试图弄清楚为什么可能有区别 - 例如。上图:为什么ntdll中的1312函数似乎匹配,但是1313的函数并不是。

回答

0

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

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

+0

谢谢。你说的话是有道理的。我现在发现,虽然是我正在测试的DLL,正在被加载到他们的首选地址。所以我不确定什么可能会导致这种差异... – kwytay 2011-04-14 07:49:55