「DLLインジェクション」の版間の差分

提供: セキュリティ
移動: 案内検索
(ページの作成:「DLLインジェクション(DLL Injection)とは、Windowsのプロセス(アプリケーション)に強制的に指定したDLLファイル(Dynamic Link L...」)
(相違点なし)

2014年2月27日 (木) 17:21時点における版

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)
	{
		// 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);
}

関連項目