-
2020-03-24 16:01:17
Inter x86将处理器执行模式分为4层环,我们平时说的用户层程序处于3环(Ring3),内核层代码处于0环(Ring0),而Ring3的地址空间是各进程之间独立的,Ring0层是进程之间共享,不同进程会由进程上下背景文的切换来实现对Ring0层访问。Windows中并没有使用Ring1和Ring2层。
我们的用户层进程通过系统服务来完成我们需要完成的工作,而系统服务是在内核层实现的,那么就需要CPU就要从Ring3层的调用切入Ring0层,那么这个过程是如何实现的?
进入内核一般有中断、异常、自陷三种手段,而如果是我们平时函数正常系统调用,会通过自陷指令(int 0x2e)让CPU主动进入系统空间,对于应用程序而言,相当于执行了一次函数调用。还有一种称为快速调用约定的sysenter和sysexit指令,也是调用系统服务,并为此配备了SYSENTER_CS_MSR、SYSENTER_EIP_MSR、SYSENTER_ESP_MSR三个MSR(Mode Specific Register)寄存器。
接下来说一说这二者分别是怎么进行执行的,首先来说传统的Windows系统调用自陷指令int 0x2e:
以经典的ReadFile函数(因为我看的书是拿这个函数举例的)来进行解释,我们调用一个WinAPI ReadFile函数,其位于kernel32.dll的导出函数中,在用户层这个函数内部调用的是ntdll下的Nt系列的函数NtReadFile,该函数就是一个Windows的系统调用,内核中也有与之同名的函数。众所周知,ntdll下有两个函数,一个叫做ZwReadFile,一个叫做NtReadFile,二者指向同一片地址:
更多相关内容 -
Windows x64内核学习笔记(一)—— 环境与配置
2022-02-23 17:41:13Windows x64内核学习笔记(一)—— 环境与配置 前言 之前,跟着海哥学习了windows内核的一些机制,包括保护模式,异常处理,消息机制等等,使用的环境是XP系统。 但是,在实际工作中,面对需要用到x64内核相关的...前言
之前,跟着海哥学习了windows内核的一些机制,包括保护模式,异常处理,消息机制等等,使用的环境是XP系统。
但是,在实际工作中,面对需要用到x64内核相关的内容时,依旧会感到茫然无措,毕竟脑中的知识只局限在32位内核。
随着时代发展,64位系统未来必将成为主流,但苦于市面上关于x64的教程非常少,因此一直没有机会系统化学习。
前段时间才发现周壑老师出了一套名为「x64内核研究」的教程,不得不说周壑老师真是太牛了。
那么,就让我们一起来学习x64内核吧。
新特性
相较于x32内核而言,x64内核包含以下几个新特性
- SMEP / SMAP
分别为控制寄存器Cr4的两个标志位,用于控制内核对用户层的数据读写与执行的权限。
例如如果像x32内核一样,在x64中做idt后门,那么可能会产生类似「三重错误」的错误。 - KPTI
内核页表隔离,Win10在2018年初更新的补丁,使得一个进程对应两个Cr3,处理用户层和内核层时拥有两个idt表。 - 硬件漏洞(幽灵、熔断)相关(介绍)
- CFG(介绍)
- Patch Guard
内核补丁保护,不能随意对x64内核进行patch,否则会触发不定时蓝屏。 - DSE强制签名(介绍)
基础要求
- C语言
- x64汇编
- x86保护模式
实验环境
- 虚拟机:VMware Workstation(15.1.0)版本及以上
- 操作系统:Windows 10 1903 (笔者使用的小版本是18362.356)
- 调试器:Windbg(10.0.18362.1)
- C语言(x64)开发环境:Visual Studio(2010)版本及以上
- 驱动(x64)开发环境:WDK(7600)版本及以上
- 其他工具:CE(7.0)版本及以上;DebugView(4.9.0)版本及以上
Guest Win10配置
- 由于本次学习不涉及到VT,因此可以把VT支持关掉。
- 可以调整蓝屏时产生转储文件的大小
- 转储文件的路径最好也改一下:
- 开启调试模式和测试模式
// 1. 查看当前的启动项信息 bcdedit /enum {current} // 2. 复制一个启动项,并开启调试模式和测试模式 bcdedit /copy {current} /d "Windows Debug Entry" bcdedit /dbgsettings serial baudrate:115200 debugport:1 // ID是第一条命令执行后提供的启动项标识符 bcdedit /debug {ID} ON bcdedit /set {ID} TESTSIGNING on // 3.(可选)添加一个只禁用驱动签名的启动项 bcdedit /copy {current} /d "Windows Nointegritycheck Entry" // ID是上一条命令执行后提供的启动项标识符 bcdedit /set {ID} nointegritychecks on
问题解决
在尝试使用DbgView64监视核心时,可能会报错
解决方法:关闭UAC
- 使用「Command+R」输入「gpedit.msc」,打开本地策略组编辑器。
- 依次展开「计算机配置」-「Windows设置」-「安全设置」-「本地策略」-「安全选项」,在具体策略中找到用于账户控制相关配置
- 将「用户账户控制:以管理员批准模式运行所有管理员」设置为「已禁用」。
好了,接下来进行重启,就能够监视核心了,然后就可以在Host OS使用WinDbg进行双机调试了。
参考资料
- bilibili周壑:x64内核研究系列教程
- SMEP / SMAP
-
Windows内核学习------双机调试的安装(物理机win10,虚拟机win7,虚拟机软件vmware)
2022-05-01 21:14:55windows内核学习笔记-----双机调试的环境安装目录
前言
此文章适合不会安装双机调试的win内核初学者观看,
看了各种安装资料,自己操作总是和资料上不同,各种报错,尝试了一下午终于安装好了。。。
在这片文章里我也会说一下我遇到的坑!!
看此文章的前提:
1.已经安装了wdk,安装教程百度
可以在这里:下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs
2.已经安装了vmware,安装教程百度
3.vmware上安装了win7x64系统,安装教程百度
我这里的iso文件是在这里下的:MSDN, 我告诉你 - 做一个安静的工具站
迅雷链接
ed2k://|file|cn_windows_7_professional_with_sp1_x64_dvd_u_677031.iso|3420557312|430BEDC0F22FA18001F717F7AF08C9D5|/
配置物理机
安装完wdk后,会安装windbg,
我的路径是
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Windows Kits\Debugging Tools for Windows (X64)
win10系统可以win+Q键搜索
打开文件位置
把快捷方式复制到桌面
右键快捷方式,点击属性
在目标里加上
-b -k com:pipe,port=\\.\pipe\com_1,resets=0
原来是: "D:\Windows Kits\10\Debuggers\x64\windbg.exe"
加上后是: "D:\Windows Kits\10\Debuggers\x64\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,resets=0
然后点击应用,点击确定即可
配置VMWare
如果启动了windows7系统先关闭
编辑虚拟机
把打印机移除
移除之后点下方的添加
选择串行端口,点完成
在进行如下图的设置
命名的管道填如下内容:
\\.\pipe\com_1
进入win7系统进行配置
然后开启虚拟机
进入win7系统
以管理员身份运行cmd,输入
bcdedit
出现以上内容说明你是以管理员身份运行的
然后以下命令依次输入:
bcdedit /dbgsettings serial baudrate:115200 debugport:1
bcdedit /copy {current} /d "Windows7"
此时会给你一个很长的ID,放在下面指令里即可
bcdedit /displayorder {current} {ID}
bcdedit /debug {ID} ON
注:上面两个指令的ID替换成之前给你的很长的一串字母
设置完毕后重启即可
然后打开windbg
在启动调试程序之前打开
这时windbg会等待系统连接
重启后会发现多了一个启动调试程序
选择启动调试程序后windows会加载系统
然后windbg会有反应
这样表示系统与windbg连上了,这时系统会卡死
在windbg下面的输入框里输入g
即可让系统运行起来
windbg如下图所示表示系统在运行
按下Ctrl+Break即可暂停系统,进行调试
这样就可以进行双机调试我们的驱动了,由于笔者也是刚学win内核,具体调试还没开始进行,如果以后有时间可能会发,感谢你的观看,再见~~
-
Windows 内核研究学习全资料 精华
2009-07-23 19:35:55想深入理解windows内核机制的一些好资料集结。 通过这些,可以让我们从内核理解windows的行为和机制。 对以后的编程和项目有很大的帮助。 也是走向“高手”的必读! -
windows内核开发学习笔记二十四:windows内核架构
2021-06-23 15:43:58从上图上可以看出,windows内核主要层次划分为三个层次,以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层(Hardware Abstraction Layer,简称HAL):主要是把所有与硬件相关联的代码隔离...从上图上可以看出,windows内核主要层次划分为三个层次,以及windows子系统、文件系统、网络、设备驱动程序等几个部分。
- 硬件抽象层(Hardware Abstraction Layer,简称HAL):主要是把所有与硬件相关联的代码隔离到一个专门模块中,从而使上面的层次尽可能做到独立于硬件平台。
- 内核层或微内核层(micro-kernel):位于HAL硬件抽象层之上,主要包含了基本的操作系统原语和功能,如线程和进程、线程调度、中断和异常的处理、同步对象和各种同步机制。
- 执行体层(execution):提供供应用层或者内核驱动程序直接调用的功能和语义。包含一个内核管理器,用于一致地管理执行体中的对象。
执行体和内核层位于内核基本模块ntoskrnl.exe二进制模块中,二者的具体分工是:内核层实现操作系统的基本机制,执行体负责所有的策略的决定。执行体中的对象绝大多数封装了一个或者多个内核对象,并且通过某种方式(如句柄)提供给应用程序,体现了机制与策略分离的设计思想。
windows内核为用户模式代码提供了一组系统服务,供应用程序使用内核中的功能,并且是通过一组系统DLL,最终通过ntdll.dll切换到内核模式下的执行体API函数中,来调用内核中的系统服务。ntdll.dll是这种调用的桥梁。对于内核提供的每一个系统服务,该DLL都提供一个响应的存根函数,这些存根函数的名称以“Nt”作为前缀,如NtCreateProcess、NtOpenFile和NtSetTimer等。另外ntdll.dll还提供了许多系统级的支持函数,如映像加载函数(前缀Ldr)、windows子系统通信函数(前缀Csr)、调试函数(前缀Dbg)、系统事件函数(前缀Etw),以及一般的运行支持函数(前缀Rtl)和字符串支持函数等。
-
天书夜谈:从汇编语言到Windows内核编程
2015-08-13 11:39:27如果读者从未接触过Windows内核编程,读者应该先学习第二部分。能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8... -
windows内核原理与实现 配套工具
2019-03-30 10:48:36《windows内核原理与实现》是一本比较好的学习系操作系统的工作原理的一本书,值得参考。 -
分页和非分页内存(Windows内核学习笔记)
2020-04-08 17:35:28虚拟内存划分表(来自Windows内核设计思想): 今天来说一下最常见的分页和非分页内存: 我们都知道虚拟地址是不能访问物理内存的,需要内存管理单元将其映射到某个物理页面,转换成物理地址,CPU才能进行访问。... -
寒江独钓-Windows内核安全编程完整版(内附源码)
2019-01-25 18:10:37完整的零基础学习windows下驱动编程(内附源码)。内核编程环境配置;串口过滤、键盘过滤;磁盘虚拟;磁盘过滤;文件系统过滤与监控;文件系统透明加密;文件系统微过滤;网络传输层过滤;NDIS协议驱动;NDIS小端口... -
Windows内核学习笔记(一)
2010-11-19 11:34:00Windows采用了双内核结构,操作系统核心运行在内核模式下,应用程序运行在用户模式下。当应用程序需要用到内核或内核扩展模块的服务时,使用硬件指令从用户模式切换至内核模式,等服务完成再切回用户模式。Windows... -
Windows x64内核学习笔记(二)—— IA-32e模式
2022-02-24 14:53:42Windows x64内核学习笔记(二)—— IA-32e模式IA-32e模式模式检测特性强制平坦段任务切换中断门描述符FS / GS参考资料 IA-32e模式 描述:IA-32e是IA-32模式的扩展,它是一种状态,其内核为64位,用户可以是32位,也... -
windows内核开发学习笔记二十三:windows操作系统的基本架构
2021-06-23 10:10:00windows的系统结构采用双模式结构(dual mode),即内核模式和用户模式;操作系统的核心运行在内核模式(kernel mode)下,应用程序运行在用户模式(user mode)下。在两种模式下运行的权限和访问的范围不一样,当... -
《Windows 内核情景分析 下》(毛德操)
2018-09-15 14:50:27毛德操的 Windows内核情景分析 下册,学习Windos核心开发,安全技术学习必读 -
windows内核和Linux内核区别
2021-08-11 19:59:14Windows 和 Linux 是当今两款最主流的服务器操作系统产品,都拥有广泛的用户和信徒。Windows 通过强大的商业运作,驱动了大量优秀人才加盟到它的开发团队中;...今天我们继续从一道面试题目“ Linux 内核和 Windows -
学习windows内核一
2017-09-09 23:18:08操作系统通过驱动对象来分发命令。 主函数需要驱动对象和注册表路径 ...还是自己实现,删除设备对象和符号链接还有一些自己创建的东西。 通过设备对象才能通信,所以需要创建一个设备对象。如果创建成功了就能在驱动... -
Windows内核学习点滴记录
2012-03-13 16:12:39每天我们都在使用Windows系统学习、编程、听音乐、玩游戏,Windows的操作想来是很熟练了,可是你又对Windows到底了解多少呢?本系列的目的, 就是让你对Windows系统有个更直观、更清楚、更彻底的认识。虽然我们... -
WINDOWS内核学习步骤
2012-11-09 19:41:00(一)内核驱动入门 1.驱动级HelloWorld 2.驱动框架理解 (二)内核开发基础 3.驱动级文件与注册表操作 4.中断运行级别 5.同步与多线程 6.内核数据结构 7.应用程序与驱动通信与弹窗 ... -
寒江独钓《Windows内核安全编程》
2018-05-05 08:33:59编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM... -
天书夜读:从汇编语言到Windows内核编程 - 完整书签(高清版)
2018-12-07 17:29:48从汇编语言到Windows内核编程.pdf 【完整书签】【高清版】(共282页) ============================================ 入手篇 熟悉汇编 第1章 汇编指令与c语言 1.1 上机建立第一个工程 1.1.1用visual studio创建工程... -
windows内核安全编程
2009-11-06 10:56:06寒江独钓 windows内核 安全编程源代码 寒江独钓 windows内核 安全编程源代码 寒江独钓 windows内核 安全编程源代码 寒江独钓 windows内核 安全编程源代码 -
Windows内核安全与驱动开发随书光盘
2017-07-27 13:15:39这是《Windows内核安全与驱动开发》一书的随书案例代码,代码内容以Windows驱动编程为主,仅供参考学习之用 -
windows内核分析(上)
2018-09-25 23:28:28主要用于介绍windows内核对象的底层实现,可以结合《windows核心编程》来一块学习。 -
编程技术_Windows+NT 内核分析-综合文档
2021-05-19 21:07:54编程技术_Windows+NT 内核分析 -
windows 内核
2013-11-22 17:01:02Windows开发简介.Windows是一种基于图形界面的多任务操作系统。为这个环境开发的程序有着相同的外观和命令结构。对用户 来说,这使得学习使用Windows应用程序变得轻易了 -
windows内核部分源码分析
2014-05-21 15:34:32doc文档若干,帮助学习windows内核 -
《Windows 内核情景分析 上》(毛德操)
2018-09-15 14:48:04毛德操的 Windows内核情景分析 上册,学习Windos核心开发,安全技术学习必读 -
独钓寒江雪windows内核安全编程
2018-07-10 10:39:33著名的独钓寒江雪windows内核安全编程,详细讲解了C语言开发的独门秘籍,是学习内核编程的绝佳好书。 -
Windows内核原理与实现
2018-08-23 15:57:27毕业设计时用过的资料,对windows分析得非常详细,值得学习。 -
Windows x64内核学习笔记(五)—— KPTI(未完待续)
2022-03-02 13:52:08Windows x64内核学习笔记(五)—— KPTIKPTI实验一:构造IDT后门并读取Cr3实验二:访问KVASCODE区段实验三:访问TEXT区段参考资料 KPTI 描述:KPTI(Kernel page-table isolation)即内核页表隔离机制。 在学习SMEP... -
Windows内核学习:I/O系统
2009-10-12 10:36:00作者:shenzi链接:http://blog.csdn.net/shenziWindows内核学习:I/O系统1.I/O系统组件 Windows的I/O系统如图1所示,由几个可执行模块和设备驱动程序组成。图1:I/O系统组件I/O管理器将应用程序和系统组件连接到...