0

xbox 360 の 16 進数ファイルとフットボールの名簿ファイルを読み取るために使用されたコードをリバース エンジニアリングしようとしています。

Delphi に詳しい方で、以下のコードが正確に何をしているのかを理解していただけますか? 16進ファイルからオフセットを取得し、何らかのポインタを作成して姓名を取得していると思います。

手順全体をここに貼り付けましたが、主に 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

免責事項:私は特に「Delphiに精通している」わけではありません。しかし、私は何が起こっているのかをよく理解していますので、読んでください。

(1) HEX ファイルからオフセットを取得し、(2) ある種のポインターを作成して (3) 名と姓を取得することだと思います。

それは完全に、完全に、まったく間違った見方です。あなたの3つの仮定はどれも正しくないようです。ごめん。

は1回だけ出現mov ebx, eaxし、一番上にあります。その目的は、このコードを呼び出すクラスのインスタンスへのポインタを保持するため、Delphi アセンブリで重要なの初期値を保護することです。eax

は他の方法でも使用されるためeax(通常、別の関数の呼び出しからの戻り値を保持します)、コンパイラはこれをすぐに別のレジスタにebx格納します。一時的にローカル スタックに配置します。

あなたのクラスは呼び出されTEditPlayerMain、この逆コンパイラebx¹は、「TEditPlayerMain.xxxを制御するための参照」というコメントが付いた数行でクラスとして使用されることを認識します。これらは、名前で参照されるクラス メンバー変数であり、 : が指す位置に格納されます たとえば、 は を指します。ebx[ebx+$034C]TEditPlayerMain.lblHeight

このフラグメントには表示されないもう 1 つの典型的な使用法は、初期値により、クラスの仮想メソッド テーブル(クラス用に定義された関数の完全なリスト) へのアクセスを許可することです。このテーブルは最初の値 によって指されている[ebx]ため、VMT の 2 番目のメソッドを「呼び出す」コードは次のようになります。

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 フィールドであり、最初にいくつかの で呼び出され 、次にfunction_X(0)

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

このダイアログがどのようなものかはわかりませんが、ヘッダー付きの 2 つのテキスト編集フィールドで、ヘッダーは「Multi」と「Player」に設定されていると思います。function_X(0)テキストフィールドの内容をクリアすることは非常によくあります。

したがって、このコードは「16 進ファイルからオフセットを取得」せ(実際には「16 進」のものはすべて、この単一のクラス内で定義されているものです)、ポインターを作成しませ(この単一のクラス内のクラス メンバー オブジェクトへのいくつかをフェッチするだけです)。 )、「姓名」は処理されませんが、そのように名前が付けられたメンバー変数がいくつかある場合を除きます。


¹しかし、とにかくうまくコメントされた出力です。これは、Delphi 自体によって作成されたネイティブの asm コードではないようですが、どの逆コンパイラを使用しましたか?

于 2013-09-24T21:05:36.610 に答える