嘿伙计们,我想从我已经知道的 CheatEngine 进程中获取一些内存。我定义了一个要扫描的区域(0x190D186FF->0x190D1870A),但地址太大,无法存储在简单的 int 中。这就是为什么我使用 __int64 但经过修改后 ReadProcessMemory 似乎不再处理该地址。
当我编译时,我收到了 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" );
}
最佳答案
你的问题是你试图将 64 位数据填充到 32 位变量中。您需要将项目切换为在 x64 中构建。
您的编译器不会在 64 位操作系统上自动编译为 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 进程时会变得复杂,反之亦然。
我强烈建议使用第一种方法。
关于c - 具有 __int64 地址的 ReadProcessMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690525/