2011-08-15 12 views
1

このボードの最初の質問は、すでにかなり長いものです - それは残念です(そして、このプラットフォームから得た素晴らしいヒントをお寄せいただきありがとうございます) 。アセンブラ "コール"命令を使用したMicrosoft Detour - Hook関数

私はいくつかの関数をフックしようとしています(多かれ少なかれプラグインのコードなので、フックしたい関数は書き込まれません/私は変更できませんが、同じプロセス/スレッドで直接アクセスできます) Microsoft Detoursと一緒に。そして、あなたには、いくつかのレジスタがスタックにプッシュされて見ることができるように

045A1A85 push  ebp 
045A1A86 push  ebx 
045A1A87 push  esi 
045A1A88 push  edi 
045A1A89 call  045A1A8E 
045A1A8E pop   eax 
045A1A8F mov   ebx,eax 
//go on with a little bit more assembler code 

、および:

夢中にされなければならないすべての関数はCスタイルのコンパイラによって生成され、常に次のアセンブラ「スタートアップ」コードを持っていますコール命令は次の行に呼び出されます(すでにこのコードが生成されていないため、これを変更するように要求しないでください)。フッキング機能は次のように定義される

045A1A85 jmp   hooking_function (528040h) 
045A1A8A int   3 
045A1A8B int   3 
045A1A8C int   3 
045A1A8D int   3 
045A1A8E pop   eax 

: - コール命令スタックを変更し、このスタックの変更は、EAXレジスタに保存され、更なる処理のために使用される(!!!)

このメソッドはにフックしますトランポリン機能にちょうどジャンプする裸の機能。

031F0060 push  ebp 
031F0061 push  ebx 
031F0062 push  esi 
031F0063 push  edi 
031F0064 call  045A1A8E 
031F0069 jmp   045A1A8E 

主な問題である、トランポリンアセンブラコード 1)におけるコール命令は、この場合(スタックに間違った値を加算すること031f0064た:以下のトランポリン機能付き

__inline __declspec(naked) void hooking_function() 
{ 
    //more code in future 
    __asm { 
     jmp org_func_trampoline 
    } 
} 

045A1A89の代わりに) - > eaxでのさらなる処理は間違った結果を受け取ります 2)多かれ少なかれスタックフレームを破壊します。次の "ret"は "031F0069"に戻るでしょう==>同じ処理が2回行われます。 retはもう一度呼び出され、間違った関数につながります..

フックしたいすべての関数が上記のプリアンブルで始まることは保証されませんので、私はフック関数を書き直すことはできませんトランポリンメソッド...

このテキストの後の基本的な質問 Microsoft Detourと関数をフックすることはできますか?関数の最初の5バイトで呼び出し命令が呼び出されますか? (ない場合は、いずれかの選択肢があるのですか?)

は読むためどうもありがとうございました(そして、できればあなたの助けのための)

+0

アドレスとすべてが比較的正しいですか?フックしようとしている関数が次の命令を呼び出すのはなぜですか( 'call 045A1A8E')? –

+0

トランポリンを正しく呼んでいる限り、Detoursは最初の5バイトにコールを持っている機能をフックできます。 –

+0

@セスカーネギー答えに感謝します。私の知る限り、関数はレジスタeipにアクセスしようとします。これは、次の行を呼び出して可能であり、スタックを(直接ではなく)読み込みます。 – TechMuc

答えて

1

元のコードを取得するだけの簡単な方法です

045A1A89 call  045A1A8E 
045A1A8E pop   eax 

を行い、 eip登録の内容pop eaxはすぐにスタックから戻りアドレス(045A1A8E)を削除し、実行時点でeaxeipの値に設定します。

迂回は明らかにこれを知る方法がないし、任意のサブルーチンのようにそれを扱うので、eax(異なるeip)の異なる値をもたらすであろうトランポリンからcall 045A1A8Eを行います。

私はそれが031F0069に戻ってくる理由を完全にはわかっていません。

したがって、はいです。これは非常に特殊なケースです。 Detoursは通常、最初のいくつかの命令の中で呼び出しを持つ関数を完全にフックできます。これはちょうど不都合な方法でそれらを分割するためにDetoursのためのこれらの2つの命令を完全に配置することができました。

関連する問題