所以,我已经将一个 DLL 注入(inject)到一个进程(一个游戏)中,以便我可以从进程内存中读取。
我想获取当前的游戏时间,我已经使用 Cheat Engine 找到了它的静态基地址和偏移量:
"游戏.exe"+0158069C
偏移量:14
这是我试图获取浮点值(当前游戏计时器)的代码:
//Offsets
#define BASETIME 0x158069C
#define OFFSET 0x14
void CurrentTime() {
float *time;
DWORD *BaseAddress = (DWORD*)GetModuleHandle(NULL);
DWORD *BaseTimeAddress = (DWORD*)(BaseAddress + BASETIME);
time = (float*)(BaseTimeAddress + OFFSET);
if (BaseTimeAddress && time) //Check the addresses, not values.
{
std::cout << "Base Address : " << BaseAddress << endl; // Correct
std::cout << "Base Time Address &: " << &BaseTimeAddress << endl; // Not correct
std::cout << "Base Time Address : " << BaseTimeAddress << endl; // Not correct
std::cout << "Time Value : " << *time << endl; // Not correct
}
}
基地址的 cout 是正确的(我可以用 Cheat Engine 检查它),但之后一切都是错误的,你能帮我吗?我坚持这个,我尝试了很多东西......:/
提前谢谢你,
最佳答案
我假设您想将指针增加 OFFSET
和 BASETIME
字节。如果是这样,您的代码不会以字节为基础递增。相反,它按 sizeof(DWORD) * OFFSET
字节递增。
原因是基本指针类型是 DWORD*
,并且将这种类型的指针递增 n
将使您达到 n * sizeof(DWORD)
从一开始。这不会完成这项工作。
最简单的解决方案是在进行指针运算时转换为 char *
,这样增量将按 sizeof(char)
而不是 sizeof (双字节)
:
DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
time = (float*)((char *)BaseTimeAddress + OFFSET);
现在,您最终到达的位置是否是您想要的数据,这是我无法回答的问题。但是,如果您的目标是在字节基础上递增,那么您应该进行如上所示的更正。
关于C++ 读取内存地址/指针和偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29957789/