「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]]を使用しているプロセス」を調べられます。
+
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\ の値です。

DLLインジェクションに関連するレジストリキー
レジストリキー キータイプ 説明
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);
}

関連項目