typedefまたはインラインを使用してC ++でこのx86ASMCALLを呼び出すにはどうすればよいですか

user3435580

この呼び出しsub_10636F0は、ターゲットアプリケーションに挿入されたC ++ DLLから呼び出す方法を見つけようとして、5つの異なる場所で見つかりました。これにより、そのアプリケーションのすべての呼び出しに完全にアクセスできます。

私はそれが完全であるように、これらの呼び出しのほとんどがその上の別の呼び出しの直後に切り取られると呼ばれるすべての場所のチャートを持っていました。

このテーマに関するstackoverflowに関するたくさんの質問を読んだところ、Necrolisからいくつかの良い答えが見つかりました。EDXの場合は__fastcallを使用できます。私はグーグルでECXについて調べましたが、それは__fastcallにも使用されているようですので、ECXまたはEDXのどちらかが__fastcallを意味します。

ただし、呼び出す関数はラッパーを使用します

sub     esp, 5F4h
add     esp, 5F4h
retn    8

SUB ESP, XXX最初とADD ESP, XXX最後に_cdecl変換にのみ使用される思う大量の調査を再度行うことについて、これが何であるかはわかりません。

私の現在のコードは次のようになります

typedef void(__fastcall *TThreeParamter)(int, int, int);
typedef void(__fastcall *TTwoParamter)(int, int);
typedef void(__fastcall *TOneParamter)(int);
typedef void(__fastcall *TZeroParamter)();

TTwoParamter sub_10636F0 = (TTwoParamter)(DWORD)GetModuleHandle(NULL) + 0xC636EF;

//the call
sub_10636F0(0x11223344, 0x55667788);


0xC636EFが10636F0サブと異なる理由を聞かないでください。デバッガーで検査すると、サブは正しいサブに入ります。プログラムが再起動されるたびにサブは動き続けます。これは保護のようです。メソッド、またはおそらくこのプログラムが50を超えるdllをロードし、アドレスを移動する必要があるためです。

私はすべての異なる構成を試しました。2int、3intは何も機能しません。


IDAは、このメソッドを3つのパラメーターとして検出しますが、最後のパラメーターは、逆コンパイルされた疑似コードのどこにも使用されていません。

擬似コードは次のようになります(__thiscallから_fastcallに変更するなど、大幅な変更を加えました)

IDAからの擬似コード

//probably wrong.. packet is a variable not a parameter which will crash
void __fastcall sub_10636F0(int var1)
{
  __int128 v1; // xmm0@0
  int v2; // esi@1
  int v3; // ebx@1
  SOCKET v4; // ebp@1
  int v5; // eax@2
  int v6; // ecx@3
  int v7; // [sp+8h] [bp-5FCh]@7
  char a2a[1492]; // [sp+10h] [bp-5F4h]@2
  int v9; // [sp+5E4h] [bp-20h]@2
  int v10; // [sp+5E8h] [bp-1Ch]@2
  struct _FILETIME SystemTimeAsFileTime; // [sp+5F0h] [bp-14h]@2
  __int16 v12; // [sp+5F8h] [bp-Ch]@2
  int packet; // [sp+608h] [bp+4h]@0
  int to; // [sp+60Ch] [bp+8h]@0

  v2 = to;
  v3 = var1;
  v4 = *(_DWORD *)(packet + 220);
  if ( v4 != -1 )
  {
    //snipped lots of code
  }
}

//probably wrong.. packet is a variable not a paramter which will crash
void __fastcall sub_10636F0(int var1, int var2)
{
  __int128 v2; // xmm0@0
  int v3; // esi@1
  int v4; // ebx@1
  SOCKET v5; // ebp@1
  int v6; // eax@2
  int v7; // ecx@3
  int v8; // [sp+8h] [bp-5FCh]@7
  char a2a[1492]; // [sp+10h] [bp-5F4h]@2
  int v10; // [sp+5E4h] [bp-20h]@2
  int v11; // [sp+5E8h] [bp-1Ch]@2
  struct _FILETIME SystemTimeAsFileTime; // [sp+5F0h] [bp-14h]@2
  __int16 v13; // [sp+5F8h] [bp-Ch]@2
  int packet; // [sp+608h] [bp+4h]@0
  int to; // [sp+60Ch] [bp+8h]@0

  v3 = to;
  v4 = var1;
  v5 = *(_DWORD *)(packet + 220);
  if ( v5 != -1 )
  {
    //snipped lots of code
  }
}

