我正在尝试编写一些函数来检测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的函数并不是。
谢谢。你说的话是有道理的。我现在发现,虽然是我正在测试的DLL,正在被加载到他们的首选地址。所以我不确定什么可能会导致这种差异... – kwytay 2011-04-14 07:49:55