4

GetOpenFileNameAとGetSaveFileNameAを呼び出す古いアプリケーションがあります。どちらの呼び出しも誤りです。アプリケーションがクラッシュします!OllyDbgとAPIMonitorを使用して、OPENFILENAME構造体に格納されているサイズを読み取りました。構造体のサイズは76バイトです(Windows 7 x64でテスト)。GetOpenFileNameAまたはGetSaveFileNameAが呼び出されているときに、アクセス違反の例外が発生します。実行時にウィンドウが76バイトではなく88バイトを読み取ろうとしていると思います。これを見てください:http: //dotnetbutchering.blogspot.de/2007/10/vc-60-getting-0xc0000005-access.html およびこの http://www.asmcommunity.net/board/index.php?topic = 5768.15

調査を行ったところ、次の動作が検出されました。MicrosoftSpy ++の実行中に、アプリケーションがクラッシュしない!! デバッガーをステップスルーしたところ、アクセス違反の例外が引き続き発生しているのに、どういうわけか例外が飲み込まれていることがわかりました。アプリケーションは正常に動作します!ファイルの読み込みと保存ができます。

私は次の考えを持っています。それらについてどう思いますか?

  1. sthを書く。Spy++と同じように動作するLoader.exeのように。両方のAPIが呼び出されたときにアクセス違反の例外を飲み込む。

  2. DLLインジェクションとAPIフックを使用します。GetOpenFileNameとGetSaveFileNameをカスタムDLLのカスタム実装にフックすることができます。私の実装では、構造体を修正し、修正した構造体を元のAPI呼び出しに渡します。

  3. SetWindowsHookを使用してウィンドウメッセージをフックしますか?!?!?!

  4. バイナリファイルにパッチを適用します。HEXエディターを使用してパッチを適用することで、この構造体サイズの問題を修正することはできますか?

どちらが機能しますか?どうすればこれを修正できるか、もっと良いアイデアがありますか?

この古いアプリケーションのソースコードを取得できません。既存のバイナリを使用して修正する必要があります。私のソリューションは、少なくともWindowsXPとWindows7(x86、x64)で動作する必要があります

ツールPEiDは、古いアプリケーションに関する次の情報を表示します。リンカー情報:2.55 MS Visual C ++ 4.0

4

2 に答える 2

1

(1)実行するのが難しい純粋なハック(Spy ++の動作のどの側面を実行しますか?または完全なSyp ++を再発明したいですか?)であり、それを実行したとしても、アプリケーションが正しく動作することをどのように確認できますか(すべての入力に対して)「飲み込まれた例外」の後?プログラムの内部状態は未定義であり、後で他の問題を引き起こす可能性があります。

(2)ソースがないため、通常の方法で修正できないと仮定すると、このIMHOはこの問題の最善の回避策のようです。

(3)これがどのように役立つかわかりません。

(4)可能ですが、おそらく多くの作業が必要です。スタックにいくつかのデータがあると仮定して、それらの1つ(OPENFILENAMEA構造体)のサイズを変更することにより、他のオフセットを移動して、それらへの参照を「修正」する必要があります。

于 2012-05-24T14:44:38.770 に答える
1

構造体のサイズは76バイトです(Windows 7 x64でテスト)。GetOpenFileNameAまたはGetSaveFileNameAが呼び出されているときに、アクセス違反の例外が発生します。実行時にウィンドウが76バイトではなく88バイトを読み取ろうとしていると思います。

あなたが見るならば、OPENFILENAME structあなたは気づくでしょう:

#if (_WIN32_WINNT >= 0x0500)
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)

