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

C++ Read Memory Address / Pointer & Offset

本文关键字:指针 偏移量 地址 读取 内存 C++      更新时间:2023-10-16

因此,我将DLL注入到进程(游戏)中,以便可以从进程内存中读取。

我想获取当前游戏时间,并且我使用作弊引擎找到了它的静态基址和偏移量:

"游戏.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是正确的(我可以用作弊引擎检查它),但在那之后一切都错了,你能帮我吗?我被困住了,我已经尝试了很多事情... :/

提前谢谢你,

我假设你想将指针增加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);

现在,无论你最终去哪里是你想要的数据,这是我无法回答的问题。 但是,如果您的目标是按字节递增,则应进行如上所示的更正。

谢谢保罗·麦肯齐,我明白了,

所以对于那些像我一样挣扎的人来说,这是真正起作用的最终代码:

//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 << "#> ";
    }
}