- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
大家好,我想从我已经知道的 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/
我正在尝试在 Matlab 中使用 mex 编译一个库。我能够部分编译这个东西,但是在最后一个文件中,mex 给出了关于两行的错误: typedef __int64 LONG64; typedef _
我很惊讶地发现我的 C++ 编译器还支持 __int8、__int16、__int32 和 __int64;但我只看到它们等同于 char、short、int 和 long long。它们有什么区别?
我是一名优秀的程序员,十分优秀!