-
-
Windows内核-APC(六)
-
发表于:
2022-8-16 21:03
8767
-
dt _KTHREAD与APC相关的项
KTHREAD下面几个成员分析
ApcStateIndex
ApcStatePointer
ApcState
SaveApcState
KAPC_STATE结构
KAPC结构
KernelRoutine:是一个函数指针,该函数将在内核模式的 APC_LEVEL 上被执行
RundownRoutine:是一个函数指针,当一个线程终止时,如果它的 APC 链表中还有 APC 对象。
如果RundownRoutine 成员非空,则调用它所指的函数。
NormalRoutine:指向一个在 PASSIVE_LEVEL 上执行的函数。在这三个函数指针成员中,只有KernelRoutine域是必须的
RundownRoutine 和 NormalRoutine都是可选的。如果 NormalRoutine 为空的话,则其后的 NormalContext 和
APCMode域也将被忽略。
SystemArgument1和SystemArgument2:是两个提供给 KernelRoutine 或 NormalRoutine 函数的参数。
内核模式特殊 APC
是指NormalRoutine成员为NULL的apc
内核模式普通APC
NormalRoutine成员不为NULL
ApcMode成员为KernelMode
用户模式APC
NormalRoutine 成员不为 NULL
ApcMode成员为UserMode
查看wrk的KeInitializeApc结构
KeInitializeApc
KAPC_ENVIRONMENT ,插入的APC的四种环境
无论挂不挂靠,都插入到原始环境
无论挂不挂靠,都插入到挂靠环境
在初始化apc函数中,看线程的 ApcStateIndex这个值,如果ApcStateIndex =0 插入到原始环境,如果ApcStateIndex =1 插入到挂靠环境
选择插入,初始化函数不插入,插入APC函数的时候再选择插入
ida分析KeInitializeApc
有两种APC类型,内核模式和用户模式。
内核模式的APC并不要求从目标线程获得许可就可以运行在该线程的环境中,而用户模式的APC必须先获得许可才可以。内核模式的APC无需目标线程的干涉或者同意,就可以中断该线程并执行一个过程。
内核模式的APC也有两种类型:普通的和特殊的。
特殊的APC在APC级别上执行,并且运行APC例程修改某些APC参数。普通的APC在被动级别上执行,并且接收被特殊APC例程修改的参数(如果它们未被修改过,则直接接收原始的参数)。
通过将IRQL提升到APC级别或者调用KeEnterGuardRegion,就可以进制普通的和特殊的内核模式APC。KeEnterGuardRegion通过设置调用线程的KTHREAD结构中的SpecialApcDisable域,来进制APC被交付。一个线程要想进制普通类型的APC,唯一的办法是调用KeEnterCriticalRegion,它会设置该线程的KTHREAD结构中的KernelAPCDisable域。
每种类型APC的插入和交付行为
wrk查看KeInsertQueueAPC函数参数
ida分析KeInsertQueueAPC
进到KeInsertQueueAPC@12
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-8-16 22:22
被zhang_derek编辑
,原因: