NtHeader
呼叫微軟檔案時如何正確構造PIMAGE_NT_HEADERS64
這個函式似乎沒有太多說明,問題是從轉換void*
到DWORD
失敗
int runPE64(void* Image)
{
/*
non relevant code
*/
char CurrentFilePath[1024];
DOSHeader = PIMAGE_DOS_HEADER(Image); // Initialize Variable
NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) DOSHeader->e_lfanew); // Initialize
GetModuleFileNameA(0, CurrentFilePath, 1024); // path to current executable
return 0;
}
int main()
{
unsigned char data[] = {0x4D,0x5A,0x00}; // this is dummy data
runPE64(data);
return 0;
}
編譯時出錯
$ g runPE64.cpp
runPE64.cpp: In function 'int runPE64(void*)':
runPE64.cpp:31:41: error: cast from 'void*' to 'DWORD' {aka 'long unsigned int'} loses precision [-fpermissive]
31 | NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) DOSHeader->e_lfanew); // Initialize
| ^~~~~~~~~~~~
runPE64.cpp:31:20: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
31 | NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) DOSHeader->e_lfanew); // Initialize
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有沒有另一種方法可以做到這一點,或者有什么很好的解釋要通過什么PIMAGE_NT_HEADERS64
uj5u.com熱心網友回復:
DWORD
在 32 位和 64 位系統中,大小為 32 位(4 位元組)。
編譯器警告您, 的大小與編譯DWORD
中指標的大小不同void*
,因此您將丟失位。這意味著您必須編譯 64 位可執行檔案,其中指標大小為 64 位(8 位元組)。
您需要進行型別轉換DWORD_PTR
,它與指標的大小相同,無論您編譯為 32 位還是 64 位。
NtHeader = PIMAGE_NT_HEADERS64( DWORD_PTR(Image) DOSHeader->e_lfanew);
或者,您可以使用指標算術而不是整數算術:
NtHeader = PIMAGE_NT_HEADERS64( LPBYTE(Image) DOSHeader->e_lfanew); // Initialize
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470099.html