2016-09-25 86 views
1

嘿傢伙我想從我已經知道的一個過程中獲得一些記憶與CheatEngine。我定義了一個我想掃描的區域(0x190D186FF-> 0x190D1870A),但地址太大而無法存儲在簡單的int中。這就是爲什麼我使用__int64,但修改ReadProcessMemory似乎不再處理地址。ReadProcessMemory與__int64地址

我編譯時有3個警告,VirtualProtectEx和ReadProcessMemory:投以指針從不同大小

如何從存儲器中讀出真正的大地址的整數?

int main(int argc, char *argv[]) { 
HWND   hWnd; 
DWORD   PID; 
HANDLE   hProc; 
__int64   address; 
char   mem = 0; 
PDWORD   oldProtect = 0; 
int    valid = 0; 
char   inputPID[4]; 

printf("What is the program PID ?\n"); 
fgets(inputPID, sizeof(inputPID), stdin); 
PID = (DWORD)atoi(inputPID); 

hProc = OpenProcess(PROCESS_VM_READ, false, PID); 

if (!hProc) { 
    printf("Error: Couldn't open process '%i'\n", PID); 
    return 0; 
} 

for (address = 0x190D186FF; address <= 0x190D1870A; address++) { 

    VirtualProtectEx(hProc, (PVOID)address, (SIZE_T)sizeof(address), PAGE_READONLY, oldProtect); 

    valid = ReadProcessMemory(hProc, (PCVOID)address, &mem, (DWORD)sizeof(char), NULL); 

    if (valid) { 
     printf("Memory value at 0x%I64x: '%c'\n", address, mem); 
    } 

    VirtualProtectEx(hProc, (PVOID)address, (SIZE_T)sizeof(address), (DWORD)oldProtect, NULL); 
} 

system("pause"); 

}

+0

您需要編譯爲64位進程。 – Ben

+0

我在一個64位的操作系統,所以我想默認編譯一個64b進程。 (+我嘗試了-m64,我得到了「未實現:64位模式未編譯blablabla) –

回答

0

你的問題是你想的東西數據的64位到32位的變量。您需要將您的項目切換到x64版本。

編譯器不會在64位的OS上自動編譯爲x64。您需要設置更改您的配置構建類型以編譯爲x64。

有兩種方法可以讓您更輕鬆地完成自己的工作。

1)編譯與您要與之交互的進程相同的進程架構,這可以緩解許多問題。使用uintptr_t或UINT_PTR將解析爲正確的指針大小32位或64位,具體取決於您編譯的地址和偏移量。

2)製作自己喜歡TYPEDEF

#define TARGET_X64 

#ifdef TARGET_X64 
typedef unsigned __int64 addr_ptr 
#else 
typedef unsigned int addr_ptr 
#endif 

然後定義TARGET_X64當你與一個64位的過程進行交互。如果你這樣做,並且你正在編譯爲x32,那麼某些API在訪問x64進程時會遇到複雜問題,反之亦然。

我強烈推薦使用第一種方法。