zoukankan      html  css  js  c++  java
  • winDBG用法

    1.标准命令

      1.控制进程目标: 

        恢复:g, 跟踪执行:t, 单步:p, 追踪监视: wt  

      2.操作寄存器:

        r, rdmgr, wrmsr, rm

      3.读写io端口

        ib/iw/id   ob/ow/od

      4.内存命令  

        d, e, s

      5.栈   k

      6.断点:

        bp, ba硬件断点, bl列出断点, bc/bd/be 清除,禁止,重启断点

      7.显示进程l, 汇编a, 反汇编u

      8.显示段选择子 dg

    1.设置和保存工作空间

       直接通过ui界面操作即可

      工作空间保存了下列信息:

    调试会话状态: 包括断点,打开的源文件,定义的别名

    调试器设置:符号文件路径, 可执行文件路径, 源文件路径

    windbg图形界面信息:标题,窗口位置,字体等UI界面设置

    2.标准命令: 第一个字符不分大小写,第2个可能分  ? 查看标准命令帮助

    控制行为: g 恢复, t跟踪, p 单步, wt 追踪监视

    寄存器相关: r 观察修改寄存器, rdmsr, wrmsr读写msr寄存器,rm 设置寄存器显示掩码

    读写io: ib/iw/id 和ob/ow/od

    内存: d 查看, e 编辑, s 搜索

    栈: k

    断点:bp 软件断点, ba 硬件断点, bl 列出断点, bc/bd/be 清除,禁止,重启断点

    显示控制线程: ~

    评估表达式 ?,评估c++ ??

    汇编 a, 反汇编 u

    显示段选择子 dg

    执行命令文件 $

    检查符号 x

    控制显示源程序 ls系列

    加载调试符号 ld , 搜索相邻符号ln, 显示模块列表 lm

    结束回话 q, 分离目标 qd

    元命令:所有元命令以.开始  .help 查看元命令帮助

    显示,设置调试回话和调试器选项: .symopt, 符号路径:.sympath 和.symfix  这些带path和带fix的后面可以接路径作为参数

    源程序文件: .srcpath, .srcnoise, .srcfix 拓展命令模块路径:.extpath   匹配拓展命令的.extmatch

    用于可执行文件的.exepath.  反汇编: .asm  控制表达式评估其 .expr

    控制调试会话: .restart, .abandon, .create, .attach, 打开转储文件 .opendump , 分离调试目标的.detach,  .kill

    管理拓展命令模块: .load , .unload, .unloadall, 显示已有模块: .chain

    管理调试日志文件: 显示 .logfile, .logopen打开, 追加:.logappend , 关闭: .logclose

    编写命令程序如: .if .else .elsif .foreach .do .while .continue .catch .break .leave .printf .block

    ......

    拓展命令: .chain查看帮助

    ![拓展模块名].<拓展命令名>[参数]

     如开启hpa !gflag +hpa

    上下文:

    会话上下文, 进程上下文, 寄存器上下文, 局部(变量)上下文

    !session  显示会话, !session -s 会话号  切换到会话号  (内核调试)

    !sprocess 列出指定会话进程  (内核调试)

    进程上下文:

    !process 0 0 列出所有进程

    .process 地址

    .context 显示页目录基址(物理地址)

    寄存器上下文:

    当线程没有执行时它的大部分寄存器值存放在内存中,修改寄存器值也是内存中的而不是当前物理寄存器的

    .thread ethread地址 设置当前调试线程

    r  读取寄存器值

    局部(变量)上下文

    .frame 查看当前局部上下文

    dv 查看当前函数内局部变量

    ~0 s  切换到0号线程

    符号文件和模块

    观察模块:

    lm

    lm v

    !lmi 模块名  查看模块信息

    检查符号 x

    x 模块名!函数名或者变量名(可以加*#通配符)

    ln 地址 搜索该地址附加的符号

    控制调试目标

    1.初始断点: 通过windbg打开一个文件就断下 附加一个进程是通过创建远程线程来触发一个断点

    2.继续: gh 已处理异常继续运行  gn未处理该异常继续

    3.单步执行: 

    p 单步越过  t单步步入

    pa 地址 单步执行到地址

    ta 地址 和pa一样 类似于od f4

    图形界面上还有其他执行操作和快捷键

    wt监视执行过程

    gu执行到返回

    设置断点

     软件断点

    bp 地址 穿越次数

    bu 模块!函数名 当这个模块被加载后函数被调用时中断

    bm 模块名!函数名  目标可以设置*通配符,来设置多个断点

    硬件断点 ba access size options address

    access: e|r|w|i e是执行断点,r是读取或者写入断点,w写入断点,i i/o访问断点

    size: 数据大小:1,2,4字节

    选项: /1 一次性断点  /p 内核调试, 跟一个eprocess地址只有这个进程时中断时中断 /t 指定ethread线程   /c 数字  函数调用到达数字深度时中断

    条件断点,以上断点命令都可以设置条件断点

    命令 地址 "j (条件) '命令1'; '命令2' "  即当条件为true时断下并执行命令1否则执行命令2 . 一般有一条是g继续运行

    地址表达式:(确保地址是一条指令首地址

    nt!函数名 或者再+一个数字 表示偏移

    如果有调试符号可以包含行信息: bp `a!main.cpp:20` 对a模块的main.cpp文件的第20行下断

    针对线程断点: ~0 bp 0x88880000 如果有多个线程都会执行该地址的指令,但只对0号线程断下

    控制线程: 当中断时所有线程都是挂起的,当恢复时所有线程都被恢复.

    ~查看所有线程状态

    增加挂起计数:~1 n  对序号为1的线程增加1个挂起计数  

    减少挂起计数:~1 m 同上,效果相反

    冻结线程:~1 f  冻结后该线程不可执行

    解冻线程:~1 u

    执行线程单步: ~1 t

    栈回溯

    k 显示

    kb  显示栈上前3个参数

    kp

    kv

    dv查看栈变量

    分析内存

    显示内存区域

    d{a|b|c|d|D|f|p|q|u|w|W} option 地址1 地址2 

    a:ascii吗 b字节和ascii c:dword和ascii,d:dword ,D:double, f:flout, p:指针,q8字节显示, u:unicode,w:word,yb:二进制字节,yd二进制dword

    2地址表示地址范围或者一个地址1 外加一个数字,后面的数字表示从地址1开始显示这么多个目标类型的值

    显示数据类型

    dt 模块名!类型名   可以加通配符

    加-b屏蔽递归显示子类型 -rx  x表示递归显示x层子类型

    sa 地址范围 所搜ascii字符串  su搜索unicode字符串

    s-数据类型 地址范围 值1 值2 ....  如 s-d 0x00001111 12a000 11 22 33 ff dd 在0x00001111 后面12a000 的内容搜索11 22 33 ff dd这5个值

    甚至s-u 地址范围 "windbg" 在地址范围搜索windbg

    修改内存:e[a|u|za|zu] 地址 "修改后的值"

    a:ascii字符数组 

    u:unicode字符数组

    za:ascii字符串

    zu:unicode字符串

    显示内存属性:

    !address 地址

    内核调试

    注意的地方: 内核模块的加载和卸载并不频繁,如果发现内核模块被加载时需要注意这个可能与恶意代码有关

    当有驱动被加载时windbg将会提示. 

    查看加载驱动的驱动对象

    !drvobj 驱动文件名   :可以列出它的设备对象

    !object Driver  浏览所有驱动对象

    dt nt!_DRIVER_OBJECT 地址

    查找驱动对象:

    !devobj 设备地址(句柄,由dt nt!_DRIVER_OBJECT 地址获得)

    !devhandles 设备地址    查询那个用户进程拥有该句柄

    分析ssdt:

    查看item,他们的值(地址)相近,如果发现远离的地址,可以怀疑被修改.而这些正常地址在ntoskrnl.exe模块中.所以也可以看是否超出了该模块地址范围

    lm m nt 显示该模块地址范围,  然后检查所有驱动模块,看这个被修改的地址大致离哪个更近,然后可以分析那个可以驱动

    rootkit挂钩idt: 

    查看idt:  !idt

    正常idt 函数有微软签名,反之没有,识别被修改idt

      .................

  • 相关阅读:
    MySQL复制中slave延迟监控
    便于理解mysql内幕的各种逻辑图组
    MYSQL INNODB PAGE一督
    MySQL的show语句大全
    semi-consistent简介
    MYSQL常见的可优化点
    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程
    [MySQL5.6] 最近对group commit的小优化
    基于HTML5技术的电力3D监控应用(二)
    基于HTML5技术的电力3D监控应用(一)
  • 原文地址:https://www.cnblogs.com/freesec/p/6169317.html
Copyright © 2011-2022 走看看