APC英文全称(Asynchronous Procedure Call),我们一般译为异步过程调用。它是一种Windows的软中断机制,一般分为两种:
- 内核APC:由系统产生的APC。
- 用户APC:由应用层程序产生的APC。
当一个线程从等待状态(线程调用SleepEx、SignalObjectAndWait、WaitForSingleObjectEx、WaitForMultipleObjectsEx等函数是会进入可唤醒状态)中苏醒时,线程会检查有没有APC需要去执行,如果有APC,则去执行这些异步过程调用函数。而我们在Ring3层,可以利用QueueUserAPC函数APC过程添加到目标线程的APC队列中,当线程恢复执行之前,APC会被执行,完成我们的注入。
当我们添加APC后,线程不会立即就调用APC函数,只有当线程被唤醒时,才会调用,所以为了增加代码被唤醒得几率,在程序中向所有线程插入APC。
写这篇文章之际,我也翻看了之前的笔记,回顾了自己做的过程中遇到的问题,有一个可有意思的现象,就是当我向线程添加APC队列时,感觉对操作线程的顺序有要求。
例一:Win7 x86 x64 Taskmgr.exe Explorer.exe在按照以下代码插入各个线程APC队列时,会导致目标进程奔溃。当然测试自己