gpt4 book ai didi

c - 具有 __int64 地址的 ReadProcessMemory

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:03 27 4
gpt4 key购买 nike

大家好,我想从我已经知道的 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" );

最佳答案

您的问题是您试图将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com