0

我正在尝试对一些用于读取 xbox 360 的十六进制文件和足球名册文件的代码进行逆向工程。

熟悉Delphi的人能帮我理解下面的代码到底在做什么吗?我相信它是从十六进制文件中获取偏移量,然后创建某种指针来提取名字和姓氏。

我已将整个过程粘贴在这里,但我主要关注 FirstName 和 LastName 部分。

提前感谢您的帮助!

爪哇

procedure TEditPlayerMain._PROC_00697780(Sender : TObject);
begin
(*
00697780   53                     push    ebx
00697781   8BD8                   mov     ebx, eax
00697783   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.FirstNameTxt : TcxTextEdit
|
00697785   8B83AC030000           mov     eax, [ebx+$03AC]
0069778B   8B08                   mov     ecx, [eax]

* Possible reference to virtual method TcxTextEdit.OFFS_64
|
0069778D   FF5164                 call    dword ptr [ecx+$64]

* Possible String Reference to: 'Multi'
|
00697790   BA40786900             mov     edx, $00697840

* Reference to control TEditPlayerMain.FirstNameTxt : TcxTextEdit
|
00697795   8B83AC030000           mov     eax, [ebx+$03AC]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
0069779B   E874CEDDFF             call    00474614
006977A0   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.LastNameTxt : TcxTextEdit
|
006977A2   8B83A8030000           mov     eax, [ebx+$03A8]
006977A8   8B08                   mov     ecx, [eax]

* Possible reference to virtual method TcxTextEdit.OFFS_64
|
006977AA   FF5164                 call    dword ptr [ecx+$64]

* Possible String Reference to: 'Player'
|
006977AD   BA50786900             mov     edx, $00697850

* Reference to control TEditPlayerMain.LastNameTxt : TcxTextEdit
|
006977B2   8B83A8030000           mov     eax, [ebx+$03A8]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
006977B8   E857CEDDFF             call    00474614

* Possible String Reference to: 'Multi Player'
|
006977BD   BA60786900             mov     edx, $00697860

* Reference to control TEditPlayerMain.lblPlayerName : TLabel
|
006977C2   8B8300030000           mov     eax, [ebx+$0300]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
006977C8   E847CEDDFF             call    00474614
006977CD   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.cbJersey : TcxComboBox
|
006977CF   8B83A4030000           mov     eax, [ebx+$03A4]
006977D5   8B08                   mov     ecx, [eax]

* Possible reference to virtual method TcxComboBox.OFFS_64
|
006977D7   FF5164                 call    dword ptr [ecx+$64]
006977DA   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.numLabel : TLabel
|
006977DC   8B8388030000           mov     eax, [ebx+$0388]
006977E2   8B08                   mov     ecx, [eax]

* Reference to method TLabel.SetEnabled(Boolean)
|
006977E4   FF5164                 call    dword ptr [ecx+$64]
006977E7   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.lblJersey : TLabel
|
006977E9   8B8328030000           mov     eax, [ebx+$0328]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
006977EF   E820CEDDFF             call    00474614
006977F4   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.lblPosition : TLabel
|
006977F6   8B8324030000           mov     eax, [ebx+$0324]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
006977FC   E813CEDDFF             call    00474614
00697801   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.lblWeight : TLabel
|
00697803   8B8350030000           mov     eax, [ebx+$0350]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
00697809   E806CEDDFF             call    00474614
0069780E   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.lblHeight : TLabel
|
00697810   8B834C030000           mov     eax, [ebx+$034C]

* Reference to: Controls.TControl.SetText(TControl;TCaption);
|
00697816   E8F9CDDDFF             call    00474614
0069781B   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.tsAttributes : TcxTabSheet
|
0069781D   8B8360030000           mov     eax, [ebx+$0360]

* Reference to: ComCtrls.TCustomHeaderControl.SetHotTrack(TCustomHeaderControl;Boolean);
|
00697823   E83C48F0FF             call    0059C064
00697828   33D2                   xor     edx, edx

* Reference to control TEditPlayerMain.tsAbilities : TcxTabSheet
|
0069782A   8B8368030000           mov     eax, [ebx+$0368]

* Reference to: ComCtrls.TCustomHeaderControl.SetHotTrack(TCustomHeaderControl;Boolean);
|
00697830   E82F48F0FF             call    0059C064
00697835   5B                     pop     ebx
00697836   C3                     ret

*)
end;
4

1 回答 1

2

免责声明:我不是特别“熟悉德尔福”。但我很清楚发生了什么,所以请继续阅读。

我相信它是(1)从十六进制文件中获取偏移量,然后(2)创建某种指针以(3)提取名字和姓氏。

那是完全、完全、完全错误的看待它的方式。您的 3 个假设似乎都不正确。对不起。

只出现了一次mov ebx, eax,它就在顶部。它的目的是保护 的初始值eax这在 Delphi 汇编中很重要,因为它包含一个指向调用此代码的类的实例的指针。

由于eax也以其他方式使用(通常,它将保存调用另一个函数的返回值),编译器立即将其存储到另一个寄存器中——在这里ebx,尽管编译器可以自由选择任何空闲的寄存器,甚至存储它暂时在本地堆栈上。

您的类被称为TEditPlayerMain,并且这个反编译器¹识别ebx在几行中用作类 - 带有注释“引用控制 TEditPlayerMain.xxx”的那些。这些是按名称引用的类成员变量,并存储在:指向 位置,例如,指向.ebx[ebx+$034C]TEditPlayerMain.lblHeight

另一个没有出现在此片段中的典型用途是初始值允许访问类的虚拟方法表,即为其定义的完整函数列表。该表由第一个值 指向,[ebx]因此在 VMT 中“调用”第二个方法的代码类似于

mov eax, [ebx]
call dword ptr [eax+4]

您可以在您的行中看到此代码的变体

006977A0   33D2                   1. xor     edx, edx
006977A2   8B83A8030000           2. mov     eax, [ebx+$03A8]
006977A8   8B08                   3. mov     ecx, [eax]
006977AA   FF5164                 4. call    dword ptr [ecx+$64]
  1. 归零edx——这是以下函数调用的参数。
  2. eax使用指向类中的类对象的指针加载。
  3. ecx使用该对象的 VMT 指针加载。
  4. 调用该对象的#$64 函数。

现在您在哪里看到对“名字和姓氏”的引用?仅作为类成员变量

Reference to control TEditPlayerMain.FirstNameTxt : TcxTextEdit

Reference to control TEditPlayerMain.LastNameTxt : TcxTextEdit

这些是窗口或对话框内的控件,恰好带有名称“FirstNameTxt”和“LastNameTxt”。两者都是(显然) TcxTextEdit 字段,并且首先用 some 调用 function_X(0),然后

TControl.SetText(FirstNameTxt, 'Multi')
...
TControl.SetText(LastNameTxt,'Player')

我不知道这个对话框是什么样子的,但我认为它是两个带有标题的文本编辑字段,标题设置为“Multi”和“Player”。function_X(0)很可能是清除文本字段的内容。

所以这段代码不会从一个十六进制文件中获取偏移量”(所有那些“十六进制”的东西实际上都是在这个单一类中定义的),它不会创建指针(它只是获取一些,到这个单一类中的类成员对象),并且它不处理“名字和姓氏”,除了碰巧有一些这样命名的成员变量。


¹但无论如何,它的评论输出都很好。这似乎不是 Delphi 本身创建的本机 asm 代码,那么您使用的是哪个反编译器?

于 2013-09-24T21:05:36.610 回答