APC的本质
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
APC的本质
一、对于线程关闭问题的启发
线程,本身占据CPU,对CPU有直接控制权。
这就存在一个问题,如果一个线程不想关闭自己,则外界是无法干涉它的。
因此,线程需要自己杀死自己。
但是线程本身是代码,其并不知道何时才需要杀死自己,这时需要我们另外提供代码,让其杀死自己。
因此,线程的操作机制就是:定时检查是否有另外执行的代码,然后去执行。该代码(函数),就是APC。
二、APC介绍
1. APC,即Asynchronous procedure call,异步程序调用。
我们理解“异步”这个词,线程本身的代码是“同步”的,在此之外可以认为是异步。
2. _KAPC_STATE 结构体(具体作用右侧已经标记出来)
其在 _KTHREAD + 0x34 的位置。
kd> dt _KAPC_STATE
ntdll!_KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY // APC队列,两个双向链表,分别指向用户与内核结构的APC
+0x010 Process : Ptr32 _KPROCESS // 线程所属的进程或者挂靠的进程
+0x014 KernelApcInProgress : UChar // 表示当前内核中的APC程序是否正在执行
+0x015 KernelApcPending : UChar // 表示APC队列中是否有内核APC函数,如果有为1,否则为0.
+0x016 UserApcPending : UChar // 表示APC队列中是否用用户APC函数,如果有为1,否则为0.
3. _KAPC 结构体
kd> dt _KAPC
ntdll!_KAPC
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 Spare0 : Uint4B
+0x008 Thread : Ptr32 _KTHREAD
+0x00c ApcListEntry : _LIST_ENTRY
+0x014 KernelRoutine : Ptr32 void
+0x018 RundownRoutine : Ptr32 void
+0x01c NormalRoutine : Ptr32 void
+0x020 NormalContext : Ptr32 Void
+0x024 SystemArgument1 : Ptr32 Void
+0x028 SystemArgument2 : Ptr32 Void
+0x02c ApcStateIndex : Char
+0x02d ApcMode : Char
+0x02e Inserted : UChar
在 _KAPC_STATE中前两个双向链表指向的就是一个个 _KAPC函数成员, 通过+0x01c NormalRoutine,可以查看代码(注意并不是指向函数地址)
三、什么时候执行APC函数
1. 先介绍两个函数
a. KiServiceExit函数:这个函数是系统调用、异常或中断的必经之路。
b. KiDeliverApc函数: 负责执行APC函数。
2. 在执行 KiServiceExit函数时,其会从线程结构体中拿出 _KAPC_STATE.KernelApcPending是否为零。
如果不为零,则会调用KiDeliverApc去执行APC函数,当执行完一次后再跳转回来进行遍历。

四、KiServiceExit2部分源码解读:
在WindowsXp 专业版的 ntoskrnl.exe 中并未搜索到 KiServiceExit 函数;在有关快速调用的代码中查看到 KiServiceExit2 (ntkrnlpa.exe)
.text:004667F0 cli
.text:004667F1 test dword ptr [ebp+70h], 20000h
.text:004667F8 jnz short loc_466800 ; 获取Kthread
.text:004667FA test byte ptr [ebp+6Ch],
.text:004667FE jz short loc_466834
.text:
.text: loc_466800: ; CODE XREF: _KiServiceExit2+↑j
.text: ; _KiServiceExit2+↓j
.text: mov ebx, ds:0FFDFF124h ; 获取Kthread
.text: mov byte ptr [ebx+2Eh],
.text:0046680A cmp byte ptr [ebx+4Ah], ; 判断是否有用户APC请求
.text:0046680E jz short loc_466834 ; 如果有用户APC请求会走这里
.text: mov ebx, ebp
.text: mov ecx, ; NewIrql
.text: call ds:__imp_@KfRaiseIrql@ ; KfRaiseIrql(x)
.text:0046681D push eax
.text:0046681E sti
.text:0046681F push ebx
.text: push
.text: push
.text: call _KiDeliverApc@ ; 该函数实现对APC的处理
.text: pop ecx ; NewIrql
.text:0046682A call ds:__imp_@KfLowerIrql@ ; KfLowerIrql(x)
.text: cli
.text: jmp short loc_466800 ; 获取Kthread
APC的本质的更多相关文章
- Objective-C 内存管理之 _ARC
内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...
- 【Linux】-NO.87.Assembly.1.滴水逆向.1.001-【介绍】-
1.0.0 Summary Tittle:[Linux]-NO.87.Assembly.1.滴水逆向.1.001-[基础]- Style:Java Series:Log4j Since:2017-04 ...
- ETHREAD APC 《寒江独钓》内核学习笔记(4)
继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...
- ETHREAD APC
ETHREAD APC <寒江独钓>内核学习笔记(4) 继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <window ...
- windows:shellcode 代码远程APC注入和加载
https://www.cnblogs.com/theseventhson/p/13197776.html 上一章介绍了通用的shellcode加载器,这个加载器自己调用virtualAlloc分配 ...
- 深入Windows APC
本篇原文为 Depths of Windows APC ,如果有良好的英文基础,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者 Rbmm ...
- 羽夏看Win系统内核—— APC 篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx
atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx 1.1. 版本历史2 2. 设计模式是什么2 2.1. 模式就是在一种场合下对某个问题的一个解决方案.& ...
- xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01 跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...
随机推荐
- SQL-SQL查询检索阶段二
一 前提准备 先声明一下,下面的库表只是简易的学习示例,不是生产的设计,不要深究,此文我们的目的是学习sql的检索不是库表设计:初学者最好跟着作者的文章一步一步敲一遍,如果没有使用过sql的可以查阅作 ...
- abp模块生命周期设计思路剖析
abp中将生命周期事件抽象为4个接口: //预初始化 public interface IOnPreApplicationInitialization { void OnPreApplicationI ...
- java基础题月考JSD1908(含答案和解析)
考试 .container { clear: both; margin: 0 auto; text-align: left; /*width: 1200px;*/ } .container:after ...
- SpringMVC 自定义参数解析器.
一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...
- pctfree和pctused
pctfree 是指一个数据块保留的空间百分比,表示数据块在什么情况下可以被insert 默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update了 即:当使用 ...
- Pluralsight 科技公司公布自己的avaScript 成为最受欢迎的开发技术
根据 SDTimes 报道,Pluralsight 科技公司公布自己的 Technology Index,JavaScript 位居榜首. Pluralsight,是美国的一家面向软件开发者的在线教育 ...
- MTK Recovery 模式横屏修改(适用于6.0 + 8.1)
修改前 修改后 6.0 Recovery 模式横屏修改方法 修改相关文件 bootable\recovery\minui\Android.mk bootable\recovery\minui\mt_g ...
- Java实现Kafka的生产者和消费者例子
Kafka的结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafka接收消息后,再投递给消费者.生产者的消费会被发送到Topic中,Topic中保存着各类数据,每一条数据都使用键. ...
- 安装社区版git仓库
1.打开http访问和ssh访问 sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit - ...
- java编译报错: 找不到或无法加载主类 Demo.class 的解决方法
原因:java 命令后面的文件不能有后缀名. 解决方法:运行java时候,后面的文件去掉后缀名.