用指针帮助

逆向工程 十六进制 十六进制 作弊引擎
2021-06-30 03:26:15

对不起这个愚蠢的问题。已经很晚了,我已经被困在这里一段时间了,所以我希望这里有人可以轻松回答这个问题。

在 CheatEngine 中,028FA190+374 指向 028F1788。当我在计算器中输入 028FA190+374 时,我得到 28FA504。有人可以解释我为什么这不同吗?

图片1

图2

1个回答

它是不同的,因为它不仅是0x28FA190 + 0x374,而且是*(0x28FA190 + 0x374)

0x28FA190是一个基地址,可能是一个结构,并且0x374是一个偏移量,当您对这些值求和并取消引用结果时,您将获得0x374距该结构开头字节数的字段值这个字段似乎是一个指针,这就是为什么它的值也是一个地址,但它可以包含任何值。

struct A
{
  char padding[0x374]; // occupy the first 0x374 bytes, so that myPointer's address is address of this structure + 0x374 (i.e. (DWORD)this + 0x374)

  int* myPointer;
};

A a;

int valueOfMyPointer = **(int**)((DWORD)&a + 0x374); // valueOfMyPointer = *a.myPointer;

由于指针运算,您需要显式转换&aDWORD(又名unsigned long) - 如果您这样做&a + 0x374,结果实际上是(DWORD)&a + 0x374 * sizeof(a).

您还可以从屏幕上编写整个表达式,如下所示:

uint32_t result = *(DWORD*)(*(DWORD*)((DWORD)GetModuleHandle("ac_client.exe") + 0x374) + 0x14);