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

标签 c++ pointers memory offset

所以,我已经将一个 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 检查它),但之后一切都是错误的,你能帮我吗?我坚持这个,我尝试了很多东西......:/

提前谢谢你,

最佳答案

我假设您想将指针增加 OFFSETBASETIME 字节。如果是这样,您的代码不会以字节为基础递增。相反,它按 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/

相关文章:

PHP:生产服务器上的内存使用率非常高,而本地计算机上的内存使用率很低

c++ - 创建可部署的 CMake 动态 SDL2 应用程序

c++ - 如何让几何形状的面积和周长起作用?

c++ - 在谈论 vector 中的对象时如何访问特定于派生类的方法和属性?

c++ - 如何在运行时确定 c++ 对象的内存

linux - 在不使用 drop_caches 的情况下清除/proc/meminfo 中的 "cached"内存

c++ - 安装 RPM 时对 libstdc++(GLIBCXX_...) 的依赖失败

pointers - golang如何用指针打印结构值

c++ - 数组指针类型

c++ - 如何将迭代器类型转换为其原始结构