2016-09-25 7 views
1

Hey guys CheatEngineで既に知っているプロセスからいくつかのメモリを取得したいと思います。スキャンする領域(0x190D186FF-> 0x190D1870A)を定義しましたが、アドレスが大きすぎて単純なintに格納できませんでした。だから私は__int64を使うのですが、その修正ReadProcessMemoryはアドレスをもう処理していないようです。ReadProcessMemory with __int64 address

私はVirtualProtectExとReadProcessMemoryのための3回の警告を得たコンパイル:私はメモリから本当に大きなアドレスを読み取ることができ

どのように異なるサイズの整数からポインタにキャスト?

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ビットOSだから、デフォルトでは64bプロセスをコンパイルすると思います。 (+ iは-m64で試してみると、実装されていない:blablablaでコンパイルされていない64ビットモード) –

答えて

0

あなたの問題は、あなたの32ビット変数へのデータの64ビットを詰め込むしようとしています。 x64でビルドするには、プロジェクトを切り替える必要があります。

コンパイラは、64bのOS上でx64として自動的にコンパイルしません。 x64のためにコンパイルするための設定ビルドタイプを変更するように設定する必要があります。

これを簡単にする方法は2つあります。

1)相互作用するプロセスと同じプロセスアーキテクチャでコンパイルすると、多くの問題が緩和されます。 uintptr_tまたはUINT_PTRを使用して、すべてのアドレスとオフセットに対して、コンパイルに応じて32ビットまたは64ビットの正しいポインタサイズに解決します。

2)を使用すると、x64のプロセスと対話しているとき次にTARGET_X64を定義

#define TARGET_X64 

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

のような独自のTYPEDEFを行います。このようにして、x32としてコンパイルしている場合は、x64プロセスにアクセスする際に問題があり、その逆もある特定のAPIがあります。

最初の方法を強くお勧めします。