32ビットプログラム(VC ++ 4は64ビットターゲットをサポートしていませんでした)では、これは正確に12バイトの違いに変換されます。発信者によって適切に設定されている限りlStructSize、これはまったく問題にはなりません。procdumpMicrosoft / Sysinternalsから使用して、正確な状態のミニダンプを取得する(またはデバッガーを接続して調査する)ことは価値があるかもしれません。発生する例外は、必ずしもstructサイズが原因である必要はありません。もしそうなら、この機能の下位互換性に関しては、Microsoftがボールを落とした可能性が高いです。明らかOPENFILENAME::lStructSizeに、のバージョン管理のためにあり、struct遭遇したことが起こらないようにするためにあります。しかし、それでは、Windows2000より前の時代からコンパイラ/リンカーで構築されたプログラムについて話しています。

sthを書く。Spy++と同じように動作するLoader.exeのように。両方のAPIが呼び出されたときにアクセス違反の例外を飲み込む。それは公正な点です。例外処理をトップレベルに挿入すると、やりたいことができますが、例外の正確な原因(つまり、どの正確なメモリが上書きされたか)によっては、副作用が発生する可能性があります。

DLLインジェクションとAPIフックを使用します。GetOpenFileNameとGetSaveFileNameをカスタムDLLのカスタム実装にフックすることができます。私の実装では、構造体を修正し、修正した構造体を元のAPI呼び出しに渡します。これは最初のものとほとんど関係があります。あまり邪魔をせずに動作を修正できるので、全体として最も簡単で安全だと思います。以下をさらにお読みください。また、NInjectLibもチェックしてください。

SetWindowsHookを使用してウィンドウメッセージをフックしますか?!?!?!DLLの注入を容易にする以外にそれがどのように役立つかわかりません(1.および2の場合)。

バイナリファイルにパッチを適用します。HEXエディターを使用してパッチを適用することで、この構造体サイズの問題を修正することはできますか?これは、OPENFILENAMEがバイナリ内にあるか(初期化されたデータ)、スタックにあるか、またはヒープに割り当てられるか(簡単)によっては、最も難しい場合があります。


1.と2の可能なハイブリッドアプローチの1つは、次のとおりです。

  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options実行しているプログラムにちなんで名付けられたサブキーを追加します(例foo.exe
  2. その新しく作成されたサブキー内に名前を付けたREG_SZ値を作成し、その値を、ここで簡単に説明しようとするプログラムに設定します。Debugger

これにより、この古いアプリケーションのデバッガーが効果的にセットアップされます。これは、これから作成するデバッガーが、アプリケーションのコマンドラインを引数として受け取ることを意味します。エンドユーザーに対して透過的であり、ニーズに合わせて調整できるので便利です。

デバッガーを作成する必要があります。Win32が提供するデバッグヘルパーを使用できるため、このタスクは最初に思われるほど厄介ではありません。要点はデバッガーループにあります。CreateProcess一般に、デバッグできるように適切なフラグを渡すことを使用して、ターゲットプロセスを自分で作成します。使用WaitForDebugEventContinueDebugEvent実行の制御。すべての実用的な目的で、デバッガーループはまったく必要ない場合があります。これは、ターゲットアプリケーションのメインスレッドを一時停止して作成し(CREATE_SUSPENDEDに渡すCreateProcess)、最初にメインスレッドのを独自のコードにポイントしてCONTEXTから、を呼び出すことができるためです。 ResumeThread(pi.hThread)。このようにして、メインスレッドが開始する前に完了します。kernel32.dllただし、これにより、方法が原因で問題が発生する可能性があります。CreateThread動作します(これには、新しいスレッドをWin32サブシステム(別名)に登録することが含まれますcsrss.exe)。そのため、代わりにメモリ内のターゲットのIATなどにパッチを適用することをお勧めします。結局のところ、あなたは単に2つの機能に興味があるだけです。

トピックの詳細については、ここここの2つの記事を確認してください。

PyDbg私は、PaiMeiに基づいてデバッガーを作成することを好みますが、そのようなPythonベースのデバッガーをで使用しようとしたことはありませんImage File Execution Options

于 2012-05-24T16:03:56.063 に答える