Windows 32位和64位之间的代码差异
发布时间:2020-12-14 04:27:13 所属栏目:Windows 来源:网络整理
导读:我正在尝试使用以下代码来模拟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 *)pBa
我正在尝试使用以下代码来模拟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下运行? 感谢您的帮助和代码. 杰西. 解决方法
原因是您在pBaseAddr方法的DWORD中存储指针大小的值.指针值在64位窗口上为8个字节,而DWORD仅为4个字节.您需要执行以下操作之一
>将pBaseAddr作为指针传递(首选方法)>将其作为size_t传递,在32位窗口上正确为4个字节,在64位窗口上为8个字节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |