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的本质的更多相关文章

  1. Objective-C 内存管理之 _ARC

    内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...

  2. 【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 ...

  3. ETHREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  4. ETHREAD APC

    ETHREAD APC <寒江独钓>内核学习笔记(4) 继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <window ...

  5. windows:shellcode 代码远程APC注入和加载

    https://www.cnblogs.com/theseventhson/p/13197776.html  上一章介绍了通用的shellcode加载器,这个加载器自己调用virtualAlloc分配 ...

  6. 深入Windows APC

      本篇原文为 Depths of Windows APC ,如果有良好的英文基础,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者 Rbmm ...

  7. 羽夏看Win系统内核—— APC 篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  8. atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx

    atitit.软件与sql设计模式原理与本质 大总结attialx总结v6 qc26.docx 1.1. 版本历史2 2. 设计模式是什么2 2.1. 模式就是在一种场合下对某个问题的一个解决方案.& ...

  9. xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题

    前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01    跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...

随机推荐

  1. 三、Vue 的一些语法样例

    前言 其实vue 的语法在官网上都有详细的讲解和例子,我这里就不多做什么说明,只是把自己学习这些语法是练习的例子贴出来.另外官网上的例子是一个个的html文件.我这里的是一个的vue 文件,通过不同的 ...

  2. webpack学习2.2webpack简介,初步了解

    webpack V1功能进化 编译打包 HMR(模块热更新) 代码分割 文件处理(loader) webpack V2功能进化 tree shaking(并欸有在项目中使用的代码不会打包到里面,打包之 ...

  3. hdu 1394 Minimum Inversion Number (树状数组求逆序对)

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...

  4. JS---DOM/BOM---学习road map---7 parts

    JS---DOM/BOM---学习road map---6 parts Part 1-2: Part 3-4 part 5-7:

  5. asp.net core 系列 9 三种运行环境和IIS发布

    一.在asp.net core中使用多个环境 ASP.NET Core 配置是基于运行时环境, 使用环境变量.ASP.NET Core 在应用启动时读取环境变量ASPNETCORE_ENVIRONME ...

  6. Java连载59-局部内部类、匿名内部类

    一.局部内部类 1.局部内部类等同于局部变量 2.局部内部类在访问局部变量的时候,局部变量必须使用final修饰. 3.举个例子: package com.bjpowernode.java_learn ...

  7. 系统优化——建立linux回收站机制

    前言: linux系统下的rm是不可挽回的,命令设计本身没有问题,问题在于我们通常非常的自信,执行的时候喜欢rm -rf,这样的话就非常危险了,在执行的时候如果执行命令不对,甚至是执行的目录不对,那么 ...

  8. 痛苦的 java.net.BindException: Address already in use: connect —— Nacos的坑

    我的dubbo应用, 刚开始的时候,启动一两个是没有问题的, 启动多了就大量出现: -- :: --- [TaskScheduler-] o.s.c.a.nacos.discovery.NacosWa ...

  9. 洛谷P5364 [SNOI2017]礼物 题解

    传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...

  10. js (单个的)点击式下拉菜单

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...