郑州php网站建设,wordpress顶部提示,微信公众平台官方网站,客户都不愿意做网站调试符号windbg使用一个或多个目录来存放符号条件#xff0c;并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置#xff0c;对操作系统内部模块的符号文件#xff0c;一般用http://msdl.microsoft.com/download/symbols配置如下#xff1a;SRV*C:\Symbols*http://msd…调试符号windbg使用一个或多个目录来存放符号条件并使用环境变量_NT_SYMBOL_PATH来指向这些环境变量的位置对操作系统内部模块的符号文件一般用http://msdl.microsoft.com/download/symbols配置如下SRV*C:\Symbols*http://msdl.microsoft.com/download/symbolsld命令从符号文件目录或者符号服务器中加载符号lm命令观察符号模块的文件情况 或者单机“Debug - Modules选项符号的表示表示方法为”模块名称符号名称“操作系统内核的表示为 nt!符号名称符号查找功能模块名可以使用模糊搜索X [Options] Modules!Symbol有符号文件的情况下windbg可以调试源码CtrlP键在窗口中指定源文件的代码路径多个路径使用分号相隔调试过程 应用层实时调试开始调试时默认停留在ntdll中的系统断点处不会直接停留再程序的入口处可以在命令窗口输入 :g$exentry转到程序入口处单步相关指令命令快捷键功能tF8 或 F11追踪执行遇到call指令进去pF10单步执行遇到call指令不跳进去gF5运行程序pa 地址单步到指定地址不进入call指令ta地址追踪到指定地址进入call指令pc [count]单步执行到下一个call指令调用count参数用于指定call指令的个数tc [count]追踪执行到下一个call指令遇到call指令跳进去tb [count]追踪执行到吓一跳分支指令遇到call指令时跳进去只用于内核调试pt单步执行到下一条call返回指令tt追踪执行下一条call返回指令遇到call指令时跳进去ph单步执行到下一条分支指令th追踪执行到下一条分支指令遇到call指令时跳进去wt自动追踪函数执行过程断点指令1、软件断点bp、bu、bmbp是最常用的其格式如下bp [ID] [Options] [Address [Passes]] [CommandString]ID指定断点ID可不指定内核调试限制32个断点用户模式不限制Options可不指定/I中断后自动删除该断点即一次性断点/c指定最大调用深度大于这个深度则断点不工作/C指定最小调用深度Adress地址或者符号例如MesssageBoxWPasses忽略中断的次数可不指定CommondString当中断时执行指令用双引号包裹起来多个指令用分号分隔bu命令对某个符号下断点例如bu kernel32!GetVersionbu命令设置的断点是和符号关联的如果符号的地址变了断点会保持与原符号的关联bm命令设置通配符的断点可以一次创建多个断点例如对模块中所有 print函数开头的函数设置断点bm msvcr80!print*2、硬件断点硬件断点可以实现例如IO访问的的断点格式如下ba [ID] Access Size [Options] [Address] [Passess] [CommandString]Access指定出发断点的访问防止e在读取或执行指令时出发断点r在读取数据时出发断点w在写入数据时触发断点i在执行IO时触发断点Size访问的长度。在x86系统中其值可以为1、2、4代表一字节、字、双字x64系统中多了一个8代表四字节访问。3、条件断点软件断点和硬件断点都支持条件断点这两条命令是等价的。bp | bu | ba _Address j (Condition) OptionalCommands; gc
bp | bu | ba _Address .if (Condition) OptionalCommands; .else gc 例如 , 当GetVersion被调用是检测eax寄存器如果其值等于0x12ffc4就中断否则使用指令gc继续。bp kernel32!GetVersion .if(eax0x12ffc4){} .else{gc}在内核态下eax高位会补齐会变为0xffffffffc012ffc4这时可以用操作对高位清零bp kernel32!GetVersion .if(eax 0x0ffffffff)0xc012ffc4{} .else{gc}在不中断进程的情况下打印所有的CreateFileA函数调用代码如下bp kernel32!CreateFileA .echo; .printf\CreateFileA(%ma,%p,%p), ret\,poi(esp4),dwo(esp8),dwo(espc);gu.printf\%N\,eax;.echo;gpoi的作用是取这个地址上的值dwo用于从esp8地址中取8个字节。4、管理断点bl命令可以列出当前的断点bc命令、bd命令和be命令分别用于删除、禁用、启用断点断点号可以用*通配符匹配。例如bd 1-3,4 //禁止1、2、3、4号断点
bc * //删除所有断点栈窗口call指令会将函数的返回地址记录在栈中所以可通过遍历栈帧来追溯函数的调用过程。使用k[b|p|P|v|d] 命令可以查看栈回溯显示的是一定数量的栈帧第二个字母大小写敏感。00行描述的是当前中断所在的函数call01行描述的是调用00行中函数的上一级函数。第一列是栈帧的基地址因为x86系统用EBP寄存器来记录栈帧的基地址x64用第二列是函数的返回地址这个地址是调用本行函数的那条call指令的下一条指令的地址第三列是函数名及执行位置kb命令只用于显示放在栈上的前三个参数前两列与最后一列的内容跟上面一样。中间三列是子函数的参数不管函数的参数是多少这里只显示三个。kb命令可以携带参数例如”kb 2“即显示上面两层调用堆栈。kp名可以把参数和参数值以函数原型的形式显示出来包括参数类型、名字、取值必须有符号kv命令可以在kb命令的基础上增加帧指针省略信息和调用约定的显示kd命令用于列出栈中的数据内存命令1、查看内存d命令用于显示指定地址的内存数据格式如下d[类型] [地址范围]d命令有d、da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS等。dw表示双字节形式dd表示4字节形式dq表示8字节形式df表示4字节单精度浮点数格式dD表示8字节双精度浮点数格式dp表示指针大小格式在32位系统下为4字节在64位系统下为8字节。地址范围可以L(l)参数设置例如 dd 401000 L4 表示显示前四个数据da表示ASCII字符串db表示字节和ASCII字符串dc表示DWORD和ASCII字符串du表示Unicode字符串dW表示双字节WORD和ASCII字符串ds用于显示ANSI_STRING类型的字符串格式dS用于显示UNICODE_STRING类型字符串格式dyp表示显示二进制和字节dyd表示显示二进制和DWORD值dt [模块名!类型名] 用于显示数据类型和数据结构例如使用“dt ntdll!*”可以列出ntdll中所有的结构dds、dps、dqs用于显示地址及相关符号2、搜索内存s命令用于搜索内存s -[type] range patterntype 表示搜索内容的数据类型。b表示 BYTE w表示WORDd表示DWORDa表示ASCIIu表示Unicode。默认类型为brange表示地址范围可以用两种方式表示一是起始地址二是起始地址加长度L。如果搜索长度超过256MB则用 “Llength”pattern 用于指定要搜索的地址内容可以用空格分隔要搜索的数值。例如要在 400000h和403000h之间搜索Unicode字符串pediys -u 400000 403000 pediy在目标空间为2GB的user mode内存空间中搜索ASCII字符串 mytests -u 0x00000000 L?0x7fffffff mytets3、修改内存e命令用于修改指定的内存数据他有两种格式按字符串方式编辑指定地址的内容格式如下e{a|u|za|zu} adress String其中“za”和zu 表示以零结尾的ASCII和Unicode字符串z和u则表示不以零结尾按数值方式编辑格式如下e{a|b|d|D|f|q|u|w} adress [values]a表示ASCII码b表示BYTEd表示DWORDD表示doublef表示floatq表示8字节u表示Unicodew表示WORD例如 eb 287897 70 65 64 69 79表示写入 pediy执行完e命令在以d命令查看修改结果4、观察内存属性!address 用于显示指定地址的内存属性!address [Adresss]