c - 使用偏移量取消引用多级指针的最简洁方法是什么?

标签 c pointers reverse-engineering memory-editing

我目前正在内存编辑一款名为 Assault Cube 的游戏。不幸的是,由于动态内存分配,我想要编辑的值的地址在每次游戏启动时都会发生变化。幸运的是,有一些静态指针总是指向动态地址。使用 Cheat Engine ,我可以找到指针,但它们有时会达到 8 个级别。我宁愿做:*pointer,而不是每次都做********pointer。最重要的是,它们有偏移量,因此对它们进行硬编码将是一场噩梦。

相反,我正在使用这个函数:

int* getLowestPointer(int** highestPointer, int levels, int offsets[])
{
    for (int i = 0; i < levels; i++) {
        highestPointer = (int**) (*highestPointer + offsets[i]/sizeof(int)); // I am dividing by sizeof(int) here to undo pointer arithmetic (since the offsets are the difference between the offsetted pointer and the base pointer - not in integer increments)
    }
    return (int*) highestPointer;
}

但它非常困惑,我将 int* 转换为 int** ,反之亦然,这被认为是不好的做法。我可以做一些不会导致不良实践的事情吗?我还在网上找到了这个:

DWORD FindDmaAddy(int PointerLevel, DWORD Offsets[], DWORD BaseAddress)
{
    DWORD Ptr = *(DWORD*)(BaseAddress);
    if(Ptr == 0) return NULL;

    for(int i = 0; i < PointerLevel; i ++)
    {
        if(i == PointerLevel-1)
        {
            Ptr = (DWORD)(Ptr+Offsets[i]);
            if(Ptr == 0) return NULL;
            return Ptr;
        }
        else
        {
            Ptr = *(DWORD*)(Ptr+Offsets[i]);
            if(Ptr == 0) return NULL;
        }
    }
    return Ptr;
}

我认为这比我写的还要丑陋。我不建议您阅读它,除非您想偏头痛。

最佳答案

我不确定“最干净的方式”,但除了取消引用这些指针之外,你无能为力。我建议使用 typedefs 只是为了让您的代码更具可读性。

也不必担心将 int * 转换为 int **。当然,这被认为是“不好的做法”,但如果您知道自己在做什么,那么它可能正是所需要的。你只需要小心。

typedef int *** intPtr3;
typedef int ****** intPtr6;

您还可以使用一些宏来清理语法。这将是一个很好的例子,智能地使用宏来提高可读性和整洁性,并减少出错的机会:

#define DEREF6( PTR ) \
  ******(PTR)

最后,我经常使用一个很好的宏来在内存中移动指针一定数量的字节:

#define PTR_ADD( PTR, OFFSET ) \
   (((char *)(PTR)) + (OFFSET))

关于c - 使用偏移量取消引用多级指针的最简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256902/

相关文章:

c - 在 C 中打印简单的二叉搜索树

c - 为什么二进制搜索数组比二进制搜索树快一点?

C 编程 - 二维数组求和

assembly - 如何简化引用自身作为参数的函数? (这是什么意思)

android - 所有组件 id 更改为随机数

c - 以特殊格式输出一些值

检查 C 中括号是否平衡

assembly - 早期BIOS如何使用CALL?

字符指针和 IF 语句

java - 如何使用 JNA 将指向结构体数组的指针传递给 java 中的函数?