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

C++ Read Memory Address / Pointer & 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
    }
}

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

提前谢谢你,

我假设您想将指针增加 OFFSETBASETIME 字节。如果是这样,您的代码不会以字节为基础递增。相反,它增加了 sizeof(DWORD) * OFFSET 字节。

原因是基本指针类型是 DWORD*,并且将这种类型的指针递增 n 将使您距离起点 n * sizeof(DWORD)。这将无法完成工作。

最简单的解决方案是在进行指针运算时转换为 char *,这样递增 sizeof(char),而不是 sizeof(DWORD):

 DWORD *BaseTimeAddress = (DWORD*)((char *)BaseAddress + BASETIME);
 time = (float*)((char *)BaseTimeAddress + OFFSET);

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

谢谢 PaulMcKenzie 我明白了,

所以对于像我这样挣扎的人来说,这是实际工作的最终代码:

//Offsets
#define BASETIME 0x0158069C
#define OFFSET 0x14

void CurrentTime() {

    DWORD* BaseAddress = (DWORD*)GetModuleHandle(NULL);
    DWORD* address = (DWORD*)((char*)BaseAddress + BASETIME);
    address = (DWORD*)((char*)*address + OFFSET);
    float currentTime = *(float*)address;

    if (address && currentTime)
    {
        std::cout << endl <<"----------------" << endl;
        std::cout << "Base Address : " << BaseAddress << endl;
        std::cout << "----------------" << endl;
        std::cout << "Time Address : " << address << endl;
        std::cout << "----------------" << endl;
        std::cout << "Time Value : " << currentTime << endl;
        std::cout << "----------------" << endl << endl << "#> ";
    }

}