//this looks the best, but still `to` isn't detected as paramter

void __fastcall sub_10636F0(int var1, int var2, int var3)
{
  __int128 v3; // xmm0@0
  int v4; // esi@1
  int v5; // ebx@1
  SOCKET v6; // ebp@1
  int v7; // eax@2
  int v8; // ecx@3
  int v9; // [sp+8h] [bp-5FCh]@7
  char a2a[1492]; // [sp+10h] [bp-5F4h]@2
  int v11; // [sp+5E4h] [bp-20h]@2
  int v12; // [sp+5E8h] [bp-1Ch]@2
  struct _FILETIME SystemTimeAsFileTime; // [sp+5F0h] [bp-14h]@2
  __int16 v14; // [sp+5F8h] [bp-Ch]@2
  int to; // [sp+60Ch] [bp+8h]@0

  v4 = to; //still doesn't detect this..
  v5 = var1; //okay this isn't bad another parameter
  v6 = *(_DWORD *)(var3 + 220); //like this detects this as parameter class atleast 
  if ( v6 != -1 )
  {
    //snipped lots of code
  }
}

これはIDAがデフォルトで推奨するコードです

char __userpurge sub_10636F0@<al>(int a1@<ecx>, __int128 a2@<xmm0>, int a3, int a4)
{
  int v4; // esi@1
  int v5; // ebx@1
  SOCKET v6; // ebp@1
  int v7; // eax@2
  int v8; // ecx@3
  int v9; // eax@8
  char v11; // [sp+8h] [bp-5FCh]@7
  int v12; // [sp+10h] [bp-5F4h]@4
  int v13; // [sp+24h] [bp-5E0h]@2
  int v14; // [sp+28h] [bp-5DCh]@2
  int v15; // [sp+2Ch] [bp-5D8h]@2
  int v16; // [sp+30h] [bp-5D4h]@2
  char v17; // [sp+34h] [bp-5D0h]@2
  signed int v18; // [sp+5E4h] [bp-20h]@2
  int v19; // [sp+5E8h] [bp-1Ch]@2
  int v20; // [sp+5F0h] [bp-14h]@2
  __int16 v21; // [sp+5F8h] [bp-Ch]@2

  v4 = a4;
  v5 = a1;
  v6 = *(_DWORD *)(a3 + 220);
  if ( v6 == -1 )
    return 0;

   //Snipped code

  if ( v9 >= 0 && v9 == *(_DWORD *)(v4 + 1492) )
    return 1;
  return 0;
}



ASMの機能

.text:010636F0 ; void __fastcall sub_10636F0(int var1, int var2, int var3)
.text:010636F0 sub_10636F0     proc near               ; CODE XREF: sub_1062960+E0p
.text:010636F0                                         ; sub_10637E0+D4p ...
.text:010636F0
.text:010636F0 a2              = byte ptr -5F4h
.text:010636F0 var_20          = dword ptr -20h
.text:010636F0 var_1C          = dword ptr -1Ch
.text:010636F0 SystemTimeAsFileTime= _FILETIME ptr -14h
.text:010636F0 var_C           = word ptr -0Ch
.text:010636F0 var_4           = dword ptr -4
.text:010636F0 packet          = dword ptr  4
.text:010636F0 to              = dword ptr  8
.text:010636F0 test            = dword ptr  0Ch
.text:010636F0
.text:010636F0                 sub     esp, 5F4h
.text:010636F6                 mov     eax, ___security_cookie
.text:010636FB                 xor     eax, esp
.text:010636FD                 mov     [esp+5F4h+var_4], eax
.text:01063704                 push    ebx
.text:01063705                 push    ebp             ; a5
.text:01063706                 push    esi             ; a4
.text:01063707                 mov     esi, [esp+600h+to]
.text:0106370E                 push    edi             ; a3
.text:0106370F                 mov     edi, [esp+604h+packet]
.text:01063716                 mov     ebx, ecx
.text:01063718                 mov     ebp, [edi+0DCh]
.text:0106371E                 cmp     ebp, 0FFFFFFFFh
.text:01063721                 jz      loc_10637BB
        SNIP TONS OF CODE HERE
