このボードの最初の質問は、すでにかなり長いものです - それは残念です(そして、このプラットフォームから得た素晴らしいヒントをお寄せいただきありがとうございます) 。アセンブラ "コール"命令を使用した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バイトで呼び出し命令が呼び出されますか? (ない場合は、いずれかの選択肢があるのですか?)
は読むためどうもありがとうございました(そして、できればあなたの助けのための)
アドレスとすべてが比較的正しいですか?フックしようとしている関数が次の命令を呼び出すのはなぜですか( 'call 045A1A8E')? –
トランポリンを正しく呼んでいる限り、Detoursは最初の5バイトにコールを持っている機能をフックできます。 –
@セスカーネギー答えに感謝します。私の知る限り、関数はレジスタeipにアクセスしようとします。これは、次の行を呼び出して可能であり、スタックを(直接ではなく)読み込みます。 – TechMuc