Windows内核--调试内核源代码(1.5)

article/2025/10/5 18:50:46

Kernel编译和普通应用程序编译有差异吗?

  • 最终Kernel二进制档是给CPU执行的,只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可,从编译角度,内核和应用程序无差别。
  • Windows内核是exe文件。

内核与用户应用程序运行环境有差

  • Kernel运行环境和普通应用程序有差异,但它被硬件决定。
    • 用户应用程序可能运行在Ring 3, 内核在Ring 0(其实还有Ring 2和Ring 1, Windows内核选择了Ring 0), 这些通过特定指令切换完成。
  • Kernel需要处理好和硬件相关的Registers设定和中断/异常等,保证符合硬件Spec.
    • Intel、AMD、ARM硬件体系有差,软件也要跟着设定。
    • 内核代码会依照硬件要求做相应的适配,比如int进入trap或(软/硬)中断,压栈保存关键寄存器,内存虚拟映射段地址,内存页表物理基址CR3寄存器等等。

      

WRK的编译和调试

       WRK有介绍编译和调试方法,不再赘述。WRK编译并不比普通工程更复杂,反而更简单。

        nmake.exe 

                编译大总管,根据WRK makefile做编译,调用cl.exe, lib.exe和link.exe完成最终内核生成。

                VC++爱好者再熟悉不过了...

                     

                        注: nmake -nologo amd64= 编译输出

                wrkamd64.pdb或wrkx86.pdb需要复制到虚拟机System32目录?

                        > 不需要,pdb是给主机debugger使用。

        设定命名管道为COM1或COM2?

                VMware默认会把打印机作为第一个串行端口, 新建串行端口是串行端口2. 此时要注意虚拟机启动参数pipe的设定要对应。

                        

                                如上,XP 64bit虚拟机后来移除了打印机, 虽然内核调试还显示串行端口2,实际对应串行端口1.

                                虚拟机boot.ini参数/port=com1就是正确的。(如果打印机没移除,就需要改为/prot=com2)

                                        

                                我的Win10虚拟机因为存在打印机串口,bcdedit设定debugport就是2.

                                        

                                                Bcdedit debugport

        fastdetect启动参数和内核调试冲突

                XP系统默认启动参数带有/fastdetect, 当开启内核调试时,一定要关闭它,否则WinDbg没有机会连接到内核。

                fastdetect本意是内核启动不检查串行口或并行口。

        /debug参数和内核

                当开启了debug调试模式,内核变量KdDebuggerEnabled就变成TRUE. (详情参考: KD_DEBUGGER_ENABLED)

                        

                         注: 启动参数/nodebug会覆盖/debug.

        遇到WinDbg无法加载Kernel符号文件

                

                请确保虚拟机内核wrkamd64.exe与.pdb文件相符。

        WinDbg快捷方式

windbg.exe -b -k com:pipe,port=\\.\pipe\com1,baud=115200,reconnect -y E:\other_symbols;SRV*E:\xp_symbols*http://msdl.microsoft.com/download/symbols

                注:symbol路径请自定义.

Source Insight工程无法识别Token Macro

        因SI工具预处理和C/C++预处理有差别,毕竟SI不是做预处理器,会出现误把一些macro当做函数。例如,如下DECLSPEC_ALIGN, SI是不认识的。

        

         SI提供的解决方法是写Token Macro.

                

                注: SI工具根目录c.tom增加DECLSPEC_ALIGN(x)为空。

                Refer: Preprocessor Token Macros (sourceinsight.com)

        

                


http://chatgpt.dhexx.cn/article/qQQ7HxMm.shtml

相关文章

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址,还需附加GU…

Windows内核编程(二)-第一个内核程序

第一个内核程序 通过 Visual Studio新建工程 注意事项: 大部分widnows驱动程序都是内核驱动(Kernel Driver),所以本笔记不分"驱动程序"与"内核编程",也不区分"内核模块"(Kernel Module)、“驱动程序”(Drive…

Windows内核原理与实现之Windows研究内核(WRK)

Windows并非一个开放源码的操作系统,但正如上一章所提,Microsoft开放了一份以Windows XP x64和Windows Server 2003 SP1为基础的内核源代码,它可以编译和运行,作为教育科研机构的教学实践和研究的平台使用,称为WRK&…

Windows内核结构

Windows内核结构 第一篇博客,随便写下练练手:) Windows内核总共分为三层: 与硬件直接打交道的这一层叫做硬件抽象层简称HAL,这一层的用意就是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而做到尽可能的独立于硬件平…

WINDOWS内核对象及其理解

一.前言 Windows中有很多像进程对象、线程对象、文件对象等等这样的对象,我们称之为Windows内核对象。内核对象是系统地址空间中的一个内存块,由系统创建并维护,这个内存对象是一个数据结构,维护着与对象相关的信息&a…

windows内核——基石

