2010-12-02 38 views
2

(MS回り道で)私は、DLLを持っていると私はDetourAttachExを使ってトランポリン関数を作成する方法は?

  • のdllは、Windowsの一部ではない、そのエクスポートされた機能の一つに迂回を作成したいです。
  • 私の迂回の後に実際の関数を呼び出すことができる必要があります(実際の関数を迂回したものから呼び出す)
  • 私は関数の正確な署名を知っています。
  • 私はすでに機能を迂回することができましたが、今は本当のものを呼び出すことができません。

私はトランポリン機能を使用する必要があることを認識しています。私はオンラインの例を見ました。 問題は:すべてのそれらの例は、Windows API関数を迂回する方法を示して、私は徹底的にDLLのインポートを取得する関数のために同じことをする必要があります。

任意のヘルプはちょうど明確にする

--edit を歓迎されるだろう、私はそのポインタによって元の関数を呼び出すことを試みてきたが、それは動作しません。 も、このスタックオーバーフローからでもクラッシュしないarticle

をメソッドを使用してみましたが、それは無限ループ(元の関数に迂回1へのジャンプがあるので、私は仮定)

にに入るように見えます

編集完了! 解決したことがわからない、 thisを参考にしてください。

  • コード(私は問題の原因となったものは何でも掃除かなり確信して)

作品、 おかげでとにかく

+0

迂回路の意味を定義してください。また、私はプロのソフトウェアエンジニアとして十年以上に渡って "トランポリン機能"という言葉を聞いたことがないことを認めなければなりません。あなたのコードからサードパーティのDLLで関数を呼び出そうとしているのであれば、ヘッダファイル、LIBファイル、およびOLE/COM/CLR DLLかどうか、あるいは、ない。 – AlastairG

+0

さて、私はDetoursとOMGについて、Googleでどんな恐ろしいものがあるのか​​を読んだ。誰か(Microsoft?)が実際にライブラリを書いたとは思えないのですか? A)ウイルスをプログラムに付けること、B)Windowsが正常に動作するようにハッキングすること。あなたは正確に何を達成しようとしていますか?私が読んだところでは、関数がどこから来るのかに違いはないはずです。あなたには何が間違っていますか? – AlastairG

+0

ほとんどの人は、単にデバッグとロギングに使用します。私はそのDLLの機能の1つをフィルタリングしようとしています。 – user527744

答えて

4

Iドンをクリーンアップ

  • 代わりgetProcadderを使用して停止し、代わりにDetourFindFunctionを使用して開始しました迂回路を使用しないでください(私は実際にそれを嫌う!)が、ホットパッチの適用不可能な機能を迂回することは一般的な方法で行うことができます:

    Sstep 1: JMP <your code>を関数の先頭に挿入すると、5バイトがかかります。おそらく、最も近い命令に合わせるにはもう少し多くなります。一例として

    機能の開始は、フックします

    SUB ESP,3C 
    PUSH EDI 
    PUSH ESI 
    //more code 
    

    はなる:

    JMP MyFunction 
    //more code 
    

    1がこれを行うと、最初のバイトで0xE9を書き込むことによって、その後に値(function_addr - patch_addr + sizeof(INT_PTR))を書きますDWORDに続いて。書き込みが読み取り/書き込み/ 2 VirtualProtectEx

    ステップで実行権限を設定した後WriteProcessMemoryを使用して行われるべきである: 次の、我々は、アセンブリ・インターフェースを作成します。

    void __declspec(naked) MyFunc() 
    { 
    
        __asm 
        { 
         call Check    ;call out filter func 
         test eax,eax   ; test if we let the call through 
         je _EXIT 
         sub esp,3c    ; its gone through, so we replicate what we overwrote 
         push edi 
         push esi 
         jmp NextExecutionAddress ; now we jump back to the location just after our jump 
        _EXIT: 
         retn     ; note, this must have the correct stack cleanup 
        } 
    
    } 
    
    NextExecutionAddressがModuleBase + RVAを使用して、実行時に満たされる必要があります


    は、その方法がより簡単に、より良い、正直に言うと(!)だけを呼び出すいただきました!のインポートテーブルをフック(エクスポートアドレステーブル)EAT dllファイル、またはIAT(インポートアドレステーブル)のエクスポートテーブルをフックしますフィルタリングする機能。 Detoursには、これらのタイプのフックのための関数があるはずです。もしそうでなければ、他の自由に利用できるlibsがあります。

    もう1つの方法は、dllを使用してアプリケーション内のすべての呼び出しを独自のコードでプロキシ関数に再ルーティングするためにdetourを使用することです。これは、特定の呼び出しのみをフィルタリングできるという利点があります。バイナリを介して(これは同じことを可能にする_ReturnAddressを使用して同じことが可能ですが、それはより多くの作業)、欠点は、(私はollydbg +カスタムパッチエンジンを使用して)パッチを適用する場所をキャプチャしていると、 (Watcomでは#pragma auxで作成されたものや、VC7 +によって生成された最適化された呼び出しなど)。

    注意すべき重要なこと:あなたは、マルチスレッドアプリケーションをフックしている場合、あなたのパッチがアプリ中断して行う必要があり、またはInterlockedExchangeInterlockExchange64InterlockedExchangePointer(私はすべてのIAT/EATフックのために後者を使用するを使用attomically行われ、特にあなたがにリンクポストを見て)「サードパーティのプロセスのから


    をフック、そこに方法は主に、私の意見ではassmeblyによる恐ろしいのとき:Pしかし、どのようにこのポインタを呼んでいますあなたは得て、それはどのように得られますか?

  • +0

    GetProcAddressはDetourAttachの最初のパラメータです。私は古いポインタをグローバル関数ポインタに保ちます。 – user527744

    +0

    @ user527744: 'DetourAttach'で返されたポインタが迂回が始まるアドレスにあるため、無限ループを作成するように聞こえます。上記の例を参照してください。 :) – Necrolis

    +0

    あなたが提案したものに似た何かを実装していたのに、私が最初にプロジェクトを始めたとき、しかし私はそのようなアプローチを使わないことに決めました。アセンブリに直接書き込むことは危険です。マルチスレッドプロセスでは困難です。私はx64を恐れ、Assemblyコマンドのサイズにどのような影響を与えるのでしょうか。あなたの答えはありがたいですが、私が探している答えは、detours api(またはそのようなもの)を使用するものです – user527744

    関連する問題