2016-09-25 52 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进程时会遇到复杂问题,反之亦然。

我强烈推荐使用第一种方法。