友链 内存布局 用户内存空间和内核内存空间之间的gap是为了避免不经意的越界而导致安全问题 CPU的初始化 系统启动期间,会对所有的处理器进行初始化操作 大部分初始化操作我们都不必了解,因为你了不了解都不影响你的逆向,毕竟你又不是开发…

Windows内核原理与实现--Windows基本结构概述

一、Windows系统结构概述 1、Windows采用双模式来保护操作系统本身,内核模式和用户模式。在Windows中,用户代码和内核代码有各自的运行环境,而且它们可以访问的内存空间也并不相同。在x86中,内核代码可以访问当前进程的4GB虚拟地址空间,而用户代码只能访问底端2GB虚拟地址…

《Windows内核原理与实现笔记》(一)Windows系统结构和基本概念

Windows内核结构 上图是windows内核的组成结构 如图Windows内核分三层,与硬件直接打交道的是硬件抽象层HAL,这一层把所有与硬件相关代码逻辑隔离到一个专门模块中,从而是上层尽可能独立于硬件平台。HAL是一个独立动态链接库,wind…

windows内核基础

windows分层模型 硬件抽象层屏蔽了硬件实现功能的细节。 IRP为内核层重要的数据结构。 物理地址和虚拟地址 x64的cpu仅仅支持64位地址中的前48位。其中若虚拟地址为内核,则前16位为ffff;若虚拟地址为用户模式,则前16位为0000。用户能看到的…

WebService的工作原理

WebService的工作原理如下: 服务提供者WebService2和WebService3通过UDDI协议将服务注册WebService目录中服务消费者WebService1通过UDDI协议从WebService目录中查询服务,并获得服务的WSDL服务描述文件服务消费者WebService1通过WSDL语言远程调用WebSer…

WebService原理

1、WebService实际上就是两个应用程序之间的远程调用,而且这种调用是跨语言的。 2、应用程序调用WebService的接口,实际上就是解析XML语言。也就是说两个应用程序之间的交流实际上就是通过XML来交流的。 3、WebService内部的实现是基于HTTP协议的&…

Web Service 的工作原理

Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。…

JavaScript高级程序设计(第三版)pdf版 下载

分享关于JavaScript高级程序设计(第3版)[美] Nicholas C.Zakas著 李松峰 曹力 译 一书供大家学习!!! 链接: https://pan.baidu.com/s/1RD4EXuQnTqH3kUfHWFaOYw 提取码: vias 复制这段内容后打开百度网盘手机App&#…

JS高级程序设计(14)

DOM 文档对象模型(DOM)是HTML和XML文档的编程借口。DOM表示由多层节点构成的文档,通过它开发者可以添加、删除和修改页面的各个部分。 文章目录 DOM一、节点层级1.Node类型2.Document类型3.Element类型4.Text类型5.Comment属性6.CDATASectio…

javascript高级程序设计(红宝书)记录

故心故心故心故心小故冲啊 文章目录 第3章.语法基础第4章.变量作用域与内存第5章.基本引用类型第6章.集合引用类型第8章.对象、类与面向对象编程第10章.函数第11章.期约与异步函数第12章.BOM第17章事件第24章.网络请求与远程资源第25章.客户端存储 第3章.语法基础 undefined 值…

JavaScript高级编程

原文地址: http://www.onlamp.com/pub/a/onlamp/2007/07/05/writing-advanced-javascript.html Web应用程序(Web Applications) 从计算机纪元的黎明刚刚来临开始,不同平台间软件的互用性就一直是关注的焦点。为了尽可能实…

javascript高级程序设计 第三版

网盘地址 提取码&#xff1a;vh81 笔记 第二章 2.1script标签 <script>元素属性&#xff1a;async、charset、defer、language、src、type async和defer只对外部脚本有效&#xff0c;language已废弃&#xff0c;type默认为“text/javascript”defer属性可以让脚本在文…

js高级程序设计(一) —— js简介

学习《JavaScript高级程序设计》的知识总结&#xff0c;以及对部分内容的扩展~ 1、一个完整的js实现的三个部分 核心&#xff08;ECMAScript) 文档对象模型&#xff08;DOM) 浏览器对象模型&#xff08;BOM) 1-1&#xff1a;ECMAScript ECMA-262的近一版是第 5版&#xf…

JS高级程序设计(12)

BOM 浏览器对象模型BOM提供了与网页无关的浏览器功能对象。 文章目录 BOM一、window对象1.Global作用域2.窗口关系3.窗口位置与像素比4.窗口大小5.视口位置6.导航与打开新窗口7.定时器8.系统对话框 二、location对象1.查询字符串2.操作地址 三、navigator对象1.检测插件2.注册…

JavaScript 高级程序设计

理解原型对象 无论什么时候&#xff0c;只要创建一个新函数&#xff0c;就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。 在默认的情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个包含一个指向prototyp…