试图在二进制文件中理解Delphi mov ebx,eax

时间:2013-09-24 02:06:08

标签: delphi x86

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

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

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

提前感谢您的帮助!

Javo

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;

1 个答案:

答案 0 :(得分:2)

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

  

我相信它是(1)从hex文件中获取偏移量然后(2)创建某种指针以(3)拉出名字和姓氏。

完全,完全,完全错误地看待它。您的3个假设中没有一个看起来是正确的。遗憾。

只有{em>一个出现mov ebx, eax,它位于顶部。其目的是保护eax初始值,这在Delphi-assembly中很重要,因为它包含一个指向调用此代码的类实例的指针。

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

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

此片段中未出现的另一个典型用法是初始值允许访问类的虚拟方法表,即为其定义的完整功能列表。该表由第一个值[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. 使用该对象的VMT指针加载ecx
  4. 调用该对象的函数#$ 64。
  5. 现在,您在哪里看到对“名字和姓氏”的引用?仅作为类成员变量

    Reference to control TEditPlayerMain.FirstNameTxt : TcxTextEdit

    Reference to control TEditPlayerMain.LastNameTxt : TcxTextEdit

    这些是控件发生的窗口或对话框中,带有名字'FirstNameTxt'和'LastNameTxt'。两者都是(显然)TcxTextEdit字段,首先用一些function_X(0)调用,然后

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

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

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


    ¹但无论如何,它的评论很好。这似乎不是由Delphi自己创建的本机asm代码,所以你使用哪个反编译器?