「DLLインジェクション」の版間の差分
(→関連項目) |
|||
行8: | 行8: | ||
== 概要 == | == 概要 == | ||
[[DLL]]を利用して、APIをフックします。 | [[DLL]]を利用して、APIをフックします。 | ||
− | |||
== DLLインジェクションの方法 == | == DLLインジェクションの方法 == | ||
[[DLLインジェクション]]には、以下の方法があります。 | [[DLLインジェクション]]には、以下の方法があります。 | ||
* レジストリに登録する | * レジストリに登録する | ||
* グローバルメッセージフックを使用する | * グローバルメッセージフックを使用する | ||
− | |||
== レジストリに登録するAppInit_DLLs == | == レジストリに登録するAppInit_DLLs == | ||
AppInit_DLLs は、システム上の各ユーザーモードプロセスに読み込むDLLのリストを自由に指定できるメカニズムです。[[Windows 7]]とWindows Server 2008 R2 では、この機能が変更され、新しいコード署名が追加されました。 | AppInit_DLLs は、システム上の各ユーザーモードプロセスに読み込むDLLのリストを自由に指定できるメカニズムです。[[Windows 7]]とWindows Server 2008 R2 では、この機能が変更され、新しいコード署名が追加されました。 | ||
行59: | 行57: | ||
* LoadAppInit_DLLsを1に設定します。 | * LoadAppInit_DLLsを1に設定します。 | ||
* AppInit_DLLsにDLLを設定します。 | * AppInit_DLLsにDLLを設定します。 | ||
− | |||
== DLLを使用しているプロセスを調べる方法 == | == DLLを使用しているプロセスを調べる方法 == | ||
− | + | tasklistコマンドで「[[DLL]]を使用しているプロセス」を調べられます。 | |
<syntaxhighlight lang="dos"> | <syntaxhighlight lang="dos"> | ||
C:\Users\foo>tasklist /M user32.dll | C:\Users\foo>tasklist /M user32.dll | ||
行95: | 行92: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== 関連項目 == | == 関連項目 == | ||
{{crack windows password}} | {{crack windows password}} | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2015年9月22日 (火) 21:06時点における最新版
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) { DisableThreadLibraryCalls(hModule); } return (TRUE); } extern "C" __declspec(dllexport) void Initialize() { MessageBox(0, "Locked and Loaded.", "DLL Injection Successful!", 0); }