最近慢慢复习过去的视频,看到了这个的使用,特此复习一下。
一、windbg使用1.常用指令
2.记忆指南通过了解 WinDbg 命令背后的英文全称来进行记忆,是非常高效且专业的学习方法。WinDbg 的命令设计其实非常符合英文直觉,掌握了缩写规律,你就不需要死记硬背了。这主要分为几大系列:1. 执行与反汇编 (Execution & Unassembly)命令英文全称 / 记忆词含义说明gGo运行程序,直到遇到断点或结束。uUnassemble反汇编指定地址的代码。ufUnassemble Function反汇编整个函数体。2. 内存查看命令 (d 系列 - Display/Dump)
d 代表 Display (显示) 或 Dump (转储)。后面的字母代表数据类型或格式:命令英文全称 / 记忆词含义说明dtDisplay Type显示结构体(Type/Struct)的内存布局。dbDisplay Byte按字节 (Byte, 8位) 显示。dwDisplay Word按字 (Word, 16位) 显示。ddDisplay Dword按双字 (Double Word, 32位) 显示。dqDisplay Qword按四字 (Quad Word, 64位) 显示。dDDisplay Double按双精度浮点数 (Double precision float) 显示。dfDisplay Float按单精度浮点数 (Float) 显示。daDisplay ASCII按 ASCII 字符串显示。duDisplay Unicode按 Unicode (UTF-16) 字符串显示。dcDisplay Chars (and Dwords)同时显示双字值和对应的 ASCII 字符 (Chars)。dsDisplay String显示 ANSI_STRING 结构体。dSDisplay String (Unicode)显示 UNICODE_STRING 结构体 (大写 S 代表宽字符/Unicode)。3. 内存写入命令 (e 系列 - Enter)
e 代表 Enter (输入/写入)。后面的字母代表写入的数据长度,规律同上:命令英文全称 / 记忆词含义说明ebEnter Byte写入一个字节。ewEnter Word写入一个字。edEnter Dword写入一个双字。eqEnter Qword写入一个四字。4. 断点命令 (b 系列 - Breakpoint)
b 代表 Breakpoint (断点)。命令英文全称 / 记忆词含义说明bpBreakpoint设置软件断点 (通常写入 int 3 指令)。baBreakpoint Access设置硬件/访问断点 (依赖 CPU 调试寄存器)。blBreakpoint List列出 (List) 所有断点。beBreakpoint Enable启用 (Enable) 断点。bdBreakpoint Disable禁用 (Disable) 断点。bcBreakpoint Clear清除 (Clear) 断点。5. 调用栈与寄存器 (Stack & Registers)
栈回溯命令以 k 开头(来源于 Call Stack 或直接作为回溯的标识)。命令英文全称 / 记忆词含义说明rRegister查看或修改寄存器 (Registers)。kpCall Stack with Parameters显示调用栈,并尝试打印函数参数 (Parameters)。kcCall Stack Clean显示干净的 (Clean) 调用栈,只看模块和函数名。6. 环境、进程与模块 (Environment & Modules)命令英文全称 / 记忆词含义说明lmList Modules列出 (List) 当前加载的所有模块 (Modules, 如 dll/exe)。!processProcess扩展命令,用于查看进程 (Process) 详细信息。.processProcess Context元命令,用于切换当前的进程上下文 (Context)。!HANDLEHandle扩展命令,查看句柄 (Handle) 信息。.reloadReload Symbols重新加载 (Reload) 符号文件。.sympathSymbol Path查看或设置符号路径。.clsClear Screen清屏。注:在 WinDbg 中,不带前缀的是内置基本命令;以 . 开头的是控制调试器自身行为的元命令 (Meta-commands);以 ! 开头的是由扩展 DLL 提供的扩展命令 (Extension commands)。3.注意事项用这些命令是必须要有符号表的,如果没有符号表的话,里面有些命令是无法使用的。1. 什么是符号表?(“翻译字典”)在 C/C++(或任何编译型语言)写代码时,我们会使用人类可读的名称,比如函数名 CreateFile、变量名 ProcessId、结构体名 _EPROCESS。
但是,编译器在把代码编译成 .exe、.dll 或 .sys 文件时,为了让 CPU 执行得更快,会把这些名字全部抹掉,替换成纯粹的内存地址(比如 0x00401020)和偏移量。符号表(在 Windows 中通常是 .pdb 文件)就是编译器在编译时顺手生成的一本“翻译字典”。 它记录了:“内存地址 0x00401020 对应的函数叫 CreateFile”“_EPROCESS 这个结构体总共多大,第 8 个字节代表什么变量,第 16 个字节代表什么变量”甚至包含了哪行汇编代码对应源代码的第几行。2. 为什么有些命令“没有符号表就无法使用”?你可以把 WinDbg 想象成一个只认识二进制的瞎子。如果你不给它这本“字典”,很多高级命令它就不知道该怎么执行。结合你上一张图里的命令,我们来看具体的例子:场景 A:查看结构体 (dt 命令)有符号表时:你输入 dt _EPROCESS,WinDbg 查阅字典,知道 _EPROCESS 是个结构体,然后完美地给你列出进程的每一个属性(PID、进程名、Token 等),非常清晰。没有符号表时:你输入 dt _EPROCESS,WinDbg 会报错提示找不到这个类型。因为它根本不知道 _EPROCESS 是个什么东西,在内存里长什么样、占多大空间。你只能用 dd(查看双字)去干看一堆毫无意义的十六进制数字。场景 B:使用内核扩展命令 (!process、!HANDLE 等)你图中的 !process 0 0 会列出系统中所有的进程。操作系统并没有一个现成的 API 叫“列出所有进程给 WinDbg 看”。WinDbg 是通过在内核内存中顺藤摸瓜(遍历一个叫 ActiveProcessLinks 的双向链表)把进程一个个找出来的。找这个链表,必须依赖内核结构体的精确偏移量。如果没有微软提供的内核符号表(如 ntkrnlmp.pdb),WinDbg 就不知道这个链表在内存的哪里,!process 命令就会直接罢工报错。场景 C:查看调用栈和下断点 (kp, bp)有符号表时:你输入 bp nt!NtCreateFile,WinDbg 知道要在创建文件的地方下断点
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-291401.htm
[讨论]WindbgPreview的使用
353 浏览
0 回复
暂无回复,快来抢沙发吧!