windbg是一款微软推出的专业实用的源码调试工具软件
1、符号表下载方法:使用命令下载对应的符号表symchk /r c:\windows\system32\k* /s SRV*c:\symbols\*https://msdl.microsoft.com/download/symbols
,然后就能在c:\symbols目录下得到对应dll的符号表;
2、windbg调试windows内核的设置:
(1)vmware设置,删除打印机,添加串口,命名为\.\pipe\comdbg,comdbg可以自定义,然后选择该端是服务器,另一端是应用程序;
(2)windbg设置,发送windbg到桌面,修改属性中的目标,加上-b -k com:port=\\.\pipe\comdbg,baud=115200,pipe -y symbols_path
;
(3)windows设置,使用管理员运行cmd,输入命令:
bcdedit /debugport 1
bcdedit /debugtype Serial
bcdedit /baudrate 115200
bcdedit /debug ON
bcdedit /bootdebug ON
打开虚拟机同时打开windbg即可。
3、windbg调试lsass:
(1)如果只需要在本地调试,直接管理员运行windbg,然后attach进程,然后设置符号表路径,.reload一下,然后结合ida下断点;
(2)如果是需要调试登录行为,在虚拟机(将防火墙关掉)运行:
dbgsrv.exe -t tcp:port=12345,password=debug
在本机(确保能ping通就行,没必要是本机)管理员运行:
windbg.exe -premote tcp:server=192.168.152.128,port=12345,password=debug -p 520
注意,两个windbg要是一样的才行,port是信息交互的端口,password是设置的连接口令,server是目标机ip,-p是lsass进程的pid。
(1)恢复运行g,单步步入t,单步步过p,单步执行到指定地址par|tar addr(r表示不要显示寄存器),单步执行到下一个函数调用pc|tc count(count个call),单步执行到下一个分支tb count,执行到本函数返回gu,在一次条件断点后恢复执行gc;
(2)观察和修改寄存器r;
(3)观察、编辑、搜索内存数据d、e、s,显示当前函数的参数和局部变量dv,du显示字符串,dt显示数据类型,dl遍历链表,dg显示详细信息;
(4)观察栈k、kv、kn,kb显示放在栈上的前三个参数,kp把参数和参数值都以函数原型的格式显示出来;
(5)设置断点bp、bu(用于对尚未加载模块中的代码设置断点)、bm(用于设置一批断点)、ba,列出所有断点bl,清除断点bc,禁用断点bd,重新启用断点be;
(6)显示和控制线程~;
(7)显示进程|;
(8)显示表达式?,显示c++表达式??;
(9)汇编a,反汇编u;
(10)显示段选择值dg;
(11)执行命令$;
(12)设置调试时间处理方式sx;
(13)显示调试器和调试目标版本version;
(14)检查符号x,搜索符号ln,显示模块列表lm;
(15)接数调试会话q;
(16)显示标准命令的列表和简单介绍?;
(17)观察当前的局部上下文;
(18)自动追踪当前函数并生成一份报告wt;
(19)显示目标系统的基本信息vertarget;
(1)符号路径.sympath,源文件路径.srcpath;
(2)重新开始会话.restart,创建新进程.create,附加到存在进程.attach,打开转储文件.opendump,分离调试目标.detach,杀掉进程.kill;
(3)加载模块.load,卸载模块.unload,下时已经加载模块.chain;
(4)显示日志文件信息.logfile,打开日志文件.logopen,追加.logappend,关闭日志文件.logclose;
(5)列出所有元命令和每个命令的简单说明.help;
(6)显示当前所使用的页目录基地址.context;
(7)显示或设置线程.thread;
(8)加载符号.reload;
(9)显示从调试器中调用被调试程序中的函数.call;
(10)切换进程上下文.process;
(11).thread设置线程上下文;
需要加载对应的dll文件,然后调用其中的命令。
(1)!process 0 0,列出系统中的所有进程进本基本信息,其中包含EPROCESS结构的地址,!process xxxx,显示xxxx对应进程的全部信息,!process xxxx 0,显示xxxx对应进程的基本信息,!process 0 0 xxx.exe,查找xxx.exe进程;
(2)!cpuinfo,显示cpu信息;
(3)!pcr显示处理器控制域信息,!prcb显示处理器控制块信息;
(4)!idt显示中断服务表;
(5)!irql显示目标系统中断到windbg时的中断请求级;
(6)!running显示所有cpu上正在运行的线程信息;
(7)!gflag显示、设置系统全局标志;
(8)!dml_proc显示进程列表;
(9)!thread显示线程详细信息;
(10)!address显示内存信息;
(11)!vm显示虚拟内存信息;
(12)!memusage显示物理内存信息;
(13)!pte显示指定地址对应的页表项和页目录项;
(14)!pfn显示物理内存页的详细信息;
(15)!db/!eb显示、修改物理内存,以字节形式进行;
(16)!pool显示内核内存池信息;
(17)!handle显示句柄信息;
(18)!object显示对象信息;
(19)!drvobj显示驱动信息;
(20)!devobj显示驱动设备信息;
(21)!analyze -v自动分析信息;
(1)Ctrl+Break用于暂停目标运行状态;
(2)注释,*注释后面一行,$$注释到分号结束,最好前面都加一个分号分隔前面的命令用于注释前面的命令在日志文件中可以被记录;
一次调试结束之后,可以将本次调试的窗口状态、断点信息保存到命名空间。
伪寄存器 | 含义 |
---|---|
@$scopeip | 当前上下文的指令指针 |
@$ea | 调试目标所执行上一条指令的有效地址 |
@$ea2 | 调试目标所执行上一条指令的第二个有效地址 |
@$exp | 表达式评估其所评估的上一条表达式 |
@$ra | 当前函数的返回地址 |
@$ip | 指令指针寄存器 |
@$eventip | 当前调试事件发生时的指令指针 |
@$previp | 上一事件的指令指针 |
@$relip | 与当前事件关联的指令指针 |
@$enentry | 当前进程的入口地址 |
@$retreg | 首要的函数返回值寄存器 |
@$retreg64 | 64位格式的首要函数返回值寄存器 |
@$csp | 帧指针 |
@$p | 上一个内存显示命令所打印的值 |
@$proc | 当前进程的EPROCESS结构的地址 |
@$thread | 当前线程的ETHREAD结构的地址 |
@$peb | 当前进程的PEB地址 |
@$teb | 当前线程的TEB地址 |
@$tpid | 拥有当前线程的进程的PID |
@$tid | 当前线程的tid |
@$bpx | x号断点的地址 |
@$frame | 当前栈帧的序号 |
@$dbgtime | 当前时间 |
@$callret | 使用.call命令调用的上一个函数的返回值 |
@$ptrsize | 调试目标所在系统的指针类型宽度 |
@$pagesize | 调试目标所在系统的内存页字节数 |