带有__int64地址

时间:2016-09-25 18:46:24

标签: c int64

嘿伙计们,我想从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" );

}

1 个答案:

答案 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进程时会有复杂性,反之亦然。

我强烈建议使用第一种方法。