.text:010637BB
.text:010637BB loc_10637BB:                            ; CODE XREF: sub_10636F0+31j
.text:010637BB                                         ; sub_10636F0+BDj ...
.text:010637BB                 xor     al, al
.text:010637BD
.text:010637BD loc_10637BD:                            ; CODE XREF: sub_10636F0+C9j
.text:010637BD                 mov     ecx, [esp+604h+var_4]
.text:010637C4                 pop     edi
.text:010637C5                 pop     esi
.text:010637C6                 pop     ebp
.text:010637C7                 pop     ebx
.text:010637C8                 xor     ecx, esp
.text:010637CA                 call    @__security_check_cookie@4 ; __security_check_cookie(x)
.text:010637CF                 add     esp, 5F4h
.text:010637D5                 retn    8
.text:010637D5 sub_10636F0     endp ; sp-analysis failed



ASMでのこの関数の呼び出し

.text:010638B0                 push    esi             ; packet
.text:010638B1                 push    ebx             ; this
.text:010638B2                 mov     ecx, ebp        ; this
.text:010638B4                 call    sub_10636F0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.text:01062A2E                 mov     byte ptr [esi+5E9h], 1
.text:01062A35
.text:01062A35 loc_1062A35:                            ; CODE XREF: sub_1062960+C1j
.text:01062A35                 add     dword ptr [esi+5D4h], 2
.text:01062A3C                 push    esi             ; packet
.text:01062A3D                 push    edi             ; this
.text:01062A3E                 mov     ecx, ebx        ; this
.text:01062A40                 call    sub_10636F0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.text:01063AF4                 mov     eax, [ebx+1128h]
.text:01063AFA                 mov     [esp+1A4h+var_AC], eax
.text:01063B01                 push    esi             ; packet
.text:01063B02                 lea     eax, [esp+1A8h+to]
.text:01063B06                 push    eax             ; this
.text:01063B07                 mov     ecx, ebx        ; this
.text:01063B09                 mov     [esp+1ACh+var_4], 1
.text:01063B14                 call    sub_10636F0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.text:01089145 loc_1089145:                            ; CODE XREF: sub_10890B0+4Fj
.text:01089145                                         ; sub_10890B0+67j
.text:01089145                 mov     ecx, [edi+110h] ; this
.text:0108914B                 push    esi             ; packet
.text:0108914C                 push    edi             ; this
.text:0108914D                 call    sub_10636F0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.text:01089CBA                 mov     ecx, [esi+110h] ; this
.text:01089CC0                 push    edi             ; packet
.text:01089CC1                 push    esi             ; this
.text:01089CC2                 call    sub_10636F0
マットピーターソン

これが何であるか私にはわかりません。SUB ESP, XXX最初とADD ESP, XXX最後に_cdecl変換のためだけに使用されている思うたくさんの研究を行っています。

