win内核
文章平均质量分 81
Eugene800
这个作者很懒,什么都没留下…
展开
-
从应用层到MCU,看Windows处理键盘输入 [1.在应用层调试Notepad.exe (按键消费者)]
文本编辑器/文本编辑框是应用层常见的键盘处理程序。文本编辑器的实现并不复杂,微软又(被迫)提供了Sample,因此本文就不重复造轮子了。本文从调试器的角度观察Notepad.exe如何消费键盘按键.原创 2023-03-21 15:24:19 · 1112 阅读 · 2 评论 -
从应用层到MCU,看Windows处理键盘输入 [引言]
鉴于以上原因,我打算重开一个新的系列,在不泄密的前提下,以键盘输入为例,介绍从应用层到驱动层,再到Bios,最后到EC的处理流程。2020年,微软泄露了部分WinXP源码(>75%), Intel泄露了KabyLake设计文档;我对驱动/ACPI/Bios有了更多的理解;最重要的,这个月,淘宝帮我克服了最大的写作障碍----我买到了二手的dynabook笔记本(几年前,想写一个关于ACPI协议的系列文章,并归档在,但由于各种原因(最主要的原因是没有合适的笔记本)断更了。了我买公司全新的笔记本)。原创 2023-03-19 17:59:55 · 268 阅读 · 0 评论 -
windows driver response Power Event
#S5->S0Waiting to reconnect...USB2: Write openedConnected to Windows 7 19041 x64 target at (Sun Jun 6 13:33:03.551 2021 (UTC + 8:00)), ptr64 TRUEKernel Debugger connection established. (Initial Breakpoint requested)Symbol search path is: srv*C:\S..原创 2021-06-06 20:39:10 · 565 阅读 · 0 评论 -
[原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇
前篇<ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇>只完成了硬件部分,本文完成后半部分:在软件层接收和处理来自GPIO的SCI event。前文提到Bios将GPIO事件交由ACPI命名空间\_GPE处理,以软件工程的思维方式响应事件无非2种方式:a.事件接收方如能处理事件,则独自完成事件;b.事件接收方如不能处理事件,则交给下一环其他角色,以期他们完成事件;换到驱动的场景中:如果设备对象能处理IRP原创 2021-03-04 00:45:50 · 2897 阅读 · 6 评论 -
ACPI.sys,从Windows到Bios的桥梁(1):跟踪win7开启ACPI
由于windows设备驱动程序被设计成以设备堆栈(Device stack)的形式,下层驱动向上提供支持,所以我们习惯于不加思考的在设备栈的上层使用来自下层驱动的各种已有功能。当我还在做驱动程序时,经常见到这些句话:A1."功能驱动(Fdo)收到IRP_MJ_PNP&IRP_MN_START后,会向总线驱动(Pdo)查询并正确配置所需的硬件资源,如IO Port/IRQ/Mem等,然后才开始工作"。这段话我一直感到困惑:功能驱动的硬件资源来自总线驱动,那么总线驱动的资源由谁提供?可能有人...原创 2020-12-13 13:09:23 · 3632 阅读 · 0 评论 -
解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口
Bios由于需要保证运行时的透明性,它只向提供该BIOS的OEM厂商开放部分接口。用户只能通过OEM提供的App/Driver读取和设置OEM Bios。另外,OEM也保留WMI接口用于设置BIOS,同样,WMI接口也对用户透明。虽然OEM企图瞒天过海,但并不意味着我们无法获取WMI接口。本文基于ThinkPad T460P提出一种获得WMI接口的方式。另外,据了解,WMI接口可能存在安全风险,所以,这可能给渗透测试者提供了新的利用BIOS方式。 Bios\Windows通过WMI相互通信...原创 2020-08-01 21:14:14 · 1607 阅读 · 0 评论 -
Power IRPs处理注意点
<Programming the Microsoft Windows Driver Model>第8章8.1节提到处理Power Irp的注意点:"Power IRPs come to you in the context of a system thread that you must not block. There are several reasons why you ...原创 2020-03-08 23:23:26 · 375 阅读 · 0 评论 -
XpSp3(未开启PAE模式)内存管理之系统PTE区域 上
前言 几年前就已经看过wrk中关于内存管理和缓存管理的实现,由于当时对内核调试尚不熟悉,因此仅仅停留在代码层面。现在结合windbg操作,希望能有新的收获。毛德操的对理解windows内核确有裨益,但是,ReactOS对内存管理和缓存管理部分的实现与wrk相去甚远(ReactOS内存管理更接近于Linux内存管理),因此这些的代码应以wrk为准。 正文 提到一个系统P原创 2017-02-04 00:50:12 · 1356 阅读 · 0 评论 -
XpSp3(未开启PAE模式)内存管理之系统PTE区域 下
前面XpSp3(未开启PAE模式)内存管理之系统PTE区域 上>的结尾部分留了一个疑问:系统空闲PTE链表的结尾部分和全局变量nt!MmSystemPtesEnd中保存的值不同。这篇尝试解释是什么导致了这样的差异。 系统启动阶段时会调用nt!MiInitializeSystemPtes来初始化系统PTE区域。就如神话故事中天地是混在一起的一样,初始时,MmFirstFreeSyste原创 2017-02-05 14:31:45 · 766 阅读 · 0 评论 -
windbg下看系统非分页内存
这篇文章实在是闲的无聊才写的,因为快过年了...文章基于xpsp3 先看看和非分页内存相关的全局变量,也好有个大局观:kd> x nt!MmNonPaged*805517d8 nt!MmNonPagedPoolEnd = 8055af84 nt!MmNonPagedPoolEnd0 = 8055af80 nt!MmNonPa原创 2017-01-22 14:20:49 · 2547 阅读 · 1 评论 -
windbg+网线双机调试内核
最近要调试bluetooth,涉及到具体硬件因此不能用虚拟机和命名管道调试内核了,另外现在的PC追求轻便化,因此连串口都没了,不得不考虑使用网线调试。网上转了一圈发现了这篇:基于网络的内核调试 驱动调试需要用到两台机器,目前主要是通过串\口、usb或者1394接口来连接。对于软设备驱动来说就多了一种选择,通过vmware等虚拟化软件来虚拟测试机。但有些情况下必须在真实的双机环境进行原创 2016-06-29 20:13:18 · 8752 阅读 · 5 评论 -
MmGetSystemRoutineAddress实现
MmGetSystemRoutineAddress这个函数也是比较有用的,是得到系统导出函数的地址,不过网上都是写了一堆汇编代码在哪里,根本没有可读性,还不如用IDA看呢。下面的函数是摘自ReactOS项目的代码:PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)转载 2017-01-06 16:21:07 · 1545 阅读 · 1 评论 -
windows 内核文档化API/导出但未文档化API/未导出API
导出函数:顾名思义,出现在导出表(EAT)里面的函数,可以给外部调用的函数,验证是否为导出函数的方法,熟悉逆向的朋友可以使用LordPE之类的工具查看,当然也可以使用GetProcAddress或者MmGetSystemRoutineAddress之类的函数来获取地址,如果成功的话就是导出函数。非导出函数:这种函数是供自己调用使用的,不想提供给别人使用,当然也有方法可以获取函数地址,可以根据函转载 2017-01-06 16:15:33 · 1964 阅读 · 0 评论 -
用windbg为无效页面建立页面映射
前几天和同事扯淡,说调试驱动时访问无效内存会蓝屏,好麻烦,应该让windbg自动建立一个有效的页面,这样就不用蓝屏重启了。虽然说这是扯淡,但仔细想想貌似也不是不可能实现。 首先回顾一下OS解决内存缺页时简单步骤:1.搜索物理页面;2.修改虚拟地址对应的pte表的值;3.重新执行访存失败的指令。基于这样的思路,我也试了一下在windbg中手工建立内存映射(环境:win7 x32)1.在原创 2017-01-05 17:00:48 · 860 阅读 · 0 评论 -
IO_STACK_LOCATION与IRP的一点笔记
IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window)2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都转载 2016-11-26 21:27:11 · 624 阅读 · 0 评论 -
通过右键安装inf文件来安装驱动程序这种方式可取吗?
很多人拿到驱动包准备安装驱动时,往往先想到通过鼠标右键-安装这种方式来安装驱动。且不说能不能安装成功,要支持这种安装方式,对inf文件有一定的要求:inf文件中需要包含[DefaultInstall]这样的节,这个节是右键安装时的Inf入口点(MSDN的原话:"An INF file's DefaultInstall section is accessed if a user selects th原创 2016-11-06 17:29:13 · 16880 阅读 · 1 评论 -
驱动程序中使用event view记录日志
Eventdrv是MS ddk中的一个demo,演示如何在驱动中使用event view日志。本文译自src/general/tracing/evntdrv/evntdrv.htm概述Event是内核态驱动运行日志样例.该驱动并不控制任何物理硬件,仅生成日志事件.它用于演示如何在驱动中使用ETW日志.Eventdrv通过调用EtwRegister API来注册事件产生者.如果驱动加载成功,翻译 2016-10-23 17:04:45 · 2812 阅读 · 0 评论 -
使用DpInst安装驱动程序
出差时发现一些大公司使用DpInst工具安装驱动,当时觉得这种方式安装驱动相当方便,出于好奇回来后自己也尝试这种安装方式。 DpInst.exe工具位于ddk目录redist\DIFx\dpinst\EngMui下,同时M$在src\setup\DPInst目录下提供了定制DpInst驱动安装包的样例。一个基本的驱动安装包至少要包含cat,sys(已签名,测试签名也可以,为cat和s原创 2016-09-25 21:33:43 · 22460 阅读 · 5 评论 -
xp sp3关闭PAE(物理内存扩展)
这几天调试系统PTE区域,在获取nt!MmFirstFreeSystemPte指向的元素时,总无法获得正确的空闲pte值。反汇编nt!MiInitializeSystemPtes函数时发现这样的代码:80544e35 8d3cf5c0975580 lea edi,nt!MmFirstFreeSystemPte (805597c0)[esi*8]80544e3c 8b5704原创 2017-02-02 16:34:39 · 2288 阅读 · 0 评论 -
IoConnectInterrupt个人注释
/* * @implemented 来看一下跟中断对象有关的两个对象: typedef struct _IO_INTERRUPT{ KINTERRUPT FirstInterrupt; PKINTERRUPT Interrupt[MAXIMUM_PROCESSORS]; KSPIN_LOCK SpinLock;} IO_INTERRUPT, *PIO_INTERR原创 2015-05-26 21:19:26 · 1903 阅读 · 1 评论 -
Windows NT 驱动程序开发人员提示 -- 应注意避免
转自:深秋哋黎明的专栏下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。 一定不要将 Dev...转载 2018-08-04 21:12:44 · 658 阅读 · 0 评论 -
设备栈中各个设备加载顺序
如题,这是前几天某同事问我的问题。他假设设备栈中有Pdo,Fdo,以及附属于Fdo的设备上下过滤驱动以及类上下过滤驱动,在这种情况下,OS会以怎样的顺序加载这些设备? 我第一反应是当然先加载Fdo,然后再加载过滤驱动。不过,出于谨慎,我决定还是先调试一下,然后再找资料核对一下。至于调试的对象,肯定还是万能的toast了~先准备好驱动文件夹,看名字就知道里面包含了类上下过滤驱动,设备上...原创 2018-06-19 22:00:08 · 425 阅读 · 0 评论 -
WDF队列分析(2)----IoQueue的创建
如果阅读了《WDF队列分析(1)--序幕》,可能你还记得在那篇文章的结尾部分提到过进入DispatchWorker函数后,框架根据IRP类型进入不同的Dispatch函数。当时我们的关注点其实集中在DriverObject上(派遣函数) FxPackage* GetDispatchPackage( __in UCHAR MajorFunction )...原创 2018-06-18 23:26:14 · 1228 阅读 · 0 评论 -
WDF队列分析(1)--序幕
WDF提供的队列IoQueue相当复杂,需要诺干篇幅才能写完。本篇先从队列创建入手。原创 2018-06-17 11:00:26 · 1134 阅读 · 0 评论 -
驱动中为啥少有异常处理的代码?
今天整理ppt,突然想到一个现象:在WRK以及winddk sample源码中很少见到异常处理相关的影子(指windows结构化异常处理SEH:__try/__exception,而不是C++标准提供的try/catch,kernel不支持C++异常)。按说,内核本身具有完整的异常处理机制,驱动作为内核的一部分,如果使用了异常处理块,必然受到异常处理机制的保护。 我首先想到的是在DI...原创 2018-06-13 23:39:15 · 563 阅读 · 0 评论 -
APC_LEVEL相关内容整理
在看WDF框架的时候,看到一段代码注释:NTSTATUS__fastcallFxPkgIo::DispatchStep2( __inout MdIrp Irp, __in_opt FxIoInCallerContext* IoInCallerCtx, __in_opt FxIoQueue* Queue ){ // ...原创 2018-05-24 23:52:28 · 663 阅读 · 0 评论 -
Wdf框架之WdfObject状态机(3)-前篇
好久没写关于Wdf框架的博客了,因为有各种琐碎事缠身,得赶在RS4 RTM前把状态机(3)系列完成。WdfObject状态机(2)系列将注意力集中在驱动程序的继承层次上只存在单薄一层WdfDriver上;而这篇文章将要分析的情形将具备一定的普遍性:在代码上参考并修改了toaster\kmdf\func\simple。下图是默认KMDF对象层次结构 simple虽然没有包含图中所有元素,但它仍然...原创 2018-04-02 00:12:33 · 485 阅读 · 0 评论 -
DDK样例toaster分析(2)
前一篇 DDK样例toaster分析(1) 主要讨论了toaster样例中的busenum总线驱动。本篇将讨论从总线驱动过渡到功能驱动,也就是toaster.sys。 成功安装busenum.sys后,运行toaster/exe/enum目录下的enum程序模拟一个toaster设备插入:enum -p 1 前面busenum.sys!Bus_AddDevice创建Fdo的同时原创 2016-06-18 16:30:13 · 1968 阅读 · 0 评论 -
DDK样例toaster分析(1)
msddk样例中toaster是一个比较完整和值得学习的pnp驱动,包括了一个完整的设备栈(含总线驱动/功能驱动,以及设备栈中各层过滤驱动)和驱动安装程序(含驱动安装包/类安装程序/协安装程序)。本篇记录在xp下调试busenum驱动入口(关于环境的搭建网上一搜一大把,这里就省了,当然也可以参考这篇:win7 x64部署和串口调试虚拟驱动toaster)。 通过添加硬件的方式安装buse原创 2016-06-17 17:39:36 · 2284 阅读 · 0 评论 -
为sys/cat文件生成测试签名
这几天想测试一下使用DpInst安装驱动,由于驱动程序没有签名因此安装失败,借此研究一下如何为Sys/cat文件生成测试签名。本文参考了看雪论坛上的一篇文章:win x64平台驱动测试数字签名,并对其中一些错误(可能是作者前后两次实验导致的偏差)做了修改。 驱动在开发/测试阶段时是没有数字签名的,所以一般都会开机后进入F8,选择禁止数字签名强制,但是这个办法的麻烦之处就是每次开机都要这样原创 2016-09-18 00:12:29 · 5537 阅读 · 0 评论 -
Inf2Cat应用的参数使用详细介绍(inf2cat生成cat文件)
Inf2CatInf2Cat (Inf2Cat.exe) 是一个命令行工具,该工具确定驱动程序包的 INF 文件是否可以针对指定的 Windows 版本列表进行数字签名。如果可以,那么 Inf2Cat 会生成适用于指定 Windows 版本的未签名的目录文件。Inf2Cat /driver:PackagePath /os:WindowsVersionList [/nocat]转载 2016-09-17 14:09:43 · 4729 阅读 · 0 评论 -
IoRegisterPlugPlayNotification源码分析
IoRegisterPlugPlayNotification函数的作用是为指定guid的设备注册一个回调函数,当进入设备驱动并调用IoSetDeviceInterfaceState使能设备访问接口后,让系统调用之前注册的回调函数,以实现通知的目的.wrk1.2源码中并没有IO管理器的实现,因此,只能退而求其次,参考ReactOS中关于IoRegisterPlugPlayNotification的实原创 2016-08-30 22:24:22 · 1736 阅读 · 1 评论 -
整理关于Windows自旋锁实现
结合前面从IRQ到IRQL(APIC版)和Windows 自旋锁分析(一) 可以知道HalBeginSystemInterrupt通过用IRQL做索引在HalpIRQLtoTPR数组中获取该IRQL对应的任务优先级,用该优先级设置任务优先级寄存器TPR,并把TPR中原先的任务优先级/16做为索引在HalpVectorToIRQL数组中获取对应的原先的IRQL然后返回。观察K原创 2016-03-30 11:46:59 · 1840 阅读 · 0 评论 -
从IRQ到IRQL(APIC版)
事实上,老久的PIC在很早以前就被淘汰了,取而代之的是APIC。由于APIC可以兼容PIC,所以在很多单处理器系统上我们看到的PIC实际是APIC的兼容PIC模式。APIC主要应用于多处理器操作系统,是为了解决IRQ太少和处理器间中断而产生的,当然,单处理器操作系统也可以使用APIC(不是模拟PIC)。APIC的HAL和PIC的HAL有很大的不同,很突出的一个特点就是APIC的HAL不用再象PIC转载 2016-03-30 11:36:32 · 1344 阅读 · 0 评论 -
Windows 自旋锁分析(一)
自旋锁是一种在内核定义,只能在内核态下使用的同步机制。自旋锁用来保护共享数据或者资源,使得并发执行的程序或者在高优先级IRQL的对称多处理器的程序能够正确访问这些数据。分析Windows自旋锁,首先需要介绍Windows的IRQL。 1 Interrupt Request Level(IRQL)介绍IRQL是Interrupt RequestLevel,中断请求级别。一个由window转载 2016-03-30 11:14:54 · 1309 阅读 · 0 评论 -
PNP管理器简析--基于ReactOS0.33
CSDN上转悠了一圈发现关于PNP管理的文章不多,那就由我献个丑,记录自己对PNP管理器的看法。 pnp管理器被描述为向内核和应用程序提供关于设备拔插的通知,凭感觉,pnp管理器应该是个线程函数等待设备通知。搜索ReactOS发现有这么个函数符合这个功能:static DWORD WINAPIPnpEventThread(LPVOID lpParameter){ PP原创 2015-08-23 21:26:58 · 2500 阅读 · 0 评论 -
IRP和IO_STACK_LOCATION结构的关联
IRP结构中的IRP!StackCount--IRP!CurrentLocation--IRP!CurrentStackLocation三个字段关系错综,仅以此文已做备忘。//IRP结构后面接一个IO_STACK_LOCATION数组typedef struct _IRP { CSHORT Type; USHORT Size; struct _MDL *MdlAddress原创 2015-06-14 21:46:11 · 1785 阅读 · 0 评论 -
windows SEH机制注释(1) 基于ReactOS [第二次修订]
1.SEH链表的布局:FS:[0]->因函数层层调用形成嵌套的全局SEH链表: _SEHFrame!__SEHRegistration* SER_Prev->_SEHFrame!__SEHRegistration* SER_Prev->_SEHFrame!__SEHRegistration* SER_Prev ... |原创 2015-01-18 13:16:29 · 895 阅读 · 0 评论 -
DPC分析 基于ReactOS0.33
windows的过程,有如linux的软中断。以前Linux内核中自旋锁同步分析提到过,Linux通过IN_HARDIRQ/IN_SOFTIRQ来屏蔽软中断的执行,windows其实也类似,偷梁换柱的用IRQL来代替这些概念:IRQL高于DPC_LEVEL时,DPC过程无法执行,因为可能是中断过程正在执行;当通过KfLowerIrql降低IRQL请求级别到DPC_LEVEL及以下时开始执行DPC过原创 2015-05-21 21:56:41 · 981 阅读 · 0 评论 -
windbg r eip=0xxxxxxxxx如何实现?
如题代码如下:void func(){ int i=0; i++; return;}int main(){ func(); return 0;}windbg输出如下:call eip!ILT+0(?funcYAXXZ) (00401005)00401005 e916000000 jmp eip!func (00401020)0原创 2015-05-05 20:52:36 · 1074 阅读 · 0 评论