关于异步过程调用 APC(Asynchronous Procedure Calls)

Categories Uncategorized

在分析内核态的恶意代码时,常常会遇见向用户态线程插入APC的情况(例如:暗云Bootkit)。那么恶意代码为什么以及如何使用APC插入呢?

关于APC的利用场景,逆向工程实践(Practical Reverse Engineering)一书中提到:“APCs are frequently used in rootkits because they offer a clean way to inject code into user mode from kernel mode. ”

关于利用方法:“Rootkits achieve this(code injection) by queueing a user-mode APC to a thread in the process in which they want to inject code.”

简单滴说,APC就是在某个线程上下文中执行的函数。APC的执行context有两种,既可以是用户态,也可以在内核态。

用户态的APC当线程进入可唤醒状态(alertable state)时在用户态以PASSIVE_LEVEL执行(当线程调用SleepEx、SignalObjectAndWait、MsgWaitForMultipleObjectsEx、WaitForMultipleObjectsEx、WaitForSingleObjectEx这些函数的时候会进入可唤醒状态)。由于APC在线程上下文(thread context)中执行,因此每个APC总是关联到一个ETHREAD对象。

APC的初始化使用KeInitializeApc函数:

初始化完成后,调用KeInsertQueueApc函数将APC插入队列,每个KTHREAD对象中都有一个ApcState域(_KAPC_STATE)包含两个APC队列,分别处理内核态和用户态的APC。

references:

No Comments

Leave a Reply