
x86内核
文章平均质量分 85
用于记录学习x86系统内核机制笔记的专栏
lzyddf
这个人很懒,什么也没有留下
展开
-
Windows软件调试学习笔记(七)—— 单步步入&单步步过
软件调试学习笔记(七)—— 单步步入&单步步过单步步入设置单步异常处理单步异常实验1:单步异常的设置与处理单步步过实现思路实验2:实现单步步过单步步入描述:单步步入的实现依赖于单步异常。当我们需要观察每一行代码(包括函数内部的代码)执行之后寄存器与内存的变化,通常会采用单步步入。当使用单步步入时,可采用在下一行代码的首字节设置INT 3断点的方式实现。CPU为我们提供了一种更为方便的方法,即使用陷阱标志位(TF位)。设置单步异常TF位:置1处理单步异常单步产生的异常与硬件断原创 2021-08-11 16:52:18 · 2425 阅读 · 4 评论 -
Windows软件调试学习笔记(六)—— 硬件断点
软件调试学习笔记(五)—— 硬件断点硬件断点设置硬件断点触发硬件断点处理硬件断点硬件断点描述:与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于CPU中的调试寄存器。调试寄存器有7个,分别为Dr0~Dr7。用户最多能够设置4个硬件断点,这是由于只有Dr0~Dr3用于存储线性地址。其中,Dr4和Dr5是保留的。思考:假如在Dr0寄存器中写入线性地址,是否所有线程都会受影响?答案:不对,每个线程都拥有一份独立的寄存器,切换线程时,寄存器的值也会被切换。设置硬件断点1)Dr0原创 2021-08-10 19:13:04 · 4962 阅读 · 0 评论 -
Windows软件调试学习笔记(五)—— 软件断点&内存断点
软件调试学习笔记(五)—— 软件断点调试的本质软件断点分析INT 3执行流程调试的本质描述:1)调试的本质是触发异常与调试器接管异常的过程。2)不论是软件断点,硬件断点还是INT 3断点,本质都是触发异常。软件断点当使用调试器在任意代码位置设置断点时,本质上是将当前代码位置的字节码改为0xCC,对应的汇编指令为INT 3。调试器为了界面的美观,不会直接在反汇编界面将修改后的数据显示出来。可以使用WinHex查看内存数据进行验证。软件断点执行流程:被调试进程:1)CPU检测到INT原创 2021-08-05 19:55:44 · 2290 阅读 · 0 评论 -
Windows软件调试学习笔记(四)—— 异常的处理流程
软件调试学习笔记(四)—— 异常的处理流程要点回顾异常的处理流程要点回顾调试事件有多重类型、例如DLL加载、进程创建、线程创建等等。其中最关键的调试事件是”异常“。在调试过程中,不论是软件断点、硬件断点还是INT 3断点,都是通过异常来实现的。异常的处理流程流程图:...原创 2021-08-05 15:13:36 · 1973 阅读 · 0 评论 -
Windows软件调试学习笔记(三)—— 调试事件的处理
软件调试学习笔记(三)—— 调试事件的处理要点回顾调试事件的处理实验一:实现简单调试器(创建进程)实验二:分析异常来源实验三:实现简单调试器(附加进程)实验四:分析NtDebugActiveProcess总结要点回顾当调试器与被调试进程建立连接后,调试器与被调试进程关系如下图所示被调试进程产生调试事件时,会有专门的API对调试事件进行捕获,并写入调试事件链表当中。调试器不断检索调试事件链表,不断从调试事件链表中取出调试事件并进行处理。调试事件的处理调试器调试目标进程步骤:关联(创建进程原创 2021-07-29 17:45:43 · 1538 阅读 · 0 评论 -
Windows软件调试学习笔记(二)—— 调试事件的采集
软件调试学习笔记(二)—— 调试事件的采集要点回顾调试事件的种类调试事件采集函数例:分析PspUserThreadStartup例:分析PspExitThread总结要点回顾调试器与被调试进程通过DEBUG_OBJECT结构体建立联系。DEBUG_OBJECT中有一个链表成员,用于记录所有调试事件。当被调试进程产生调试事件时,调试器从链表中取出调试事件进行处理。思考:是否所有的调试事件都会被记录到链表中?答案:调试事件有不同种类,只有几个最关键的种类才会被记录到链表中,例如被调试进程进行文原创 2021-07-28 17:34:01 · 800 阅读 · 0 评论 -
Windows软件调试学习笔记(一)—— 调试对象
软件调试学习笔记(一)—— 调试对象原创 2021-07-01 18:55:15 · 1278 阅读 · 0 评论 -
Windows消息机制学习笔记(四)—— 内核回调机制
消息机制学习笔记(四)—— 内核回调机制要点回顾内核调用实验1:理解内核调用第一步:编译并运行以下代码第二步:修改窗口过程函数,重新运行结论KeUserModeCallback分析KeUserModeCallback要点回顾1)GetMessage不仅能够取出消息,还能处理SentMessagesListHead队列中的消息2)DispatchMessage()用于处理其它队列中的消息。内核调用描述:窗口过程函数除了会在消息循环中被调用,一些0环的代码也可以直接发起调用。例如:窗口初始化时、窗口原创 2021-06-24 18:23:24 · 1334 阅读 · 2 评论 -
Windows消息机制学习笔记(三)—— 消息的接收与分发
Windows消息机制学习笔记(三)—— 消息的接收要点回顾消息循环消息队列的结构GetMessage实验:理解GetMessage要点回顾1)一个GUI线程包含一个消息队列普通线程↓GUI线程↓THEWAD.W32THREAD↓THREADINFO↓消息队列2)一个线程可以包含多个窗口,所有窗口共享一个消息队列_WINDOW_OBJECT //0环创建↓PTHREADINFO pti //所属线程↓WNDPROC lpfnWndProc //窗口过程(窗口回调函数)原创 2021-06-23 14:53:13 · 1285 阅读 · 0 评论 -
Windows消息机制学习笔记(二)—— 窗口与线程
Windows消息机制学习笔记(二)—— 窗口与线程前言前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!原创 2021-01-29 10:21:47 · 945 阅读 · 0 评论 -
Windows消息机制学习笔记(一)—— 消息队列
Windows消息机制学习笔记(一)—— 消息队列前言基本概念实验一:使用代码画出最简单窗口第一步:编译并运行以下代码第二步:查看运行结果第三步:使用其它窗口对其进行覆盖,观察效果前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基本概念接触过编程的人,或多或少用到过消息机制,但大多数人(包括我自己)只是知道相关API的基本用法,却不知道它是如何实现的从本章起,我们将带着以下几个问题一起来学习消息机制:什么是窗口句柄?在哪里?有什么用?原创 2021-01-19 14:19:13 · 858 阅读 · 0 评论 -
Windows内存管理学习笔记(三)—— 无处不在的缺页异常
Windows内存管理学习笔记(三)—— 无处不在的缺页异常前言缺页异常实验一:设置虚拟内存前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!缺页异常描述:当CPU访问一个地址,其PTE的P位(页面有效位)为0,此时会产生缺页异常在windows中,缺页异常是时刻在发生的PTE结构(10-10-12分页):假设:当我们的物理内存大小只有2MB时,当我们需要用到某个物理页的时候,将对应物理页的P位置1,当我们不再需要使用该物理页时,原创 2021-01-18 16:31:39 · 1509 阅读 · 0 评论 -
Windows内存管理学习笔记(二)—— 物理内存的管理
Windows内存管理学习笔记(二)—— 物理内存的管理前言物理内存实验一:理解MmNumberOfPhysicalPagesMmPfnDatabase_MMPFN物理页状态六个链表实验二:理解零化链表实验三:查看进程占用的所有物理页前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!物理内存最大物理内存10-10-12分页:最多识别4GB物理内存2-9-9-12分页:最多识别64GB物理内存操作系统限制在xp系统中,即使采用2-9原创 2021-01-14 16:52:17 · 1994 阅读 · 0 评论 -
Windows内存管理学习笔记(一)—— 线性地址的管理
Windows内存管理学习笔记(一)—— 线性地址的管理前言线性地址的管理用户空间实验:理解用户空间线性地址管理Private Memory实验:理解Private Memory堆前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!线性地址的管理基本概念:每一个进程都有一个4GB的线性地址空间进程空间地址划分:注意:1)只有用户模式区是用户能够访问的2)所谓的“无法访问”只是目标地址并没有被挂上有效的物理页(详见保护模式章节)3)通常原创 2021-01-13 19:02:29 · 1096 阅读 · 0 评论 -
Windows异常学习笔记(五)—— 未处理异常
Windows异常学习笔记(五)—— 未处理异常前言前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!原创 2021-01-12 19:54:10 · 922 阅读 · 0 评论 -
Windows异常学习笔记(四)—— 编译器扩展SEH
Windows异常学习笔记(四)—— 编译器扩展SEH前言要点回顾编译器支持的SEH过滤表达式前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!要点回顾当我们通过编程实现windows的异常处理方式使用SEH结构化异常时,我们必须做如下几件事情将异常处理函数挂入SEH链表需要自定义一个异常处理函数(异常过滤,异常处理)注意:这种方式相对而言不太方便,因此现在的编译器都对SEH结构化异常提供了语法支持,并在其之上做了一定的拓展编译器支原创 2021-01-12 16:51:57 · 650 阅读 · 0 评论 -
Windows异常学习笔记(三)—— VEH&SEH
Windows异常学习笔记(三)—— VEH&SEH前言要点回顾分析 KiUserExceptionDispatcher分析 _RtlDispatchException_RtlCallVectoredExceptionHandlersVEH(向量化异常处理)实验:自定义VEH总结:VEH异常处理流程SEH(结构化异常处理)分析 RtlDispatchException实验:构造自定义SEH总结:SEH异常处理流程前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com原创 2021-01-11 16:54:04 · 1775 阅读 · 0 评论 -
Windows异常学习笔记(二)—— 内核异常处理流程&用户异常的分发
Windows异常学习笔记(一)—— CPU异常记录前言软件模拟异常实验:分析模拟异常第一步:编译并运行以下代码第二步:查看汇编代码第三步:分析 __CxxThrowException第四步:分析 RaiseException前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!软件模拟异常实验:分析模拟异常第一步:编译并运行以下代码...原创 2021-01-11 14:12:02 · 2104 阅读 · 0 评论 -
Windows异常学习笔记(一)—— CPU异常记录&模拟异常记录
Windows异常学习笔记(一)—— CPU异常记录前言基础知识异常的分类CPU异常前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基础知识异常产生后,首先是要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,称为异常的分发,最后找到异常处理函数并调用,称为异常处理异常的分类CPU产生的异常软件模拟产生...原创 2020-03-27 10:08:35 · 1484 阅读 · 0 评论 -
Windows句柄表学习笔记 —— 句柄表&全局句柄表
Windows句柄表学习笔记 —— 句柄表&全局句柄表前言句柄表实验一:在WinDbg中查看句柄表第一步:打开一个Win32窗口程序第二步:编译并运行以下代码第三步:查看运行结果第四步:在WinDbg中定位句柄表句柄表结构实验二:在WinDbg中查看并分析句柄表结构第一步:打开一个Win32窗口程序第二步:编译以下代码并运行第三步:查看运行结果第四步:在WinDbg中定位最后一个句柄第五步...原创 2020-03-19 09:36:26 · 4148 阅读 · 0 评论 -
Windows事件等待学习笔记(四)—— 事件&信号量&互斥体
Windows事件等待学习笔记(四)—— 事件&信号量&互斥体前言要点回顾事件实验:验证SignalState第一步:编译并运行以下代码第二步:观察结果第三步:修改代码并执行第四步:观察结果第五步:修改代码并执行第六步:观察结果总结实验二:验证Type第一步:编译并运行以下代码第二步:观察结果第三步:修改代码并执行第四步:观察结果解释说明分析WaitForSingleObject信...原创 2020-03-18 10:15:09 · 1411 阅读 · 0 评论 -
Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析
Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析前言要点回顾WaitForSingleObjectNtWaitForSingleObjectKeWaitForSingleObject:上半部分关键循环总结关于强制唤醒实验:证明等待块与等待块表的关系第一步:编译并运行以下代码第二步:再WinDbg中找到该进程第三步:查看线程信息前言一、学习自滴水编程达人...原创 2020-03-04 16:06:30 · 3168 阅读 · 0 评论 -
Windows事件等待学习笔记(二)—— 线程等待与唤醒
Windows事件等待学习笔记(二)—— 线程等待与唤醒前言要点回顾等待与唤醒机制可等待对象可等待对象的差异线程与等待对象一个线程等待一个对象实验第一步:编译并运行以下代码第二步:在WinDbg中找到该进程第三步:查看线程信息一个线程等待多个对象实验第一步:编译并运行以下代码第二步:在WinDbg中找到该进程第三步:查看线程信息第四步:查看等待块具体细节等待网总结前言一、学习自滴水编程达人中...原创 2020-03-03 17:43:57 · 1350 阅读 · 0 评论 -
Windows事件等待学习笔记(一)—— 临界区&自旋锁
Windows事件等待学习笔记(一)—— 临界区&自旋锁前言基础知识演示代码案例一:案例二:LOCK单行代码原子操作多行代码原子操作临界区演示代码:手动实现自旋锁分析 KeAcquireSpinLockAtDpcLevel总结前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基础知识并发:是指多个线程在同时执行单核(是分时...原创 2020-03-02 21:22:28 · 1115 阅读 · 2 评论 -
Windows APC学习笔记(二)—— 挂入过程&执行过程
Windows APC学习笔记(二)—— 挂入过程&执行过程前言基础知识挂入过程KeInitializeApcApcStateIndex前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基础知识无论是正常状态还是挂靠状态,都有两个APC队列,一个内核队列,一个用户队列每当要挂入一个APC函数时,不管是内核APC还是用户AP...原创 2020-02-29 21:11:16 · 1512 阅读 · 0 评论 -
Windows APC学习笔记(一)—— APC的本质&备用APC队列
Windows APC机制学习笔记(一)—— APC的本质前言基础知识APCAPC队列APC结构总结分析 KiServiceExit前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基础知识线程是不能被“杀掉”、“挂起”、“恢复”的,线程在执行的时候自己占据着CPU,别人怎么可能控制它呢?举个极端的例子:如果不调用API,屏蔽中断...原创 2020-01-12 09:41:22 · 3318 阅读 · 0 评论 -
Windows驱动开发学习笔记(七)—— 多核同步&内核重载
Windows驱动开发学习笔记(七)—— 多核同步之临界区前言基础知识并发与同步示例分析InterlockedIncrement原子操作相关API内核文件临界区错误的临界区正确的临界区自旋锁分析 KeAcquireSpinLockAtDpcLevel前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!基础知识并发:指多个线程在同时执行...原创 2019-12-17 21:02:05 · 1735 阅读 · 4 评论 -
Windows驱动开发学习笔记(六)—— Inline HOOK
Windows驱动开发学习笔记(六)—— Inline HOOK前言实验一:3环 Inline HOOK实验二:0环 Inline Hook前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!实验一:3环 Inline HOOK#include <stdio.h>#include <windows.h>BY...原创 2019-12-16 21:45:09 · 1357 阅读 · 1 评论 -
Windows驱动开发学习笔记(五)—— SSDT HOOK
Windows驱动开发学习笔记(五)—— SSDT HOOK前言系统服务表系统服务描述符表前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!系统服务表描述:全称:SystemServiceTable(系统服务表)可以通过系统服务描述符表访问系统服务表系统服务描述符表描述:全称:System Services Desc...原创 2019-12-14 22:08:43 · 1508 阅读 · 3 评论 -
Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)
Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)前言设备对象创建设备对象设置数据交互方式创建符号链接IRP与派遣函数IRP的类型其它类型的IRP派遣函数派遣函数注册位置注册派遣函数派遣函数的格式实验Ring 0代码Ring 3代码第一步:运行Ring 0代码第二步:运行Ring3代码前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海...原创 2019-12-13 11:27:48 · 1810 阅读 · 8 评论 -
Windows驱动开发学习笔记(三)—— 内核空间&内核模块
Windows驱动开发学习笔记(三)—— 内核空间&内核模块前言内核空间实验第一步:编译如下代码第二步:将 .sys 文件拷贝到虚拟机中第三步:部署 .sys 文件并运行第四步:打开一个任意程序第五步:在 WinDbg 中查看新进程的高2G内存内核模块驱动对象DRIVER_OBJECTLDR_DATA_TABLE_ENTRY实验第一步:编译如下代码第二步:将 .sys 文件拷贝到虚拟机中第...原创 2019-12-12 19:31:02 · 1542 阅读 · 5 评论 -
Windows驱动开发学习笔记(二)—— 驱动调试&内核编程基础
Windows驱动开发学习笔记(二)—— 驱动调试&内核编程基础前言基础知识驱动调试PDB(Program Debug Database)WinDbg 加载 PDB实验:调试 .sys 文件第一步:编译代码第二步:将 .sys 文件拷贝到虚拟机中第三步:添加 pdb 文件路径第四步:部署 .sys 文件并运行内核编程基础内核API的使用未导出函数的使用基本数据类型返回值内核中的异常处理常用...原创 2019-12-11 21:10:13 · 1429 阅读 · 0 评论 -
Windows驱动开发学习笔记(一)—— 环境配置&第一个驱动程序
Windows驱动开发学习笔记(一)—— 环境配置&第一个驱动程序前言环境配置第一个驱动程序前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!环境配置安装VS2010:https://pan.baidu.com/s/1uZWWxCtB60QPaqlf4ICWVQ 提取码:qqro安装WDK7600:https://pan.b...原创 2019-12-09 14:49:21 · 2416 阅读 · 5 评论 -
Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
Windows进程与线程学习笔记(九)—— 线程优先级前言要点回顾调度链表前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!要点回顾三种情况会导致线程切换:当前线程主动调用API:KiSwapThread -> KiSwapContext -> SwapContext当前线程时间片到期:KiDispatchInt...原创 2019-12-09 10:17:21 · 1240 阅读 · 0 评论 -
Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS
Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS前言要点回顾线程切换与TSS内核堆栈调用API进0环实验:分析SwapContext线程切换与FS段描述符结构分析SwapContext总结前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!要点回顾SwapContext这个函数是Windows线程切换的核心,无论是主...原创 2019-12-06 20:46:11 · 1123 阅读 · 0 评论 -
Windows进程与线程学习笔记(七)—— 时间片管理
Windows进程与线程学习笔记(七)—— 时间片管理前言要点回顾基本概念CPU时间片分析 KeUpdateRunTime分析 KiDispatchInterrupt备用线程总结前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!要点回顾在上一篇中,学习了线程切换的三种方式,其中一种是时钟中断时钟中断最终会导致线程切换,但要注意不是...原创 2019-12-06 15:04:12 · 1761 阅读 · 0 评论 -
Windows进程与线程学习笔记(六)—— 线程切换
Windows进程与线程学习笔记(六)—— 线程切换前言主动切换时钟中断异常处理前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!主动切换Windows中绝大部分API都调用了SwapContext函数,也就是说,当线程只要调用了API,教室导致线程切换线程切换时会比较是否属于同一个进程,如果不是,切换Cr3,Cr3换了,进程也就...原创 2019-12-06 14:02:49 · 1328 阅读 · 0 评论 -
Windows进程与线程学习笔记(五)—— 模拟线程切换
Windows进程与线程学习笔记(五)—— 模拟线程切换前言代码分析前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!代码分析线程结构体(仿ETHREAD):typedef struct{ char *name; // 线程名 int Flags; // 线程状态 int SleepMilli...原创 2019-11-18 13:23:04 · 1587 阅读 · 0 评论 -
Windows进程与线程学习笔记(四)—— 等待链表&调度链表
Windows进程与线程学习笔记(四)—— 等待链表&调度链表前言要点回顾33个链表等待链表实验:分析等待链表中的线程所属的进程第一步:查看所属线程结构体:第二步:查看所属进程结构体调度链表前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!要点回顾进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程...原创 2019-11-15 08:41:44 · 2399 阅读 · 9 评论 -
Windows进程与线程学习笔记(三)—— KPCR
Windows进程与线程学习笔记(三)—— KPCR前言KPCR+0x000 NtTib : _NT_TIB+0x120 PrcbData : _KPRCB前言一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com二、海东老师牛逼!KPCR描述:CPU控制区(Processor Control Region)当线程进入...原创 2019-11-12 14:29:50 · 1482 阅读 · 0 评论