Windbg内核调试之二: 常用命令

简介: 运用Windbg进行内核调试, 熟练的运用命令行是必不可少的技能. 但是面对众多繁琐的命令, 实在是不可能全部的了解和掌握. 而了解Kernel正是需要这些命令的指引, 不断深入理解其基本的内容. 下面, 将介绍最常用的一些指令, 使初学Kernel调试的朋友们能有一个大致的了解.

运用Windbg进行内核调试, 熟练的运用命令行是必不可少的技能. 但是面对众多繁琐的命令, 实在是不可能全部的了解和掌握. 而了解Kernel正是需要这些命令的指引, 不断深入理解其基本的内容. 下面, 将介绍最常用的一些指令, 使初学Kernel调试的朋友们能有一个大致的了解. 至于如何熟练的运用它们, 还需要实际的操作过程中进行反复的琢磨.

Windbg能够方便的进行远程调试和本地进程调试(只限于User模式), 远程调试又分User mode和Kernel mode两种. 个人认为用Windbg进行远程的User mode调试还不如用Visual Studio来的方便, 毕竟要一些相应的配置才行, 而Visual Studio只需要远程机器的IP地址即可.(当然, 如果你在LiveCD或WinPE下进行User mode的调试, 这时候没有VS, Windbg就是不二之选了). Windbg的优势就在于远程的Kernel模式的调试, 这是VS所做不到的.

1. 首先是设置符号路径(无论在User mode下还是Kernel mode下都需要), 在Windbg的符号路径对话框中, 输入以下符号路径:

      srv*c:\symbols*http://msdl.microsoft.com/download/symbols

这个符号路径是自动在微软给定的symbols路径下进行自动搜索, 一些常用的符号都可以利用这个链接自动找到. 当然, 如果你的本地已经有相应的符号路径, 包含本地的也可以.

