嘿伙计们,我想从CheatEngine已经知道的过程中获得一些记忆。我定义了一个我要扫描的区域(0x190D186FF-> 0x190D1870A),但地址太大而无法存储在简单的int中。这就是我使用__int64的原因,但是修改后的ReadProcessMemory似乎不再处理地址了。
当我编译时,我得到了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 :(得分:0)
您的问题是您尝试将64位数据填充为32位变量。您需要将项目切换为使用x64构建。
您的编译器不会在64b操作系统上自动编译为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
然后在与x64进程交互时定义TARGET_X64。如果你这样做,并且你正在编译为x32,那么某些API在访问x64进程时会有复杂性,反之亦然。
我强烈建议使用第一种方法。