いいえ、ローカル変数を使用するすべての関数に使用されます(正確な方法はわずかですが、スタックスペースはESPから減算して割り当て、スタックポインターに同じ量を追加して「解放」する必要があります。

ただし、RET 8実際には、呼び出し規約がでは_cdeclなく、スタックが呼び出し先によってクリーンアップされる規約であることを示しています。あり、いくつかの異なる呼び出し規約、これを一致させるが、私はそれがC ++のコードだ気持ちと、それになるだろうメンバ関数を持っているthiscall-あなたがしたいことから、それは少し難しいシミュレートするために作るんようthisECX

ret 8関数は、引数の8バイトの価値は、その2持っていることを述べているintvoid *の変数を。

これを行う簡単な方法があると私は確信していません。あなたはこのようなことをすることができるかもしれません。class X2つの引数を取る仮想関数を使用してを作成します

class X
{
   virtual void Func(int x, int y) { }
};

次に、コンパイラがvtableを配置funcする場所を特定し、クラスの空の実装ではなく、ターゲット関数を指すようにvtableを変更します。

これで、を使用Xしてインスタンスを作成できます。

 X* p = new X;

次に、を呼び出しますfunc

 p->func(1, 2);

ただし、運が悪ければ、コンパイラはvtableをいじったことに気づかず、関数を直接呼び出すことになります。したがって、個別のコンパイルやその他のものを使用して、いくつかのトリックを行う必要がある場合があります。

言い換えれば、あなたはあなたの仕事を切り取っています。しかし、少し騙す必要がなければ、リバースエンジニアリングはまったく面白くありません。

もちろん、詐欺師の方法は、次のようにインラインアセンブラを数行書くだけです。

void CallMyFunc(void *func, int a, int b, int c)
{
    __asm(mov ecx, a
          push b
          push c
          call *func);
}

[Windowsインラインアセンブリコードを最後に作成してから約10年です。構文が正しくない場合は、お詫びします。「大まかなスケッチ」と見なし、実際にコンパイルされるまで変更してください...]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

呼び出し__x86.get_pc_thunk.axを取り除くにはどうすればよいですか

分類Dev

このコンストラクタをJavaで呼び出すにはどうすればよいですか?

分類Dev

Raspberry piのARMアセンブリを使用してCライブラリからputcharを呼び出すにはどうすればよいですか?

分類Dev

この属性をifステートメントに呼び出すにはどうすればよいですか?

分類Dev

jqueryでこれを使用して要素を呼び出すにはどうすればよいですか?

分類Dev

これらの変数をmainで呼び出すにはどうすればよいですか?

分類Dev

このjavascript関数でそれ自体を呼び出すにはどうすればよいですか?

分類Dev

iOS8のviewDidLoad()でこの関数を呼び出すにはどうすればよいですか?

分類Dev

このAJAX呼び出しから結果を返すにはどうすればよいですか?

分類Dev

haskellでこの関数を呼び出すにはどうすればよいですか?

分類Dev

パイプラインを使用してクラスを呼び出すように、forループを使用して複数の関数を呼び出すように変更するにはどうすればよいですか?

分類Dev

この関数の呼び出しを単純化するにはどうすればよいですか?

分類Dev

イベントハンドラーを使用して5つのJQueryAJAX呼び出しを作成するにはどうすればよいですか?

分類Dev

JMenuItemを使用してメインメニュークラスに別のクラスを呼び出すにはどうすればよいですか?

分類Dev

(C ++初心者)これらのクラス関数をメインに呼び出すにはどうすればよいですか?

分類Dev

この関数を正しく呼び出すにはどうすればよいですか?

分類Dev

承認とクライアントIDを使用してC#でAzure Maps APIを呼び出すにはどうすればよいですか?

分類Dev

この関数を特定の回数呼び出すにはどうすればよいですか?

分類Dev

onReceiveメソッド呼び出しのこのSwiftコンパイラエラーを修正するにはどうすればよいですか?

分類Dev

この配列を呼び出すにはどうすればよいですか?

分類Dev

2つのonClickJavaScript呼び出しを呼び出すにはどうすればよいですか?

分類Dev

'--help'が呼び出されたことを検出するにはどうすればよいですか?

分類Dev

mvcで指定された間隔の後にajaxを使用してコントローラーを呼び出すにはどうすればよいですか?

分類Dev

両方が同じonclickにバインドされているときに、次の呼び出しを開始する前にajax呼び出しの結果が到着したことを確認するにはどうすればよいですか?

分類Dev

このタイプのメニューを作成し、Androidでホバーアクションを呼び出すにはどうすればよいですか?

分類Dev

SKSpriteNodeのSwiftで完了ハンドラーを使用して連続した関数呼び出しを行うにはどうすればよいですか?

分類Dev

Bash:コマンドラインでスクリプトを呼び出して2つの文字列を渡すにはどうすればよいですか?

分類Dev

構造体の寿命を延ばして、tokio :: runを呼び出すことができるようにするにはどうすればよいですか?

分類Dev

他のイベントメソッドを呼び出すにはどうすればよいですか?

Related 関連記事

  1. 1

    呼び出し__x86.get_pc_thunk.axを取り除くにはどうすればよいですか

  2. 2

    このコンストラクタをJavaで呼び出すにはどうすればよいですか?

  3. 3

    Raspberry piのARMアセンブリを使用してCライブラリからputcharを呼び出すにはどうすればよいですか?

  4. 4

    この属性をifステートメントに呼び出すにはどうすればよいですか?

  5. 5

    jqueryでこれを使用して要素を呼び出すにはどうすればよいですか?

  6. 6

    これらの変数をmainで呼び出すにはどうすればよいですか?

  7. 7

    このjavascript関数でそれ自体を呼び出すにはどうすればよいですか?

  8. 8

    iOS8のviewDidLoad()でこの関数を呼び出すにはどうすればよいですか?

  9. 9

    このAJAX呼び出しから結果を返すにはどうすればよいですか?

  10. 10

    haskellでこの関数を呼び出すにはどうすればよいですか?

  11. 11

    パイプラインを使用してクラスを呼び出すように、forループを使用して複数の関数を呼び出すように変更するにはどうすればよいですか?

  12. 12

    この関数の呼び出しを単純化するにはどうすればよいですか?

  13. 13

    イベントハンドラーを使用して5つのJQueryAJAX呼び出しを作成するにはどうすればよいですか?

  14. 14

    JMenuItemを使用してメインメニュークラスに別のクラスを呼び出すにはどうすればよいですか?

  15. 15

    (C ++初心者)これらのクラス関数をメインに呼び出すにはどうすればよいですか?

  16. 16

    この関数を正しく呼び出すにはどうすればよいですか?

  17. 17

    承認とクライアントIDを使用してC#でAzure Maps APIを呼び出すにはどうすればよいですか?

  18. 18

    この関数を特定の回数呼び出すにはどうすればよいですか?

  19. 19

    onReceiveメソッド呼び出しのこのSwiftコンパイラエラーを修正するにはどうすればよいですか?

  20. 20

    この配列を呼び出すにはどうすればよいですか?

  21. 21

    2つのonClickJavaScript呼び出しを呼び出すにはどうすればよいですか?

  22. 22

    '--help'が呼び出されたことを検出するにはどうすればよいですか?

  23. 23

    mvcで指定された間隔の後にajaxを使用してコントローラーを呼び出すにはどうすればよいですか?

  24. 24

    両方が同じonclickにバインドされているときに、次の呼び出しを開始する前にajax呼び出しの結果が到着したことを確認するにはどうすればよいですか?

  25. 25

    このタイプのメニューを作成し、Androidでホバーアクションを呼び出すにはどうすればよいですか?

  26. 26

    SKSpriteNodeのSwiftで完了ハンドラーを使用して連続した関数呼び出しを行うにはどうすればよいですか?

  27. 27

    Bash:コマンドラインでスクリプトを呼び出して2つの文字列を渡すにはどうすればよいですか?

  28. 28

    構造体の寿命を延ばして、tokio :: runを呼び出すことができるようにするにはどうすればよいですか?

  29. 29

    他のイベントメソッドを呼び出すにはどうすればよいですか?

ホットタグ

アーカイブ