我有一些代码,我多年来一直使用将Windows应用程序中嵌入的DLL加载到内存中,将内存地址作为指针返回。 (这也是指向用于查找成员函数地址的IMAGE_DOS_HEADER结构的指针)
一旦DLL在内存中我DLL_PROCESS_ATTACH。要在Dll中找到函数的地址,我找到导出目录:
lpImageExportDirectory = @lpImageNtHeaders.OptionalHeader.D`ataDirectory(%IMAGE_DIRECTORY_ENTRY_EXPORT).VirtualAddress
添加标题:
lpImageExportDirectory = lpImageExportDirectory + lpImageDosHeader
然后使用:
lpImageExportDirectory.AddressOfNameOrdinals
lpImageExportDirectory.AddressOfNames
lpImageExportDirectory.AddressOfFunctions
循环比较名称的功能,直到找到我想要的名字 (无法发布确切的代码,其受限制)
这一切在XP Win7,NT,Windows Server 2003R2上工作正常但在Windows Server 2008R2 64位上 NOT 。 (尚未在32位上测试)
无论我尝试加载什么Dll,当我附加Dll时应用程序GPF。
伪代码:
函数原型:
int EntryPoint( BYVAL hInstance AS DWORD, BYVAL Reason AS DWORD, BYVAL Reserved AS DWORD)
...
pEntry = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
CALL DWORD pEntry USING EntryPoint(lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)
也许WS2008R2在内存中“虚拟化”Dll?如果是这样我如何计算新地址?
添加了:
嵌入式示例 - 131k
8月22日到期