正如我之前提到的一个问题,我在我的代码中使用模拟GetProcAddress()。以下代码成功执行此操作,但它会导致应用程序在Windows 7上崩溃
void *GetFuncAddr(HMODULE hModule, char *fname)
{
unsigned int count = 1;
IMAGE_DOS_HEADER *DosHeader;
IMAGE_NT_HEADERS *NtHeaders;
IMAGE_OPTIONAL_HEADER *OptionalHeader;
IMAGE_DATA_DIRECTORY *DataDirectory;
IMAGE_EXPORT_DIRECTORY *Exp;
ULONG *addrof;
char *fullfname;
ULONG *faddr;
DosHeader = (IMAGE_DOS_HEADER *)hModule;
if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
return NULL;
}
NtHeaders = (IMAGE_NT_HEADERS *)(((BYTE *)DosHeader) + DosHeader->e_lfanew);
if (NtHeaders->Signature != IMAGE_NT_SIGNATURE)
{
return NULL;
}
OptionalHeader = &NtHeaders->OptionalHeader;
DataDirectory = &OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
Exp = (IMAGE_EXPORT_DIRECTORY *)((size_t)DosHeader + DataDirectory->VirtualAddress);
addrof = (ULONG *)((BYTE*) hModule + Exp->addrof);
faddr = (ULONG*) ((BYTE*) hModule + Exp->AddressOfFunctions);
for(count = 0; count < Exp->NumberOfNames; count++)
{
fullfname = (char*)((BYTE*) hModule + addrof[count]);
if(strcmp(fullfname, fname) == 0)
{
return (void*)((BYTE*) hModule + faddr[count]);
}
}
return NULL;
}
使用此应用程序崩溃尝试加载的功能无关紧要。调用导入的函数时会发生崩溃,因此我的猜测是返回的指针可能是令人讨厌的事情。这在x86和x64上都会发生。 这段代码中是否有明显的原因?
我尝试将函数设置为返回FARPROC,但我对如何转换返回((BYTE *)hModule + faddr [count])感到困惑;
无论如何,有什么想法吗?解决方案? 任何帮助表示赞赏。
感谢。杰斯。
编辑我导入的某些API返回的错误是错误18,参数不正确。
答案 0 :(得分:4)
我认为您可能需要进行额外的查找。
USHORT *ford;
...
ford = (USHORT*) ((BYTE*) hModule + Exp->AddressOfNameOrdinals);
然后由序数偏移:
return (void*)((BYTE*) hModule + faddr[ford[count]]);
本文讨论了一些问题:http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
答案 1 :(得分:1)
看起来您正在假设表中的Ordinal#= offset。也许在Windows 7 DLL中不是这样。
答案 2 :(得分:0)
如何创建句柄hModule?为什么不使用GetProcAddress
(你的函数似乎复制了函数的行为)?