【问题标题】:How to find the base structure address with negative offsets如何找到具有负偏移量的基结构地址
【发布时间】:2016-05-23 07:18:18
【问题描述】:

我正在使用 CE 对旧游戏进行逆向工程。 我找到了修改单元HP的代码,但是我找不到基地址,因为偏移量是负数。

问题是我什至不知道它是如何工作的,这对我来说听起来很傻,为什么编译器/开发者会这样做呢?它是一种堆栈临时指针吗?有没有办法找到它? (我很确定有办法) 这很令人沮丧,因为我找到了诸如 ID、HP 之类的偏移量,但是基础......我通常对此没有问题,偏移量是正数。

我认为基础应该是[esi-STRUCTURE_SIZE] 最后一项是[esi]

或者我完全错了。

谢谢:)

【问题讨论】:

  • 这将有助于了解如何设置 esi。一个潜在的原因是,有时编译器会将基地址偏移到包含数组或其他子对象的开头。然后可以将原始寄存器重新用于其他目的。在字段访问方面,它只是从已知点的偏移量,无论是基地址还是子对象的地址,所以如果寄存器已经包含这样一个固定点,则可以使用它而不是重新加载原始基址。
  • 有点明白了,看起来有点扭曲。我已经检查了 esi 是如何设置的,我搜索了许多调用/返回,寄存器在不同调用中的 esi 和 ecx 之间移动,我无法得到它。似乎永远不会结束
  • 我有点糊涂了,你在找...什么的基地址?
  • 我实际上是在寻找一个对象的“基”地址。这里 esi-282 thingy 访问一个单位的 HP,但是我想访问第一项(结构的开始)以分析单位结构。通常经典指令看起来像mov [ecx+F5],ebx,基地址是ecx,第一个字段/项目/属性[eax]。顺便说一句,我在一个老游戏上这样做是因为我发现游戏是学习和分析的好方法。
  • 函数 prolog 中的 ecx 复制到不可回收的寄存器是很常见的,例如 esi、edi、ebx 或 ebp。这将在其他函数调用中保留其值,这些函数调用预计会丢弃 ecx(以及 eax 和 edx)的内容。对于类成员函数,ecx 将包含this 指针。我希望在那一点和您发布的代码之间会发生任何偏移。回溯到调用者函数是出乎意料的。我现在的另一个想法是多重继承。将对象转换为不同的类型可以偏移基地址。

标签: assembly reverse-engineering cheat-engine


【解决方案1】:

当使用多重继承时,负偏移量通常用于从子类指针访问基类成员。编译器将知道完整的布局,而不是先向上转换指针,而是直接访问基类的成员。

从生成的代码中无法知道类实例在内存中的起始位置。然而,通常应该可以通过跟踪对负地址成员的访问来找到基指针。毕竟,程序员可能创建了层次结构来访问基成员,而与它们的确切派生类型无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多