DLLインジェクション
DLLインジェクション(DLL Injection)とは、Windowsのプロセス(アプリケーション)に強制的に指定したDLLファイル(Dynamic Link Library)を注入し(Injection,読み込ませ)、プロセスを本来とは違う動作をさせるテクニックです。
読み方
- DLLインジェクション
- でぃーえるえる いんじぇくしょん
- DLL Injection
- でぃーえるえる いんじぇくしょん
目次
概要
DLLを利用して、APIをフックします。
DLLインジェクションの方法
DLLインジェクションには、以下の方法があります。
- レジストリに登録する
- グローバルメッセージフックを使用する
レジストリに登録するAppInit_DLLs
AppInit_DLLs は、システム上の各ユーザーモードプロセスに読み込むDLLのリストを自由に指定できるメカニズムです。Windows 7とWindows Server 2008 R2 では、この機能が変更され、新しいコード署名が追加されました。
AppInit_DLLs に登録されたDLLは、user32.dllがロードします。 user32.dllがインポートされていないプロセスは、インジェクションできませんが、たいていのプロセスは、user32.dllを使用しています。
この方法でローロしたDLLは、プロセスが終了するまで、ロードされたままになります。すべてのプロセスが終了されないとDLLが差し替えられないため、DLLを変更するためには、OSをシャットダウンしなければなりません。
DLLインジェクションに関連するレジストリキー
AppInit_DLLs レジストリにDLLを登録し、プロセスにDLLを注入できます。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\RequireSignedAppInit_DLLs
下記のキーは、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\ の値です。
レジストリキー | キータイプ | 説明 | 値 |
---|---|---|---|
AppInit_DLLs | REG_SZ | 読み込むDLLのリストをスペース、または、コンマで区切って指定します。DLLのフルパス名には、短い名前を指定します。 | C:\PROGMA~1\WIN288~1\MICROS~1.DLL |
LoadAppInit_DLLs | REG_DWORD | システム全体で AppInit_DLLs を有効、または、無効にします。 | 0x0でAppInit_DLLsが無効、0x01で有効 |
RequireSignedAppInit_DLLs | REG_DWORD | コード署名されたDLLのみを読み込みます。 | 0x0ですべてのDLLを読みます。0x1でコード署名されたDLLのみを読み込みます。 |
グローバルメッセージフック
グローバルメッセージフックを利用して、DLLインジェクションを行います。 HHOOK SetWindowsHookEx() を使用します。CallNextHookEx()wお呼び出し、フックチェーンをつなぐ必要があります。
なお、フックの解除には、BOOL UnHookWindowHookEx()を使用します。
DLLをプロセスへ強制的に注入する
- LoadAppInit_DLLsを1に設定します。
- AppInit_DLLsにDLLを設定します。
DLLを使用しているプロセスを調べる方法
tasklistコマンドで「DLLを使用しているプロセス」を調べられます。
C:\Users\foo>tasklist /M user32.dll イメージ名 PID モジュール ========================= ======== ============================================ csrss.exe 988 USER32.dll wininit.exe 672 USER32.dll csrss.exe 776 USER32.dll services.exe 856 USER32.dll lsass.exe 992 USER32.dll winlogon.exe 1124 USER32.dll
サンプルコード
#include <windows.h> BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReason, LPVOID lpReserved) { UNREFERENCED_PARAMETER(lpReserved); if(ulReason == DLL_PROCESS_ATTACH) { // Do not need the thread based attach/detach messages in this DLL DisableThreadLibraryCalls(hModule); } return (TRUE); } extern "C" __declspec(dllexport) void Initialize() { MessageBox(0, "Locked and Loaded.", "DLL Injection Successful!", 0); }
関連項目
ツイート