問題タブ [detours]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
929 参照

c++ - _thiscallをフックとして迂回して使用する(GCC呼び出し規約)

私は最近、迂回機能(Linuxのみ)に取り組んでおり、これまでのところ大きな成功を収めています。これを見つけるまで、私は自分の迂回クラスを開発していました。私はコードを少し現代化し、それをC ++に変換しました(もちろんクラスとして)。このコードは、他の迂回実装と同じように、元の関数アドレスを、自分で指定した「フック」関数のJMPに置き換えます。また、元の関数の「トランポリン」を作成します。

すべてが完璧に機能しますが、簡単な調整を1つ行いたいと思います。私は純粋なC++でプログラミングし、グローバル関数を使用せず、すべてがクラスに囲まれています(Java / C#のように)。問題は、この迂回方法が私のパターンを壊してしまうことです。「フック」関数は静的/非クラス関数である必要があります。

私がやりたいのは、_ thiscallフックのサポートを実装することです(これは、GCC _thiscall規則を使用すると非常に簡単になるはずです)。_thiscallフックで動作するようにこのコードを変更することに成功していません。最終結果として私が欲しいのは、これと同じくらい単純なものです。PatchAddress(void * target, void * hook, void * class);。私は誰かにこれをしてくれるように頼んでいませんが、私の問題を解決/アプローチする方法を知りたいですか?

私が知っていることから、「パッチ」サイズを増やすだけでよく(つまり、5バイトになり、さらに5バイトが必要ですか?)、JMP呼び出しを使用する前に(フック関数に対して)、 'this'ポインターをスタックにプッシュします(これは、メンバー関数として呼び出したかのようになります)。説明する:

'jmp'を直接/のみ呼び出す代わりに。それは正しいアプローチですか、それとも考慮に入れる必要のある他の何かがありますか(注:VC ++ _thiscallのサポートについては気にしません)?

注:これが上記のコードの私の実装です:ヘッダーソースlibudis86を使用します

0 投票する
1 に答える
1020 参照

c++ - C++および完全に動的な関数

迂回路に問題があります。ご存知のように、迂回路は5バイトのスペース間でのみ移動できます(つまり、「jmp」呼び出しと4バイトのアドレス)。このため、クラス(メソッド)に「hook」関数を含めることはできません。スペースが不足しているため、「this」ポインタを指定できません(問題について詳しく説明します)。ですから、私は一日中解決策についてブレインストーミングを行ってきました。そして今、私はこのテーマについてあなたの考えを求めているので、それが可能かどうかわからないまま3〜5日間のプロジェクトを開始しません。

最初は3つの目標がありました。「フック」関数をクラスメソッドにし、アプローチ全体をオブジェクト指向(静的関数やグローバルオブジェクトなし)にし、最悪/最も難しい部分を完全に動的にしました。これは私の(理論上)解決策です。アセンブリを使用すると、実行時に関数を変更できます(完璧な例は迂回方法です)。では、関数を動的に変更できるので、それらを動的に作成することもできないのでしょうか。例えば; たとえば、最大30バイト(malloc / newを介して)にメモリを割り当てます。すべてのバイトを異なるアセンブリ演算子(0xE9は'jmp'など)に対応する2進数に置き換えてから、アドレスを直接呼び出すことはできませんか(関数が含まれているため)。

注:戻り値と、迂回したいすべての関数へのすべての引数を事前に知っています。GCCを使用しているため、thiscall規約は実質的に_cdeclのものと同じです。

これが私の考え/間もなく実装されるものです。'Function'クラスを作成します。このコンストラクターは、可変個引数を取ります(ターゲット関数の戻り値を記述する最初の引数を除く)。

各引数は、フックが受け取る引数の説明です(サイズ、およびポインターであるかどうか)。それで、のFunctionクラスを作成したいとしましょうint * RandomClass::IntCheckNum(short arg1);。次に、私はこのようにする必要があります:Function func(Type(4, true), Type(4, true), Type(2, false));。ここで、「タイプ」はとして定義されType(uint size, bool pointer)ます。次に、アセンブリを介して、引数の数と合計サイズを計算できるため、関数を動的に作成できます(注:これはすべて_cdecl呼び出し規約を使用します)。

編集:この例でType(4, true)は、は戻り値(int *)であり、scondType(4, true)はRandomClass'this'ポインターでありType(2, false)、最初の引数(short arg1)を記述します。

この実装では、クラスメソッドをコールバックとして簡単に使用できますが、大量のアセンブリコードが必要になります(これは特に経験がありません)。結局、動的ではないのは、コールバッククラスのメソッドだけです(これには、コールバックの前後も必要です)。

だから私は知りたかった。これは可能ですか?それにはどれくらいの作業が必要でしょうか、そして私はここで頭を悩ませていますか?

編集:私がすべてを少し曖昧に提示した場合は申し訳ありませんが、もっと徹底的に説明したいことがあれば、尋ねてください!

EDIT2:すべてのアセンブリ演算子の16進値をどこかで見つけることができるかどうかも知りたいですか?リストは1トンに役立ちます!および/またはasm( "");を何らかの方法で「保存」できる場合。メモリアドレスのコード(私は非常に疑わしい)。

0 投票する
1 に答える
1265 参照

c++ - トランポリンがバウンドしません (迂回、C++、GCC)

私はすべての質問で Stackoverflow を悪用しているように感じますが、結局のところ Q&A フォーラムです :) とにかく、私はしばらく回り道を使用してきましたが、まだ独自のものを実装していません (ラッパーを使用しました)。ついさっき)。私は自分のコードを完全に制御したいので (そうでない人はいないでしょうか?)、完全に機能する detour'er を自分で実装することにしました。これにより、コードのすべてのバイトを理解できるようになります。

