首页
社区
课程
招聘
[原创]Windbg调试的重要功能——内核态与用户态进行切换
发表于: 2020-10-23 07:15 9731

[原创]Windbg调试的重要功能——内核态与用户态进行切换

2020-10-23 07:15
9731

Windbg基本概念

Windbg命令分类:
1、内置标准命令
Windbg软件自带的命令,它没有其他符号前缀可以直接执行,无需拉起其他程序模块就可以运行。
图片描述
2、元命令
通过其他进程实现某个命令功能,并且讲输出反馈回Windbg。例如我们查看文档手册的.hh就是调用了其他的进程来解析Windbg帮助手册的。
图片描述
3、拓展命令
拓展命令通过增加调试模块(dll)赋予Windbg其他强大的调试功能,只要遵守Windbg调试模型,程序员可以自由编写这种拓展命令实现自己想要的目的和功能(也就是我们俗称的插件)。拓展命令的前缀是一个感叹号(!)
常用的拓展命令语法:
!DLL模块名.DLL中导出函数名 [参数] (可以通过Windbg命令行传递参数)
这些具体的命令功能被包含在与调试器独立的dll中。我们可以在Windbg软件目录下找到对应的DLL。下面红线框标记出的分别是用户态拓展模块(DLL)和用户态拓展模块(DLL)
图片描述
如果我们在使用拓展命令没有指定具体模块,那么Windbg就会查看所有DLL的导出表找到对应的导出函数(命令)。比如我们常见的一些拓展命令:!teb(用来获取线程环境块)、!thread(获得当前线程信息)
要注意:
如果Windbg调用拓展命令后,发现模块并没有加载内存,Windbg就会隐式的将对应的DLL加载到内存。如果想要主动加载DLL到内存中,我们需要调用.load指令(需要指定DLL的完整路径字符)。该指令有了之前的基础应该很好理解,利用其他的第三方进程,加载想要的模块到Windbg的内存中。

Windbg调试的重要功能——内核态与用户态进行切换

在我们进行正常的调试过程中,我们可能会有这样一种需求:
是否能够让Windbg调试器进行用户态调试和内核态调试模式之间来回转换,并且可以将用户态调试会话与系统行为同步起来。其实微软在早期就考虑到了开发人员的这种特殊需求。
首先在启动用户态重定向前,我们要启动内核态调试器(也就是双机调试环境,具体搭建方法论坛内已经很多了我这里不在赘述)。
图片描述
输入G指令,让内核态调试器进入正常运行的模式。
图片描述
接下来我们需要使用DDK工具包下的ntsd.exe工具,将用户态的调试信息重定向到内核态的Windbg调试器(cdb.exe、ntsd.exe和windbg.exe是基于相同引擎开发出来的),输入以下命令:
ntsd -d <要调试目标程序的路径>
ntsd -d -p <要附加进程的PID>
这里有意思的一点是,虽然三个系统调试器是相同引擎,但是Windbg貌似并不支持将用户态信息重定向给内核态的Windbg。
图片描述
输入调试重定向指令,我这里以桌面上的Hash.exe为例子演示。在命令提示符中输入ntsd -d+要调试的进程目标路径。
同理我们也可以使用 ntsd -d -p <PID>来附加到某个运行中的线程,并将用户调试信息转发给内核态。
图片描述
转到我们的内核态Windbg调试器,可以看到命令提示符从内核态(kd)变为了用户态(Input)。要注意的一点是,即使命令提示符是重定向用户态的调试信息,但是Windbg调试器仍然是在用户态权限下运行,仍然具有控制操作系统的权限。也就是说如果我们输入G命令,仍然可以让操作系统运行起来,调试器中断仍然会让系统暂停。
图片描述
当我们在用户态的提示符下输入一个新命令,Windbg内核调试器会将命令转发回用户态的ntsd用户调试器并恢复系统行为。而ntsd调试会将用户态下调试的信息重新发回给Windbg的控制台,Windbg会重新进入<Input>用户态提示符。(也就是每次输入命令后Windbg就会执行G,将命令发给ntsd。ntsd接到命令执行,将结果返回给Windbg。如果Windbg接到命令就会再次挂起系统然后将返回结果呈现给调试器)
图片描述

内核态与用户态切换的方法

1、用户态切换回内核态

(1)在命令提示符中输入.breakin命令,利用breakin.exe这个第三方程序帮助切换回内核态调试提示符。这个命令要求调试器拥有SeDebugPrivilege权限。如果调试器运行在没有调试权限的账号下回报错。
图片描述
(2)另一种回到内核态的方法
在用户态下,执行某个很长的时间任务的时候,例如使用一个休眠指令来引发一个中断(也可以使用Ctrl+C)。内核调试器会将聚合见Ctrl+C视为一个内核事件,以此返回内核提示符处理该内核中断事件。

2、内核态返回用户态命令提示符

(1)从内核态返回用户态提示符
使用!bpid <需要返回的目标pid>(而且目标进程还需要ntsd挂在调试目标上)
图片描述
(2)直接使用breakin.exe对目标进程重定向
在cmd中输入breakin 目标进程pid
图片描述
可以发现重定向了用户态调试信息。


[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 2
支持
分享
最新回复 (24)
雪    币: 1230
活跃值: (1705)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
有时候. sleep也可以用上… . break有时候不能立即断到用户态。
2020-10-23 23:29
0
雪    币: 3776
活跃值: (5474)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
3
感谢提醒,.sleep这种长时间的休眠状态也会触发内核中断事件,我不太了解具体细节不知道是不是时钟的事
2020-10-24 07:46
0
雪    币: 2958
活跃值: (4836)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
前辈,我调试win10,下载不了符号文件,这个你会弄吗 ???? 在看雪里,有人说要搭梯子才能下载,我搭好了一样不行。
2020-10-24 10:13
0
雪    币: 3776
活跃值: (5474)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
5
这个需要挂梯子的全局代理才行,或者用迅雷找CSDN上公布的静态符号包,将符号包安装到自定义的路径即可
2020-10-24 10:19
0
雪    币: 2958
活跃值: (4836)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
独钓者OW 这个需要挂梯子的全局代理才行,或者用迅雷找CSDN上公布的静态符号包,将符号包安装到自定义的路径即可
谢谢,我试试
2020-10-24 10:22
0
雪    币: 3776
活跃值: (5474)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
7
下载离线符号包的时候先用Windbg的vertarget命令看下调试系统详细信息,然后根据符号包名进行下载。这是CSDN整理的符号表网址https://blog.csdn.net/u013187790/article/details/105276220/
2020-10-24 10:25
0
雪    币: 2958
活跃值: (4836)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
独钓者OW 下载离线符号包的时候先用Windbg的vertarget命令看下调试系统详细信息,然后根据符号包名进行下载。这是CSDN整理的符号表网址https://blog.csdn.net/u013187790 ...
饿饿,好的
2020-10-24 10:27
0
雪    币: 1140
活跃值: (3041)
能力值: ( LV12,RANK:385 )
在线值:
发帖
回帖
粉丝
9
https://bbs.pediy.com/thread-260666.htm
2020-10-24 12:18
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
有没有教程挂梯子的
2020-10-26 23:09
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
大道在我 有没有教程挂梯子的

不向以前,现在国内访问微软的符号表服务器需要翻墙了。

调试内核没有符号表是很头疼的,通过稳定的代理服务器翻墙是要收费的:

1.如果是公司职员可以向公司申请费用。

2.如果是自行学习的学生可以购买1天的代理服务器(不贵:比如小舒代理: 1天8元左右), 然后在这24小时内翻墙把常用操作系统

的符号表都下载下来,以后就可以离线使用了。


2020-10-29 09:26
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12

好的我去看看 

最后于 2020-10-29 20:08 被大道在我编辑 ,原因:
2020-10-29 20:08
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
低调putchar 不向以前,现在国内访问微软的符号表服务器需要翻墙了。调试内核没有符号表是很头疼的,通过稳定的代理服务器翻墙是要收费的:1.如果是公司职员可以向公司申请费用。2.如果是自行学习的学生可以购买1天的代理服 ...
有没有详细如何配置代理的过程  我刚刚自己试了下 不行啊
2020-10-30 15:16
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
低调putchar 不向以前,现在国内访问微软的符号表服务器需要翻墙了。调试内核没有符号表是很头疼的,通过稳定的代理服务器翻墙是要收费的:1.如果是公司职员可以向公司申请费用。2.如果是自行学习的学生可以购买1天的代理服 ...
可以了  就是好慢啊  
2020-10-30 15:35
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
大道在我 好的我去看看&nbsp;

多开几台不同操作系统的机器(虚拟机也可以),用WinDBG的symchk命令工具就可以把对应操作系统的符号表下载下来。
如果只下载内核符号表,按图中操作就可以了,如果要下载全部符号表(全部下载比较大)可以指定: 系统盘:\WINDOWS\system32目录

2020-10-30 15:58
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
symchk /r C:\WINDOWS\system32\*.* /s SRV*D:\test*http://msdl.microsoft.com/download/symbols,
就可以下载全部符号表(太大了,时间会很长)。如果只调试内核就下载:系统内核模块及system32\drivers目录下就可以了。
2020-10-30 16:07
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
低调putchar symchk /r C:\WINDOWS\system32\*.* /s SRV*D:\test*http://msdl.microsoft.com/download/symbols, 就可以下载全 ...


为什么我输入命令是这样的?

2020-10-30 18:04
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
因为你牛逼啥!
2020-10-30 19:16
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
相信来这里都是对底层研发感兴趣,想真正掌握点东西的高手!初来论坛!对这里的情况不太熟悉!别和我这一介草民一般见识!如有冒犯之处,还请多多海涵!!
2020-10-30 20:00
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
低调putchar 因为你牛逼啥![em_13]
你告诉我一下啊  我现在这些个笔记本的主板都不 支持win10一下系统,我这个笔记本要按驱动还得最新版的系统才行,网上也没有离线包
2020-10-30 20:07
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
笔记本多大内存?
2020-10-30 20:14
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
现在的笔记本跑几个虚拟机是没问题的。
你应该是这里培训教学的老师了吧!学校搭建云平台还不够玩?
我不是看雪论坛培训班的师生,是外面的!觉得这里能查到自己想要的东西,就来的这里。以后多关照哈!
2020-10-30 20:22
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
 什么意思,我没有听懂你的话,什么老师?  我就是想要我这个 系统版本的符号表,我 其他系统的我都弄好了
2020-10-30 20:27
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
好了!我有事情忙!空了再来看看!这里很不错!
2020-10-30 20:28
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
25
低调putchar 好了!我有事情忙!空了再来看看!这里很不错![em_63]


多谢了  自己琢磨可以下载了

2020-10-31 18:05
0
游客
登录 | 注册 方可回帖
返回
//