2. 等Windbg的联机状态设置好后, 按下Ctrl+break, 中断当前的Kernel状态, 在Windbg的命令行窗口输入"?", 则会输出帮助菜单, 在这个Menu中会显示一些常用的命令:

  (1)断点指令

     B[C|D|E] [<bps>]
     clear|disable|enable breakpoints
 
     BL
     list breakpoints
 
     BP <address>
     set soft breakpoints
 
     BA <access> <size> <addr>
     break on access
 
  (2)数据查看指令
     D[type][<range>]
     dump memory
 
     DT [-n|y] [[mod!]name] [[-n|y]fields][address] [-l list] [-a[]|c|i|o|r[#]|v]
     dump using type information
 
     DV [<name>] 
     dump local variables
 
  (3)数据修改指令
     E[type] <address> [<values>]
     enter memory values
 
  (4)运行
     G[H|N] [=<address> [<address>...]] 
     go
 
     P [=<addr>] [<value>]
     step over
 
  (5)堆栈操作
     K[b|p|P|v]
 
  (6)显示加载的模块列表
     LM
     list modules
 
  (7)寄存器操作
     R [[<reg> [= <expr>]]]
     view or set registers
 
  (8)Search指令
     S[<opts>] <range> <values>
     search memory
 
  (9)跟踪指令T,TA,TB,TC,WT,P,PA,PC
 
  (10)退出
      Q

  (11)反汇编
      U[<range>]

其中最常用的就是反汇编操作和显示模块操作. LM命令显示当前加载的模块. 当你连接过程中, Windbg提示相应的module找不到时, 就可以运用这个命令进行查看. LM的一个扩展命令是"lm t n", 这个命令显示当前所有加载的驱动信息(过去的命令是!driver),在调试内核驱动的过程中非常有用,可以找到相应驱动的起始地址。反汇编命令u, 可以在相应的地址中逐步的解析代码,这在内核调试中是最常用的一种查看代码的方式。

除上面的一些基本命令之外,还有一些非常有用的指令:
  
  (1)K[KB|KP]
     显示当前的堆栈,当然也可以用alt+6直接调出窗口显示
  
  (2)!process
     显示当前的进程EXPROCESS状态,!process 0 0 显示所有的进程状态

  (3)!thread
     显示当前的线程状态,dt nt!_ethread显示ETHREAD结构

  (4)!drvobj [path]
     列出当前的驱动程序在驱动对象中的例程,其中path是驱动的设备路径,例如: !drvobj \filesystem\fat 2 列出FAT文件系统驱动的例程

  (5)dt nt!_*
     查看内核的数据结构
  
  (6)!stack 0
     显示线程当前地址
  
  (7)!ioapic
     查看I/O的中断控制器

  (8)!irql
     查看CPU的IRQL,这在CPU中断调试中非常有用

  (9)!exqueue
     可以看系统辅助的线程列表

  (10)!reg viewlist
     注册表的存储显示,!reg hivelist显示注册表一个存储的内存使用量

  (11)!vm
     显示系统的内存池信息

  (12)dt _TOKEN
     显示内部访问令牌

  (13)!object \device
     显示设备对象信息,用winobj工具也可以看到

以上命令是一些常用的内核调试命令, 还有非常多的命令技巧, 不可能全部一一解释. 在今后的文章, 还会结合具体的调试过程分析进行逐步介绍. 内核的调试无非是处理器, 系统设备, 内存, 进程线程, 注册表, 驱动这几大类的信息, 每一类都有很多的命令, 需要我们在实际的调试过程中不断认识和体会它的用法. 当然, 理解这些命令用法的前提是需要我们对操作系统内部构造有一个清晰的认识. 这需要不断的学习, 对OS有一个全局的把握, 这样才能更深入的理解它. 而通过Windbg的内核调试, 我们有一种更好的方式直接与Kernel打交道, 这对我们深入理解和认识操作系统有很大的帮助. 下一节我们将通过一个实际的调试driver的例子, 来进一步认识Windbg在内核调试中的作用.
目录
相关文章
Qt提升控件类为自定义类
Qt提升控件类为自定义类
439 0
本地内核调试神器 —— livekd 使用总结
本地内核调试神器 —— livekd 使用总结
|
编译器 程序员 C++
2023-4-6-C++11、C++14、C++17、C++20版本新特性系统全面的学习!(二)
2023-4-6-C++11、C++14、C++17、C++20版本新特性系统全面的学习!
637 0
2023-4-6-C++11、C++14、C++17、C++20版本新特性系统全面的学习!(二)
|
6月前
|
搜索推荐 数据挖掘 API
深入研究:京东图片搜索商品API详解
京东图片搜索商品API简介:在电商快速发展的背景下,用户需求日益多样化。为提升购物体验,京东推出图片搜索商品API,通过上传商品图片(如实物图或宣传图),利用图像识别技术匹配京东商品库,返回相似商品的信息(如名称、价格、销量等)。该API采用HTTP POST请求方式,支持JPEG、PNG等常见图片格式,并可设置分类范围和结果数量限制等可选参数,助力开发者实现更精准的商品搜索,优化用户体验,同时为数据分析与个性化推荐提供支持。本文详细介绍了其功能、使用方法及Python请求示例。
|
9月前
|
机器学习/深度学习 监控 算法
基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
本项目基于YOLOv4深度学习网络,利用MATLAB 2022a实现排队人数统计的算法仿真。通过先进的计算机视觉技术,系统能自动、准确地检测和统计监控画面中的人数,适用于银行、车站等场景,优化资源分配和服务管理。核心程序包含多个回调函数,用于处理用户输入及界面交互,确保系统的高效运行。仿真结果无水印,操作步骤详见配套视频。
259 18
|
11月前
|
安全 API 网络安全
使用OkHttp进行HTTPS请求的Kotlin实现
使用OkHttp进行HTTPS请求的Kotlin实现
|
存储 编解码 安全
探索FFmpeg复用:深入理解媒体数据的组织与封装(二)
探索FFmpeg复用:深入理解媒体数据的组织与封装
282 0
|
开发工具 git
Fatal Not possible to fast-forward, aborting
git是一个很好用的版本管理工具,然而,有时候一些冲突还是让人很郁闷的。 遇到过两次merge报错,是在不同的情形下出现的。
1661 0
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
872 0
|
机器学习/深度学习 人工智能 API
在人工智能和机器学习的领域中,语音识别(Speech Recognition,SR)是一个重要的研究方向。它旨在将人类的语音转换为计算机可读的文本。
在人工智能和机器学习的领域中,语音识别(Speech Recognition,SR)是一个重要的研究方向。它旨在将人类的语音转换为计算机可读的文本。