zoukankan      html  css  js  c++  java
  • 64位内核第三讲,Windbg的使用.以及命令

    一丶驱动的调试.

    编写驱动免不了调试.所以这里介绍一下WinDbg的常用命令.

    1.线程

    命令 作用
    ~* 显示所有线程
    ~. 显示当前活动线程
    ~# 显示当前异常线程
    ~ num 显示第num个线程.
    ~ num s 切换到第num个线程
    ~*kb 显示所有线程的栈

    额外命令

    命令 作用
    .detach 取消附加你调试的进程
    .attach pid 附加你想调试的进程.需要16进制的pid

    2.断点

    命令 作用
    bl 列出系统中已经有的断点
    bc 清除断点例如: bc 1 -10 删除1 -10的断点. bc*清除全部
    bd 禁用断点,但不清除.
    be 激活断点.
    bp [address][模块名字][偏移] 下断点 bp xxModule!DisPatchRead + 0x30
    bu module!fun bu模块名加函数下段点.
    bm module!fun* 支持通配符.不支持加偏移下载.
    ba [w len] [r len] [e len] address 支持下内存断点 w写断点 len代表长度. address 代表在address下w len长度的内存写断点 r读,e执行.
    bp /p eprocess [address][func] 可以对下进程断点,只用xx进程调用这个代码的时候才会断下来
    bp /t ethread [address][fun] 对线程下端点.某个线程调用就能断下来.

    区别:
    bp 下的断点是死断点.函数名字变了但断点还是在哪里.
    bu 自动跟你你的函数进行下段点.不用担心会变.
    在新的windbg中,bp失败.会自动换成bu.

    3.内存查看命令

    dt命令可以查看一些结构

    命令 作用
    dt nt!_EPROCESS 查看nt模块中定义的EPROCESS结构
    dt nt!_EPROCESS -r 列出结构中的结构
    dt nt P*xxx 通配符方式,列出所有中带有P开头的接结构
    dt Address 结构 知道这个结构所在的地址.输入则可以将这块内存解释为这个结构.
    x nt!Zw 查找所有Zw开头的函数.

    内存数据类型显示命令

    命令 作用
    db [address] [L number] 以一个字节显示值和Ascii字符
    dw [address] [L number] 内存按照2个字节显示
    dd [address] [L number] 内存按照4个字节显示
    dp [address] [L number] 32位下等同于dd. 64位下等同于dq
    dq [address] [L number] 内存以8个字节显示
    df [address] [L number] 内存以4个字节浮点数显示

    db 0x800000 L4 以一个字节显示内存.显示长度为4 * sizeof(db )个
    字节.

    读取内存中的指针
    我们上面的d开头的命令你只能查看这个值.这个值有可能是存储指针.
    我们除非在进行一次d命令才可以,下面的命令直接就可以

    命令 作用
    ddp
    dpp
    dqp
    ddu
    dpu
    dqu
    dda
    dpa
    dqa

    d表示4个字节. q表示8个字节. p 32位下4个字节.64位下8个字节.
    所以p是可以灵活转化的.
    所以上面的命令可以简化为

    命令 作用
    dpa
    dpu
    dpp [len] 显示局部变量的值
    dps
    dv 显示局部变量的值,看变量的起始地址是ebp-xxx是

    p: DWORD或者Qword
    a: Ascii
    u: UNICODE
    所以上面的命令可以解析一下
    如:
    dpa
    d: 命令前缀
    p: 根据32位还是64位,分别以4个字节.或者8个字节显示
    a: Ascii吗.
    所以意思就是: 解析地址里面的值.如果是指针.则以32/64位显示为AscII码.

    字符相关

    命令 作用
    da 显示ascii值
    du 显示unicode值
    ds 显示ANSI_STRING的值
    dS 显示UNICODE_STRING的值.注意大小写.

    4.修改内存命令

    命令 作用
    eb [address] value 修改一个字节,很重要.可以改代码的机器码.
    ed [address] value 修改4个字节
    eD [address] value
    ef [address] value 修改float内存
    ep [address] value 修改指针内存
    eq [address] value
    ew [address] value
    ea [address] value
    eu [address] value
    eza[address] value
    ezu [address]value

    关于修改内存.只需要熟悉 eb ed即可.

    5.栈相关操作命令

    命令 作用
    kv 显示当前栈的调用情况.显示函数的前3个参数
    !irp address 查看当前Irp的值.
    kp 显示当前栈,显示当前函数的所有参数

    ChiEbp RetAddre Args
    上一层的EBP 当前函数返回地址 当前调用函数的参数

    6.进程线程命令(内核命令)

    命令 作用
    !process 0 0 列出系统进程信息
    !process 0 7 列出系统进程详细信息
    !process EPROCESS 7 列出进程详细信息
    .process /p EPROCESS 进入该进程上下文,如果不切换查看他的信息查看不到.
    .thread ETHREAD 进入该线程上下文
    !thread ETHREAD 查看线程结构
    .logopen d:xx.txt 开关语句. 显示的所有内容都重定向到xx.txt
    .logclose 上面设置了开关,下面就要进行关闭.
  • 相关阅读:
    Python入门系列——第17篇
    Python入门系列——第16篇
    Python入门系列——第15篇
    Python入门系列——第14篇
    Python入门系列——第13篇
    Python入门系列——第12篇
    python入门系列——第11篇
    Python入门系列——第10篇
    Python入门系列——第9篇
    Python入门系列——第8篇
  • 原文地址:https://www.cnblogs.com/iBinary/p/10990672.html
Copyright © 2011-2022 走看看