`
wodamazi
  • 浏览: 1420516 次
文章分类
社区版块
存档分类
最新评论

读书笔记_windows内核调试_part 1

 
阅读更多

1. 远程调试的三种连接方式:串行口,1394和USB 2.0

串口分为9针和25针,是最基本的通信方式,所有的内核通信都支持串口通信。

1394又成为火线,是一种高性能的串行总线通信标准。使用1394进行通信时,目标系统和主机端的系统版本都必须至少是windows XP。

USB 2.0。 USB是Universal Serial Bus的缩写,是一种低成本高性能的串行总线标准,USB端口分为连接设备的上游(upstream)端口和用来连接主机的下游(downstream)端口。而一般个人电脑系统上的USB端口都是所谓的上游(upstream)端口。因为两个上游端口是无法简单连接而进行通信的,所以需要一根特殊的USB 2.0,主机到主机(Host to Host)的电缆。USB 2.0专门定义了支持调试用的调试端口(debug port),只有0号端口(port 0)是调试端口,可以使用USB view工具来观察那个端口是0号端口。

2. 虚拟机中的管道,通过使用软件的通信方式来模拟硬件的通信端口(Named Pipe)

3. 首先要启动内核调试,在Vista之前的windows系统,需要修改boot.ini文件,对于Vista和windows 7需要修改启动配置数据(Boot Configuration Data)

使用COM1通信需要修改multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Debug with Serial Port” /fastdetect /debug /debugport=COM1 /baudrate=115200

Windows Vista以后不再使用boot.ini文件,改为使用Boot Configuration Data(BCD), 改动的原因是Boot.INI文件容易被恶意软件所修改。可以命令行工具bcdedit来编辑BCD,他需要管理员权限(Run As Administrator),具体的不再介绍。

如果被调试系统已经无法正常启动,意味着不能修改BOOT.INI或使用BCDEdit,那么可以通过windows高级启动选项菜单(windows Advanced options menu)中的Debugging Mode选项来启动内核调试。当系统固件(BIOS)将控制权交给windows的加载器(NTLDR或BootMgr/WinLoad)时,按F8热键,此时调试引擎会从默认的调试设置中读取通信连接方式。

4. Windows的启动过程:

1. 系统固件(firmware)首先启动,即BIOS(Basic Input/Output System, 基本输入输出系统)或EFI(Entex Firmware Interface),BIOS或EFI在完成基本的硬件检测和平台初始化后,会将控制权移交给硬盘上的引导程序。

2. 引导程序再执行操作系统的加载程序(OS Loader),在Vista之前是NTLDR, Vista之后是WinLoad.exe

3. 加载程序首先会对CPU做必要的初始化工作,包括从16位的实模式切换到32位的保护模式,启动分页机制等,然后通过启动配置信息(Boot.INI或BCD)得到windows系统的系统目录并加载系统的内核文件,即NTOSKRNL.EXE。当加载这个文件时,会检查它的PE文件头导入节中所依赖的其他文件,并加载这些依赖文件,包括用于内核调试通信的硬件扩展DLL(KDCOM.DLL,KD1394.DLL或KDUSB.DLL)。加载程序会根据启动设置加载这些DLL中的一个,并将其模块名统一称为KDCOM。

4. 而后系统加载程序会读取注册表的System Hive,加载其定义的启动(boot)类型(SERVICE_BOOT_START(0))的驱动程序,包括磁盘驱动程序。

5. 之后,系统加载程序会从内核文件的PE文件头中找到它的入口函数KiSystemStartup函数,然后调用这个函数,调用时将启动选项以一个名为LOADER_PARAMETER_BLOCK的数据结构传递给KiSystemStartup函数,于是NT内核文件得到控制权并开始执行。

6. KiSystemStartup函数的执行过程

A 调用HalInitializeProcessor()初始化CPU

B 调用KdInitSystem初始化内核调试引擎

C 调用KiInitializeKernel开始内核初始化

7. 在KiInitializeKernel函数返回后,KiSystemStartup函数将当前CPU的中断请求级别(IRQL)降低到DISPATCH_LEVEL,然后跳转到kiIdleLoop(),退化为Idle进程中的第一个Idle线程。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics