mov [esi+2F],dl
。我认为ESI是对结构或类的引用。 0x2F
是引用结构/类的属性的偏移量。是否可以找到ESI寄存器的值?我认为此类是在游戏开始时初始化的。例如,我试图逆转GTA San Andreas。 GTA SA的很多内存地址在这里。
我已经在此站点找到了以下信息:0xB6F5F0-播放器指针(CPed)。我现在发现。但是,如何在没有指针扫描的情况下使用作弊引擎之类的调试器找到它呢?我想在asm代码中找到地址。
我试图为指令设置断点。但是我认为这没用,因为ESI地址是动态的。据我了解,CPed struct / class使用动态内存分配。
我对我的英语不好对不起,并先谢谢。
#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
,添加xxxx
的dword_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
-> 0xAABBCCDD
,sizeof(Player)
-> 0x204
,player_id
-> 8
和offset
-> 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
,所以这是一个静态地址。 作弊引擎
在作弊引擎中,很容易输入指针和偏移量:
您会看到,
0x5CCB138
是dword_xxxx
,dword_xxxx
内部的值是0x09021A00
,并且+ 0x142
(我的偏移量)导致游戏中名称的开头。 />如果要以编程方式执行此操作,则可以在C中这样做: 0xAABBCCDD + (0x204 * 8) + 0x100
// ^base ^size ^id ^offset
评论
我有些困惑,“但是我如何使用调试器找到它”,您是否想在调试器或反汇编程序中找到ESI的值?由于struct / class的地址很可能是动态的,因此您将无法通过反汇编程序找到它。@raz但是,由于游戏使用它,因此必须有一个静态位置来存储指针。
要么以“硬性”方式进行操作,要么回溯指令,直到找到对ESI的最后修改是什么,从而找到当时的价值。或者,您只需在调试器上放置一个断点,然后在此指令中读取ESI的值。您想静态执行此操作的任何特定原因?
@AcidShout为什么?如果是对象,则很可能在运行时分配该对象,并且二进制文件中不需要静态位置。除非它是全局变量,否则没有理由让它具有静态位置。
@raz您仍然具有存储指向所分配对象的指针的变量,您可以从那里获取它。并且该变量将是静态的