コード (以下) は可能な限り単純ですが、問題はそうではありません。迂回路 (つまり、自分の関数へのフック) を正常に実装しましたが、トランポリンを実装できませんでした。

トランポリンを呼び出すたびに、使用するオフセットに応じて、「セグメンテーション違反」または「不正な命令」のいずれかが表示されます。ただし、どちらの場合も同じように終了します。「コアダンプ」。「相対アドレス」を混同したためだと思います(注:私はLinuxにかなり慣れていないため、GDBを習得するにはほど遠いです)。

sizeof(jmpOp)コードでコメントされているように、 (66 行目) に応じて、不正な命令またはセグメンテーション違反が発生します。当たり前のことでしたらすみません、夜更かししてしまいました...

参考までに、これは通常の実行中の出力です (上記の正確なコードを使用)。

れは、66 行目で +/- sizeof(jmpOp) を使用した場合の結果です。

注:Ubuntu 32ビットを実行しており、コンパイルしますg++ global.cpp main.cpp -o main -Iinclude

0 投票する
3 に答える
1677 参照

c++ - 仮想機能と迂回

私は最近、回り道とそれに付随するすべてを使ってプログラミングしています。私は多くの異なる機能を迂回しました。thiscall、stdcall、cdecl、仮想関数など。しかし、私が管理していないことが 1 つあります (これは不可能かもしれません)。それは、基本クラスの仮想関数をフックすることです。例えば; 仮想関数 (empty) を宣言する Car クラスがありますDrive。次に、 car を継承して を実装する他の 3 つの car クラスがありますDrive

Car の (基本クラス)Drive関数を (単純な「jmp」フックを使用して) フックすると、基本関数呼び出さない場合Car、の子孫によってトリガーされますか?Drive

さらに徹底的に説明するには:

それで、基本メソッドが呼び出されたのか、それとも何らかの方法でフックできるのか疑問に思っていますか? 関数の実行は直接ジャンプしますか、それとも何らかの方法でクラスLamborghini::Driveを通過するCarので、子孫が呼び出すたびに検出できますDriveか?

編集:そして、基本クラス関数が空の場合、5 バイトのスペースが必要なので、それをフックすることさえ可能ですか?

0 投票する
1 に答える
1861 参照

c++ - 迂回-クラスメンバー関数をフックする-ターゲットの関数オフセットを設定するための構文?

非クラス関数の場合-迂回する関数のオフセットを次のように宣言するだけです。

