2010-11-30 5 views
4

私は再び壁に向かって運転し、いくつかの低レベルのものであなたの助けが必要です。私はすでに輸出されたDLL関数(with this code btw.)をターゲットプロセスに注入することでフックすることに成功しました(例えば、をuser32.dllから簡単に迂回することができます)。残念ながら私は別のシナリオを狙っています:実行可能ファイル内に定義された関数を迂回する必要があります私のコードを注入しています。アプリケーションはOpen-Sourceですので、フックするために必要な機能についてはすべて知っていますが、バイナリは証明書で署名されているため、自分のバージョンをコンパイルできません。実行時に関数のアドレスを取得することは可能ですか、別の手法で回避することはできますか?ターゲットは「通常の」32ビットWindowsバイナリbtwです。特別なことは何もない私は思っ;)EXEファイルでフック/迂回する機能アドレスを見つける方法は?

ユアーズ、 Nefarius

EDIT:多分による私のラメ英語に私はので、ここで、少しのサンプルコードは十分詳細ではなかった:今

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    foo(); 
} 

BOOL foo(char* someData) 
{ 
    return printf("%s", someData); 
} 

私はダイナミックライブラリに存在しない関数foo()を迂回したい。これは私の問題です。私はそれが私がそう思っているようにうまくいくかどうか分かりません。

編集:今私はそれが可能であることを知っているので、重要な質問はどのように変更されましたか?私は必要な情報をどのように入手するのですか。関数のアドレス?

+1

件名に[タグ]入れないでください、特にときそれらをタグ領域に配置しています。 – abelenky

+0

アップ、ありがとう! – Nefarius

答えて

0

私は最善の解決策、いくつかの低レベルのWindows API関数をフックして、私の目的はありません取得しますが、それは動作しますが、アセンブラは私ではありません...

+0

私が探していた実際の答えが不足しているような気がします。 –

1

もちろん、Ollydbgのようなものを使用してブレークポイントを設定し、実行可能ファイルがロードされて(そして証明書のチェックが完了した)アセンブリを編集してください。これを永久に行うにはもう少し難しいですが、証明書のチェックがどれほど洗練されているかによって、そのコードをNOP(操作なし)に置き換えるだけでそのコードをバイパスすることができます。

編集: 64ビット版のWindowsを使用している場合は、マイクロソフト自身のDebugging Toolsで運がよいかもしれません。私はそれらを使ったことがないので、Ollydbgとどう比較するか分かりません。

+0

ああ、私はそれを気にしません:-)私はちょうどバイナリ自体にハードコードされた関数の(int)戻り値が必要です。私はOllyDbg btwを試しました。しかし私はWin7 x64を持っています... * XPでVBoxを起動します* – Nefarius

+0

@Nefaurius:何が問題なのですか?なぜそれをパッチしないのですか? – ruslik

+0

@Ruslik:簡単な答え:どのように?私は逆アセンブル/デバッグ/リバースの経験がないことを認めなければならないので、かなりヘッドレスATMです。 – Nefarius

1

jauntを1回以上デバッグしている場合は、フック機能のAPI Microsoft Detoursを参照してください。

+0

私はすでに関数をフックする方法を知っており、動作します。私は、実行可能ファイル内で定義された非動的関数をフックする方法を知りません。 – Nefarius

+1

@Nefarius:それらをフックすることは同じです。唯一の課題は、エクスポートテーブルにないため、それらを見つけることです。しかし、あなたが言ったように:あなたはすべての情報を持っています。関数の場所をハードコードするか、.MAPファイルを解析することができます。 – MSalters

+0

よかった、良い。だから私の次の課題は、関数のアドレスを取得することです。あなたは私のヒントを持っていますか(例、チュートリアル、何にリンクしていますか?)、そんなに感謝します。申し訳ありませんが、私はこれをどのように実行するのか分かりません。 – Nefarius

0

関数アドレスを取得してから、プロシージャの関数エントリポイントにjmpを挿入し、元のprocを元に戻して元の関数に戻る必要があります。

+1

ここでパッチツールをチェックしてください。正確にこれを行う: http://comrade.ownz.com/projects/petools.html –

+0

ありがとう!非常に興味深いですが、私はまだ私の注入されたコードから関数を迂回する方法を知らない。私は問題なくDLLのエクスポートされた関数をフックすることができますが、フックするDLLがないので、私は関数のアドレスが必要です... – Nefarius

0

EasyHookを使用してください。そのライブラリを使用すると、そのアドレスで関数をインターセプトできます。

+0

私はEasyHookを知っています。 – Nefarius

+0

EasyHookで関数のアドレスを取得できません。アドレスは関数自体です(リンカーの最適化でコンパイルされていない場合)。 EasyHookにアドレスとして&fooを渡す必要があります。 –

関連する問題