我找到了一个汇编程序指令:mov [esi+2F],dl。我认为ESI是对结构或类的引用。 0x2F是引用结构/类的属性的偏移量。是否可以找到ESI寄存器的值?我认为此类是在游戏开始时初始化的。

例如,我试图逆转GTA San Andreas。 GTA SA的很多内存地址在这里。

我已经在此站点找到了以下信息:0xB6F5F0-播放器指针(CPed)。我现在发现。但是,如何在没有指针扫描的情况下使用作弊引擎之类的调试器找到它呢?我想在asm代码中找到地址。

我试图为指令设置断点。但是我认为这没用,因为ESI地址是动态的。据我了解,CPed struct / class使用动态内存分配。

我对我的英语不好对不起,并先谢谢。

评论

我有些困惑,“但是我如何使用调试器找到它”,您是否想在调试器或反汇编程序中找到ESI的值?由于struct / class的地址很可能是动态的,因此您将无法通过反汇编程序找到它。

@raz但是,由于游戏使用它,因此必须有一个静态位置来存储指针。

要么以“硬性”方式进行操作,要么回溯指令,直到找到对ESI的最后修改是什么,从而找到当时的价值。或者,您只需在调试器上放置一个断点,然后在此指令中读取ESI的值。您想静态执行此操作的任何特定原因?

@AcidShout为什么?如果是对象,则很可能在运行时分配该对象,并且二进制文件中不需要静态位置。除非它是全局变量,否则没有理由让它具有静态位置。

@raz您仍然具有存储指向所分配对象的指针的变量,您可以从那里获取它。并且该变量将是静态的

#1 楼

是的,有可能

我将向您解释大多数游戏的运行方式(我从未撤销过任何GTA,但我想无论如何我都想像这样)。 />我将介绍结构的静态和动态分配。


静态方式:

GlobalGameInfo g_info;
// ...
g_info.some_data = 1;


这是最终成为IDA中的静态偏移量,例如:

lea eax, [g_info + 0xAABB] ; suppose 0xAABB is the offset for 'some_data'
mov [eax], 1;


g_info始终保持相同的偏移量,因此一旦找到它,就可以使用g_info + offset来获取数据。动态方式:

Player* players; // can be defined as Player* players[<count>] or Player** players;
                 // it's the same
// ...
players = new Player[players_count];
// ...
players[1].alive = false;


然后将得到:

所以要在例如作弊引擎,您Add a new address,检查Pointer,添加xxxxdword_xxxx部分,然后在偏移量中放置所需的偏移量。
例如,要获取players[1].alive,而alive处于偏移量,例如0x100,您将计算:

; this is a static location which is actually the "players" variable
; and it contains an address which points to the offset in memory of the
; actual players structure
dword_xxxx dd ?


因此,如果dword_xxxx-> 0xAABBCCDDsizeof(Player)-> 0x204player_id-> 8offset-> 0x100 be:

value_stored_in_dword_xxxx + sizeof(Player) * player_id + 0x100



示例

由于您给了我们mov [esi + 0x2F], dl


>
esi是指向该结构的指针。在上面查看(在反汇编中)。




mov esi, dword ptr [dword_xxxx](最有可能)表示它正在取消引用指针,这意味着该结构是动态分配的。

mov esi, offset dword_xxxx(最有可能)意味着它只是将地址(xxxx部分)分配给esi,所以这是一个静态地址。

作弊引擎

在作弊引擎中,很容易输入指针和偏移量:



您会看到,0x5CCB138dword_xxxxdword_xxxx内部的值是0x09021A00,并且+ 0x142(我的偏移量)导致游戏中名称的开头。 />如果要以编程方式执行此操作,则可以在C中这样做:

0xAABBCCDD + (0x204 * 8) + 0x100
// ^base      ^size   ^id  ^offset