首页
社区
课程
招聘
[原创]WinDbg相关
发表于: 2024-8-10 08:44 2107

[原创]WinDbg相关

2024-8-10 08:44
2107

WinDbg相关

WinDbg是Windows官方提供的内核模式和用户模式调试器。

安装

安装WDK时会默认安装,不过这里的WinDbg界面更现代一点
f71K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3q4J5L8W2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8X3g2F1i4K6u0V1N6i4y4Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0V1K9r3q4J5k6s2N6S2M7X3g2Q4x3V1k6V1M7X3W2$3k6i4u0K6i4K6u0r3k6r3g2T1N6h3N6Y4k6i4u0Q4x3V1j5`.
遇到"解析应用包时出错"可参考该链接解决
310K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0K9h3y4J5L8%4y4G2k6Y4c8X3k6h3g2V1j5X3q4U0K9#2)9J5c8W2N6A6L8V1c8T1k6#2)9J5k6p5k6W2k6h3c8T1j5h3y4C8i4K6u0r3K9i4y4K6N6h3g2K6i4K6u0r3x3e0f1&6

离线安装WinDbg

1
2
3
4
5
6
https://aka.ms/windbg/download
得到windbg.appinstaller(如果403,换个地区,多试几次)
使用vscode打开windbg.appinstaller,找到windbg.msixbundle相关的url,下载得到windbg.msixbundle
离线正常安装windbg.msixbundle即可
如果报错"此应用包不支持通过应用安装程序安装,因为它使用了某些受限制的功能",在powershell下使用如下命令安装:
Add-AppxPackage -Path .\windbg.msixbundle

手册

debugger.chm
windbg.chm
用everthing搜一下就好了
也可以打开WinDbg,F1 或者点帮助

手册一开始的 Getting Started with Windows Debugging 很友好

官方学习资料: 02eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8Y4N6A6L8X3c8G2N6%4y4Q4x3X3c8Z5j5i4u0V1N6$3q4J5k6g2)9J5c8X3c8J5K9i4k6W2M7Y4y4Q4x3V1k6V1k6h3u0#2k6$3N6W2M7W2)9J5c8X3N6W2N6s2c8A6L8X3N6Q4x3X3c8K6N6r3q4J5N6r3g2V1i4K6u0V1N6$3W2@1K9q4)9J5k6s2N6A6L8X3c8T1k6H3`.`.

简单的快捷键

F5: Go
F11 or F8: Step Into
F10: Step Over
Ctrl+F10 or F7: Run to Cursor

WinDbg基本指令(来源: 逆向工程核心原理)

指 令 说 明 应 用
u Unassemble u: 显示下一条指令
u address: 显示指定地址的指令
u L10: 显示10行指令(L和数字之间没有空格)
u address L10: 显示指定地址的10行指令
ub: 显示上一条指令
t Trace(F11) Step Into
p Pass(F10) Step Over
g Go(Run) g: 运行
g address: 运行到指定的地址
d Dump d address: 显示地址内容(可用L指定显示行数)
db address: byte
dd address: dword
dq address: qword
r Register r: 显示寄存器
r register: 仅显示指定寄存器
bp Break Point bp: 设置断点
bl: 显示断点列表
bc: BP Clear (删除断点)
lm Loaded Module lm: 显示被调试进程中加载的模块 (库)
dt Display Type dt struct name: 显示结构体成员
dt struct name address: 映射地址到结构体并显示
!dh Display PE Header !dh loaded address:
!dh module name: 显示进程PE文件头

以'!'开头的命令为扩展命令

实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 输出ecx指向地址处的ascii字符串
da ecx
 
# 输出ecx指向地址处的unicode字符串
du ecx
 
# 给某个函数下断点,不区分大小写 
bp KERNELBASE!CreateProcessW
 
# 给某个函数下未加载模块断点,也不区分大小写,"u"是"unresolved"的意思
bu Shell32!ShellexecuteA
 
# 触发断点时执行"du eax"命令
bp kernelbase!CreateFileW "du ecx"
 
# 达到一定次数才停下来
bp kernelbase!CreateFileW ".if(@$t0<42f){.printf \"hits=%d\",@$t0;r @$t0=@$t0+1;gc;};.else{}"
 
# 内存断点,比硬件断点更强大
# e 执行时断下 1 内存大小 0xdeadbeef 地址
ba e 1 0xdeadbeef
 
# 列出当前断点
bl
 
# 删除编号为1的断点
bc 1
 
# 显示peb结构体
!peb
 
# 修改内存将BeingDebugged标志位置为0
# peb起始位置为eb8000,BeingDebugged为+0x2
ed eb8002 0
 
# 堆栈回溯,显示传递给堆栈跟踪中每个函数的前三个参数
kb
 
# 堆栈回溯,显示帧指针省略(FPO)信息。在基于x86的处理器上,显示还包括调用约定信息
kv
 
# 查看入口点地址(EP),也可以通过查看进程PE文件头的`address of entry point`的值来获取EP
# $exentry 是一个伪寄存器,总是等于EP
r $exentry
 
# 直接到达入口点
g @$exentry
 
# 显示进程PE文件头
!dh WOW64Test_x64
 
# 执行到RVA(相对地址)
g WOW64Test_x64 + 142C
 
# 显示TEB结构体成员
dt _TEB
 
# 详细列出请求地址的页堆信息,包括此地址与整页堆块的关系的完整详细信息,例如,此地址是否为页堆的一部分,其在块中的偏移量,以及块是否被分配或释放。只要可用,就包括堆栈跟踪
!heap -p -a eax
 
# 线程相关
# 当前线程
~.
# 所有线程
~*
# 造成异常的线程
~#
# 切换到1线程
~1s
 
# 清屏
.cls

搜索内存举例

1
2
3
4
# 下面3个都是搜索 "Hello"
0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o'
0:000> s 0012ff40 L20 48 65 6c 6c 6f
0:000> s -a 0012ff40 L20 "Hello"

从 0012ff40 开始,搜索 20 行,搜的目标是 ascii 形式的 "Hello"

设置symbol file path

File-->Settings-->Debugging settings-->Symbol path

1
C:\Symbols;SRV*C:\Symbols*http://msdl.microsoft.com/downloads/symbols

不行的话,可以试试 https
如果不想让WinDbg去网站获取pdb文件,直接把path设成本地的文件夹就好了(因为有时候太卡了,)

找不到依赖的文件

可以在打开程序时设置 Start directory


2018/9/29
2021/6/2


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2024-12-28 07:34 被qux编辑 ,原因: 调整大小写
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回