さて、これはクラスのメンバー関数を迂回することで難しくなります-迂回にはこれのサンプルがあります:

https://github.com/microsoft/Detours/blob/master/samples/member/member.cpp

そのサンプルはすでにターゲットメンバー関数を定義しています-しかし、DLLを注入するバイナリimのオフセットしか知らないので、これを変換するにはどうすればよいですか?

このようなものに:

ここでコンパイルエラーが発生します

ヒントはありますか?

0 投票する
4 に答える
4075 参照

c++ - 挿入されたDLLを介したメンバー関数の迂回

元の投稿:

挿入されたDLL内からメンバー関数を迂回しようとしています。フックしようとしている関数のアドレスを取得しましたが、迂回ライブラリを介してフックするための適切な構文または方法を理解できません。エラーを表示している行にエラーメッセージを付けてコメントしました。

メンバー関数フックの迂回例のソースを読みました。これがこのコードの基になっていますが、何らかの理由で機能していません。

どんな助けでも大歓迎です、ありがとう!

解決:

0 投票する
2 に答える
2233 参照

c++ - WriteFile フックがファイル操作への書き込みをキャッチしない

テキストデータをファイルに書き込むアプリがあります。私がやろうとしているのは、書き込みプロセスをフックすることです。私は、MS Detours、CreateFile、WriteFile、および WriteFileEx 関数に夢中になりました。CreateFile はこれらのテキスト ファイルの作成/オープンを適切にキャッチしますが、WriteFile のフックはキャッチしません。他の多くのものをキャッチしますが、これらはキャッチしません。フックは正常に機能しています。私はそれらをチェックしました。

また、Process Monitor は、これらの書き込み操作を WriteFile 操作 (adv 名は IRP_MJ_WRITE および FASTIO_WRITE) として表示します。これは、自分で何かを書いているときと同じです (操作フックを使用すると適切に動作します)。

何が起きてる?WriteFile 以外に何かをファイルに書き込む方法はありますか?

0 投票する
0 に答える
197 参照

c++ - Direct3D 関数へのポインター

私はコードを持っています:

TrueSetWindowText winapi 関数 SetWindowText へのポインター。次に私はそれを使用しますすべてが正常に動作します。

Direct3D 機能を試してみることにしました。追加:

D3DX11CreateShaderResourceViewFromFileへのポインター。プロジェクトをコンパイルすると、エラーが発生します。

プロジェクトのプロパティ、VC + + ディレクトリで、次を追加しました。

インクルード ディレクトリ C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include

Lib Dirs C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x86

このエラーが表示される理由を知っている人はいますか?

0 投票する
2 に答える
524 参照

c++ - LoadLibraryAを迂回するときにappcrash

関数がアプリに呼び出されないようにするために、LoadLibraryAを迂回しました。これは、「dllインジェクション」をブロックすることを目的としています。これらを見たことがない場合は、有名なCDetourライブラリを参照してください。

ライブラリのロード関数をフックし、正常に戻ることもできます。また、不明なdllがメモリにロードされるのをブロックします。任意のヒント?

0 投票する
2 に答える
256 参照

c++ - 仮想テーブルの変更による迂回に関する質問

Microsoft Detours と同じアプローチを使用して迂回を練習してきました (最初の 5 バイトを jmp とアドレスに置き換えます)。最近、仮想テーブルを変更して迂回することについて読んでいます。前述の方法と比較して、この方法の長所と短所をいくつか挙げて、誰かがこの問題に光を当てることができれば幸いです!

また、パッチを適用した vtable とスタック上のオブジェクトについてもお尋ねしたいと思います。次の状況を考慮してください。

この場合、元の関数 (つまりメソッド)foo->Call()を呼び出しMyCall(Foo * object)ながら呼び出すことになります。これは、可能な場合、コンパイラがコンパイル時に仮想呼び出しを決定しようとするためです (間違っている場合は修正してください)。スタック上のオブジェクトを使用する限り (ヒープが割り当てられていない場合)、仮想テーブルにパッチを適用するかどうかは問題ではないということですか?foo2.Call()Foo::Call(void)