-
-
[原创]windbg相关
-
发表于: 2024-8-10 08:44 1902
-
windbg相关
WinDbg是Windows官方提供的内核模式和用户模式调试器。
安装
安装WDK时会默认安装,不过这里的windbg界面更现代一点
https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/
遇到"解析应用包时出错"可参考该链接解决
https://github.com/microsoftfeedback/WinDbg-Feedback/issues/159
离线安装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
很友好
官方学习资料: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windbg
简单的快捷键
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
赞赏
他的文章
- [求助]关于注册表项关闭windows的ASLR功能 1843
- ghidra---配置获取加载pdb文件 389
- [原创]windbg相关 1903
- [分享]x64dbg---调试dll的指定导出函数 7679
- 低版本VMP脱壳 4279
看原图
赞赏
雪币:
留言: