gpt4 book ai didi

c - Windows 32 位和 64 位之间的代码差异

转载 作者:可可西里 更新时间:2023-11-01 14:00:23 26 4
gpt4 key购买 nike

我正在试验以下代码来模拟 GetProcAddress。

// Retrieve NT header from base address.
IMAGE_NT_HEADERS *GetNtHeaderFromBase( void *pBaseAddr )
{
IMAGE_DOS_HEADER *pDosHeader;
IMAGE_NT_HEADERS *pNtHeaders;

pDosHeader = ((IMAGE_DOS_HEADER *)pBaseAddr);
if(pDosHeader->e_magic != 0x5A4D)
return NULL;

pNtHeaders = ((IMAGE_NT_HEADERS *)((DWORD)pBaseAddr + pDosHeader->e_lfanew));
if(pNtHeaders->Signature != 0x4550)
return NULL;

return ((pNtHeaders == NULL) ? NULL : pNtHeaders);
}


// This emulates GetProcAddress.
void *GetFuncAddr( DWORD pBaseAddr, char *lpszFuncName )
{
IMAGE_NT_HEADERS *pNtHeaders;
IMAGE_DATA_DIRECTORY *pDataDir;
IMAGE_EXPORT_DIRECTORY *pExportDir;
const char **lpszNames;
DWORD *lpdwFuncs, dwIndex;

pNtHeaders = GetNtHeaderFromBase((void *)pBaseAddr);
if(pNtHeaders == NULL)
return NULL;

pDataDir = ((IMAGE_DATA_DIRECTORY *)(pNtHeaders->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT));
if(pDataDir == NULL)
return NULL;

pExportDir = ((IMAGE_EXPORT_DIRECTORY *)(pBaseAddr + pDataDir->VirtualAddress));
if(pExportDir == NULL)
return NULL;

lpdwFuncs = ((DWORD *)(pBaseAddr + pExportDir->AddressOfFunctions));
lpszNames = ((const char **)(pBaseAddr + pExportDir->AddressOfNames));
if(lpdwFuncs == NULL || lpszNames == NULL)
return NULL;

for(dwIndex = 0; dwIndex < pExportDir->NumberOfFunctions; dwIndex++)
{
// decrypt funcname and get the address
if(!cmpstr(((char *)(pBaseAddr + lpszNames[dwIndex])), lpszFuncName))
return (void*)(pBaseAddr + lpdwFuncs[dwIndex]);
}

return NULL;
}

但是当我在 Windows Vista x64 上运行该程序时,我遇到了访问冲突。我认为这是 GetNtHeaderFromBase 上的数字(传递给 IMAGE_DOS_HEADER 和 IMAGE_NET_HEADER 的数字),但我找不到任何关于它在 x64 位二进制文​​件上可能是什么的引用。

任何人都知道我需要对此代码进行哪些更改才能使其在 64 位 Windows 下工作?或者,实现在 x32 和 x64 上都适用的类似 getprocaddress 的函数的更好方法?

感谢您的帮助和代码。

杰斯。

最佳答案

我不确定这是否是您唯一的问题,但是 DWORD 是 32 位,即使在 64 位平台上也是如此。您将指针指向此,并在 64 位上导致截断。如果你想要一个指针大小的整数,你应该使用 DWORD_PTRULONG_PTR

我还会检查您的结构在这方面是否是 64 位安全的。

关于c - Windows 32 位和 64 位之间的代码差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1766031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com