是否所有类实例都有相对地址/偏移量,我可以制作任何类指针的副本吗?

逆向工程 反编译 C++ 抵消 虚表 作弊引擎
2021-06-26 23:53:34

我熟悉在游戏中查找玩家基指针以及其他值,以及查找偏移量等。我过去曾将其应用到我自己的一些代码中。

但是这种做法是否适用于任何类的实例?

这是一个示例程序。

using namespace std;

class A {
public:
    int i = 0;
    virtual void doThing() {
        i++;
        cout << i << endl;
    }

};

int main()
{
    A* a = new A();
    while (1)
    {
        a->doThing();
        Sleep(6000);
    }
    system("pause");
    return 0;
}

我使用作弊引擎iA::doThing. 然后我使用该选项来查找写入该地址的内容。从那里我发现似乎是一个偏移量,做了一个指针扫描,发现它example.exe+0x001A2EC是一个静态指针,并且其持有的值i在 offset 处0x4

example.exe+0x001A2EC被认为是指向类实例的指针A吗?

我想要做的基本上是复制目标程序指向 class 实例的指针A,然后在我自己的代码中访问它的 V-Table,该代码将被注入到进程中。

这就是我试图实现这一目标的方式。

DWORD Base = (DWORD)GetModuleHandle(0);
A* a = (A*)(Base + 0x1A2EC);
void** vtable = *(void***)a;

如果我的理解或方法有问题,请指出我做错了什么,或者建议一些其他方式,我可以获得指针的副本。

1个回答

我将从一些小的更正和澄清开始,以确保我们使用正确的术语和准确的定义。

我用作弊引擎查找该变量的地址iA::doThing

首先,i不是 method 的变量A::doThing这是一个成员的的A类。

然后我使用该选项来查找写入该地址的内容

这样做会为您提供方法A::doThing所在的地址具体来说,A::i在该方法中修改的地址

从那里我发现似乎是一个偏移量,做了一个指针扫描

我会假设你发现的偏移Ai的位置,但我不是100%我明白你说的“做了一个指针扫描”的意思。我假设您i从第一阶段找到的地址中减去 的偏移量(“我使用作弊引擎查找变量的地址i”)以获得对象本身的地址,然后搜索指向该地址的指针。

“example.exe”+0001A2EC 会被认为是指向 A 类实例的指针吗?

更准确地说,example.exe+0x001A2EC将是类型变量的地址A *(或指向A实例的指针),它的值将是返回的值new A();,即 class 的实例A,如您所料。读取它的值将指向该实例A当前在内存中的位置。

然而,您的几个假设可能会在不同版本之间发生变化,甚至对于同一代码库的不同编译版本。

示例代码中最明显的一点是,您正在使用可执行文件的图像库来访问主线程的 stack这可能会中断,具体取决于为您的进程分配堆栈的方式/位置,并且即使连续执行多次也可能不可靠,具体取决于操作系统和配置。

即使您以某种方式解决了这个问题,还有许多其他潜在的并发症和细微的变化可能会使您的生活更加艰难。仅举几例:

  1. 即使您使用的是进程的堆栈偏移量而不是图像基址,A指针变量所在的内存中的偏移量a也可能会发生变化。即使只是在相同二进制文件的不同执行之间例如,在您的情况下a存储在堆栈中,并且如果a可以在多个不同的流中调用定义的函数,则创建函数的堆栈帧堆栈深度a可能不同。如果a_creator可以在两个流程之一中调用函数main/a_creator并且main/game_load/a_creator根据情况(例如,如果您正在加载保存),则a_craetor的堆栈帧将开始的偏移量将不同。
  2. 由于在代码中添加了新成员,i位于A类内部结构中的偏移量可能会发生变化。虽然通常保持成员定义的顺序,但优化可能会改变它们以更好地对齐。不同的填充配置设置也可能会更改成员实际所在的位置。
  3. 不同的优化配置甚至可以完全消除变量a,只将其存储在非易失性寄存器中。例如,这很可能在您提供的示例实现中。
  4. 该程序的新版本可以轻松创建移动变量并更改代码,从而完全关闭位置。
  5. 继承和强制转换a可能会导致您找到与您正在寻找的 VTable 不同的 VTable,以及其他复杂情况。

我希望这不会阻止您追求目标,而是鼓励您更好地了解动态修补的内部结构和复杂的世界。

作为旁注,我将在许多游戏中包含有关反作弊检测工具的警告,这可能会使这些努力变得非常昂贵(帐户禁令等)。