3

カスタムプロセスの状態を保存し、停止した時点から復元するアプリケーションに取り組んでいます。

現在、次の問題があります。システムが再起動すると、システム モジュールのすべてのベース アドレスがランダム化されます ( ntdll.dllkernelbase.dllなどkernel32.dll)。OS は Windows 7 x64 Enterprise です。再起動後にアプリケーションを復元しようとすると、明らかにクラッシュします (ただし、再起動前の復元ポイントからは正常に機能していました)。これには2つの解決策があります:

  1. アプリケーションに読み込まれるときにシステム モジュールのアドレスを静的にする
  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つの段階があります:

  1. パラメータとフラグの変換と検証
  2. 実行するイメージを開く
  3. Windows Executive Process オブジェクトの作成
  4. 初期スレッドとそのスタックおよびコンテキストの作成
  5. Windows サブシステム固有の初期化後の実行
  6. 初期スレッドの実行開始
  7. 新しいプロセスのコンテキストでプロセスの初期化を実行する

ここでの最も重要なポイント:

  • のマッピングはntdll.dllステージ 3 で発生します。

  • ステージ 5 の開始時に、以下を読みました (強調は私のものです):

この時点で、Kernel32.dll は Windows サブシステムにメッセージを送信して、 マニフェスト ファイル、DLL リダイレクト パス、および新しいプロセスのプロセス外実行。

これは、ntdll.dllリダイレクトが発生する前にロードされることを意味します。リダイレクトのトピックについては SO に関する多くの質問がありますが、それらはすべてLoadLibrary、アプリケーションでリダイレクトが発生する可能性がある場合に、インポートされた関数の検索中に、または を介し​​て明示的にロードされる DLL に関するものです。

ただし、ntdll.dllいずれにしても非常に早い段階でアプリケーションに読み込まれます。

これまでに収集したすべての情報を使用して、たとえば、kernel32.dllアプリケーションのディレクトリでアプリケーションを検索することができました (この段落のリンクを使用)。しかし、検索をリダイレクトできませんでしたntdll.dll

ユーザーモードからはまったく可能ですか?


PS ASLR をグローバルに無効にする方法があります。この投稿を参照してください。ただし、これは非常に失礼な方法です。 のようなアプリケーションInternet ExplorerAdobe Reader機能せず、OS 全体が脆弱性にさらされます。

4

2 に答える 2

3

ntdll は、プロセスの作成中にカーネルからマップされます。処理中の最初のユーザー モード命令が実行を開始するとき (これは ntdll の LdrInitializeThunk です) ntdll は既に処理中にマップされます (最初は exe と ntdll のみがマップされ、他のすべての dll は ntdll によってロードされるか、exe によって遅くロードされます)。システムは ntdll (LdrInitializeThunk、KiUser*Dispatcher) にあるいくつかのコールバックのアドレスを使用するため、ntdll はすべてのプロセスでロードされた同じアドレスにある必要があります。

于 2016-05-30T19:21:20.280 に答える