カスタムプロセスの状態を保存し、停止した時点から復元するアプリケーションに取り組んでいます。
現在、次の問題があります。システムが再起動すると、システム モジュールのすべてのベース アドレスがランダム化されます ( ntdll.dll
、kernelbase.dll
などkernel32.dll
)。OS は Windows 7 x64 Enterprise です。再起動後にアプリケーションを復元しようとすると、明らかにクラッシュします (ただし、再起動前の復元ポイントからは正常に機能していました)。これには2つの解決策があります:
- アプリケーションに読み込まれるときにシステム モジュールのアドレスを静的にする
- アプリケーション内のターゲット モジュールへのすべての参照にパッチを適用します (スタック上の関数のアドレス、ヒープに保存される可能性のあるアドレスなど)。
明らかに、2番目の方法は困難です。完全なアプリケーション分析を行い、コードをデータと区別し、システム モジュールへの参照から単純な整数である可能性があるデータを区別します...したがって、最初の方法を選択しました。
仮想メモリにモジュールをロードするとき、OS は最初に物理メモリにそのような名前のモジュールが既に存在するかどうかを確認します。存在する場合は、単にこのモジュールを仮想アドレス空間にマップします。この場合、 -from の場合、モジュールは最初の場所からロードされntdll.dll
ますC:\Windows\System32\ntdll.dll
。このモジュールをアプリケーション ディレクトリにコピーし、ASLR フラグを無効にし、イメージ ベースに何らかの値をパッチしても、このモジュールはシステム ディレクトリから読み込まれます。何らかのリダイレクト方法が必要です。
MSDNから、次のことがわかります (セクション「デスクトップ アプリケーションの検索順序」 )。
デスクトップ アプリケーションは、フル パスを指定するか、 DLL リダイレクトを使用するか、マニフェストを使用して、DLL のロード元の場所を制御できます。これらの方法のいずれも使用されていない場合、システムは、このセクションで説明されているように、ロード時に DLL を検索します。
したがって、目的を達成するには少なくとも 2 つの方法があります。
DLL リダイレクトに関するページには、次のように表示されます。
既知の DLL はリダイレクトできません。既知の DLL の一覧については、レジストリ キーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsを参照してください。システムは、Windows ファイル保護を使用して、サービス パックなどのオペレーティング システムの更新による場合を除いて、これらのようなシステム DLL が更新または削除されないようにします。
リダイレクトしたいモジュールは既知の DLL であるため、この亜種は適用できません。
マニフェストが残っています。それらの使用に関する優れた記事があります。この記事の著者は、元の DLL を置き換えるスタブ DLL を作成し ( user32.dll
)、この置き換えられた DLL をロードするアプリケーションを作成します。要点は、この DLL は、アプリケーションの開始時ではなく、インポートされた関数を検索するときにロードされるということですntdll.dll
。
より具体的には、「Windows Internals, Sixth Edition」の p.11 を参照してください。359 では、プロセス作成の詳細が説明されています。そこには7つの段階があります:
- パラメータとフラグの変換と検証
- 実行するイメージを開く
- Windows Executive Process オブジェクトの作成
- 初期スレッドとそのスタックおよびコンテキストの作成
- Windows サブシステム固有の初期化後の実行
- 初期スレッドの実行開始
- 新しいプロセスのコンテキストでプロセスの初期化を実行する
ここでの最も重要なポイント:
のマッピングは
ntdll.dll
ステージ 3 で発生します。ステージ 5 の開始時に、以下を読みました (強調は私のものです):
この時点で、Kernel32.dll は Windows サブシステムにメッセージを送信して、 マニフェスト ファイル、DLL リダイレクト パス、および新しいプロセスのプロセス外実行。
これは、ntdll.dll
リダイレクトが発生する前にロードされることを意味します。リダイレクトのトピックについては SO に関する多くの質問がありますが、それらはすべてLoadLibrary
、アプリケーションでリダイレクトが発生する可能性がある場合に、インポートされた関数の検索中に、または を介して明示的にロードされる DLL に関するものです。
ただし、ntdll.dll
いずれにしても非常に早い段階でアプリケーションに読み込まれます。
これまでに収集したすべての情報を使用して、たとえば、kernel32.dll
アプリケーションのディレクトリでアプリケーションを検索することができました (この段落のリンクを使用)。しかし、検索をリダイレクトできませんでしたntdll.dll
。
ユーザーモードからはまったく可能ですか?
PS ASLR をグローバルに無効にする方法があります。この投稿を参照してください。ただし、これは非常に失礼な方法です。 のようなアプリケーションInternet Explorer
はAdobe Reader
機能せず、OS 全体が脆弱性にさらされます。