正在检测DLL代码拼接

问题描述

| 我正在尝试编写一些函数来检测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:顺序= 00000059,rva = 0007e098,fileoffs = 0007d498,功能VA:7c97e098 磁盘:00 00 00 00 00 00 00 00 内存:e4 04 00 00 00 00 00 00 和: ntdll.dll:顺序= 0000003d,rva = 0009d0d8,fileoffs = 0009c4d8函数VA:77a9d0d8 磁盘:a1 5c 81 f9 77 c3 90 90 内存:a1 5c 81 ad 77 c3 90 90 有人向我提到,这与搬迁有关。但是,我无法弄清楚这一点,也没有找到有关此如何应用的任何文档。 有人在此有任何信息或链接吗?还是有人知道我在哪里失败? 提前谢谢了。 编辑:DLL \被加载在其首选的图像库(将OptionalHeader.ImageBase与内存中已加载模块的基地址进行比较时)。 因此,我坚持尝试找出为什么可能会有差异-例如。上图:为什么ntdll中的1312功能似乎匹配,但第1313 \'个不匹配。     

解决方法

重定位是虚拟偏移量的列表,其中包含绝对地址。如果未在其首选图像库中加载图像,则需要调整重定位表中列出的所有偏移量。如果您首选的图像基数是0x400000,并且DLL的加载位置是0x500000,则只需要将数据调整为重定位列表中提到的偏移量,即0x100000。 参见例如PE内Peering中的\“ PE File Base Relocations \”部分以获取格式。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...