references:
DWORD QueueUserAPC(
PAPCFUNC pfnAPC,
HANDLE hThread,
ULONG_PTR dwData
);
https://docs.microsoft.com/en-us/windows/win32/sync/asynchronous-procedure-calls

微软官方文档说了,当一个用户模式的APC被存到线程的队列中后,只有当该线程进入到alertable state之后才会执行该APC
假设现在有两个进程,一个叫做safe,一个叫做malicious
safe的代码如下:
int main() {
while(1) { Sleep(500); }
return 0;
}
如果把一个普通的用户APC queue到safe进程中,那么这个APC永远都不会执行,因为safe并不会进入到Alertable state
在RS5(我不知道RS5是啥意思,查了一下,就是类似于版本号之类的东西)中引入了一个叫做特殊APC的机制,可以强制在线程执行到一半的时候的执行APC
对于攻击者来说,这个可能很诱人,但是实际上是非常危险的
假设在一个线程执行加载动态库(LoadLibrary )的过程中