排版参考
https://www.cnblogs.com/aliflycoris/p/5353269.html
better:
1. 标题,次标题 与正文 的区分
2. code 的内容分明-这个css可以all for use
3. code中的注释与正文不同区别,like
使用效果如下:
https://www.cnblogs.com/aliflycoris/p/5353269.html
better:
1. 标题,次标题 与正文 的区分
2. code 的内容分明-这个css可以all for use
3. code中的注释与正文不同区别,like
使用效果如下:
0x01 前言
APCs(Asynchronous Procedure Calls), 在NT中,有两种类型的APCs:用户模式和内核模式。用户APCs运行在用户模式下目标线程当前上下文中,并且需要从目标线程得到许可来运行。特别是,用户模式的APCs需要目标线程处在alertable等待状态才能被成功的调度执行。通过调用下面任意一个函数,都可以让线程进入这种状态。这些函数是:KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread。
对于用户模式下,可以调用函数SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx 都可以使目标线程处于alertable等待状态,从而让用户模式APCs执行,原因是这些函数最终都是调用了内核中的KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject, KeDelayExecutionThread等函数。另外通过调用一个未公开的alert-test服务KeTestAlertThread,用户线程可以使用户模式APCs执行。
0x02 APC相关结构与位置
系统中每一个线程都包含两个APC队列,一个为用户模式APC队列,一个为内核模式APC队列,存储在KAPC_STATE结构中。而KAPC_STATE结构指针在线程结构体ETHREAD中有两个,一个是ApcState,一个是SaveApcState,为了进程Attach准备,当A进程附加到B进程,SaveApcState保存原来A进程的Apc队列,ApcState保存被附加B进程的Apc队列。
1.KAPC_STATE结构为
typedef struct _KAPC_STATE { LIST_ENTRY ApcListHead[MaximumMode]; //线程的apc链表 只有两个 内核态和用户态 struct _KPROCESS *Process; //当前线程的进程体 PsGetCurrentProcess() BOOLEAN KernelApcInProgress; //内核APC正在执行 BOOLEAN KernelApcPending; //内核APC正在等待执行 BOOLEAN UserApcPending; //用户APC正在等待执行 } KAPC_STATE, *PKAPC_STATE, *PRKAPC_STATE;
2.ApcStatePointer
对于一个APC对象,决定当前APC环境的是ApcStateIndex域。ApcStateIndex域的值作为ApcStatePointer域数组的索引来得到目标APC环境指针。随后,目标APC环境指针用来在相应的队列中存放apc对象.
没有评论:
发表评论