C++读取内存地址/指针和偏移量

Aei*_*uch 4 c++ memory pointers offset

所以,我已经在一个进程(游戏)中注入了一个DLL,以便我可以从进程内存中读取.

我想获得当前的游戏时间,并且我已经使用Cheat Engine找到了它的静态基地址和偏移量:

"的Game.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
    }
}
Run Code Online (Sandbox Code Playgroud)

基地址的cout是正确的(我可以用Cheat Engine检查),但在那之后一切都错了,你能帮助我吗?我坚持这个,我尝试了很多东西......:/

先感谢您,

Pau*_*zie 5

我假设你想增加你的指针OFFSETBASETIME字节.如果是这样,您的代码不会以字节为单位递增.相反,它按sizeof(DWORD) * OFFSET字节递增.

原因是基本指针类型是DWORD*,并且递增此类型的指针n将使您n * sizeof(DWORD)远离开始.这不会起作用.

最简单的解决方案是char *在执行指针运算时转换为a ,以便增量继续sizeof(char),而不是sizeof(DWORD):

 DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
 time = (float*)((char *)BaseTimeAddress + OFFSET);
Run Code Online (Sandbox Code Playgroud)

现在,无论你最终到底是你想要的数据,这是我无法回答的.但是,如果您的目标是以字节为单位递增,那么您应该进行如上所示的更正.