我正在尝试对一些用于读取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;
答案 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]
edx
- 这是以下函数调用的参数。eax
。ecx
。现在,您在哪里看到对“名字和姓氏”的引用?仅作为类成员变量:
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代码,所以你使用哪个反编译器?