More Related Content
Similar to 64ビット対応Dllインジェクション (20)
More from Shinichi Hirauchi (20)
64ビット対応Dllインジェクション
- 4. 動作イメージ
パワー
ポイント
メモ帳
Windows
メモ帳
メモ帳
ブラウザ
- 9. 他プロセスでスレッド実行
HANDLE CreateRemoteThread(
HANDLE hProcess, // 挿入先プロセスハンドル
LPSECURITY_ATTRIBUTES lpAttr,// セキュリティ属性
DWORD dwStackSize, // スタックサイズ
LPTHREAD_START_ROUTINE lpAddr,//関数ポインタ
LPVOID lpParameter, // 引数ポインタ
DWORD dwCreationFlags, // 作成フラグ
LPDWORD lpThreadId // スレッド識別子
);
- 10. LPTHREAD_START_ROUTINE 型
typedef DWORD (
__stdcall *LPTHREAD_START_ROUTINE)
( [in] LPVOID lpThreadParameter );
HMODULE LoadLibrary(
LPCTSTR lpFileName //モジュール名
);
BOOL FreeLibrary(
HMODULE hModule // DLLハンドル
);
- 11. 関数のアドレス
プロセスA プロセスB
カーネルコード カーネルコード
プロセスAのコード プロセスBのコード
0x75230000 kernel32.dll 0x75230000 kernel32.dll
0x75230xxx 0x75230xxx
Loadribrary() Loadribrary()
- 12. インジェクション・コード
//kernel32のモジュールハンドル取得
IntPtr m = GetModuleHandle("kernel32.dll");
//LoadLibrary()のアドレス取得
UIntPtr a = GetProcAddress(m, "LoadLibraryA");
//スレッド実行
IntPtr t = CreateRemoteThread(
hProcess,IntPtr.Zero, 0, a, param, 0, out b);
//スレッド完了待ち(DllMainから返るのを待つ)
WaitForSingleObject(t,INFINITE);
//DLLハンドルの取得
if (GetExitCodeThread(t, out hDll)) {
if(hDll!=IntPtr.Zero)result = true;//成功
}
//スレッドクローズ
CloseHandle(t);
- 13. LoadLibraryのパラメータ
HMODULE hDll = ::LoadLibrary( "test.dll" );
自プロセスのメモリ空間に展開された文字列へのポインタ
プロセスBのスレッドにはプロセスB上のアドレスが必要
プロセスA プロセスB
0x02583000 0x02583000
“test.dll” Int x=100
- 14. 他プロセスでメモリ操作
VirtualAllocEx() 挿入先プロセスでメモリ確保
WriteProcessMemory() 挿入先のメモリ空間に書き込む
書き込んだメモリを使用する Loadribrary()のパラメータ
VirtualFreeEx() 確保したメモリの開放
プロセスA プロセスB
VirtualAllocEx
WriteProcessMemory
0x000034000
“test.dll”
- 15. メモリ操作・コード
UInt32 MEM_COMMIT = 0x1000;
UInt32 PAGE_EXECUTE_READWRITE = 0x40;
IntPtr m = (IntPtr)VirtualAllocEx(
hProcess, IntPtr.Zero, (uint)len,
MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (m != IntPtr.Zero) {
//確保した挿入先の領域にDLL名を書き込む
WriteProcessMemory(
hProcess, m, dllName, (UIntPtr)len, out b);
//確保したメモリをここで使用する
//(挿入先でLoadLibraryを呼び出す)
//確保したメモリの開放
VirtualFreeEx(hProcess, m, 0, 0x8000);
- 22. 64bitから32bitの
kernel32.dllのアドレス取得
32bitでコンパイルした下記のEXEを実行して
アドレスを取得する
#include <windows.h>
int main(int, char**){
return(int) =
GetProcAddress(
GetModuleHandle(“kernel32”), “LoadLibraryA”);
}
参考「64bitプロセスから32bitプロセスにDLL Injection (C言語) 」
http://nazochu.blogspot.com/2011/09/64bit32bitdll-injection.html