c - 具有 __int64 地址的 ReadProcessMemory

标签 c int64

嘿伙计们,我想从我已经知道的 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/

相关文章:

c - C 中指针的哈希表?

c - 无法理解 "current"宏如何适用于 x86 架构

C curl /curl.h 错误

c - malloc 将内存转换为结构

c++ - 操纵 LARGE_INTEGERS

在 C 中检查自己的 pow 函数的限制?

Swift:将任何对象转换为 Int64 = nil

c++ - 大整数值的定义

c++ - 乘以 __int64

active-directory - 如何将 System.DirectoryEntry "uSNChanged"属性值更改为 Int64