• 【旧文章搬运】Windbg+Vmware驱动调试入门(三)---Windbg基本调试入门


    原文发表于百度空间,2009-01-09
    ==========================================================================

    这一节的内容是Windbg入门,用一些基本的命令告诉你如何使用Windbg~~
    仅作入门,更详细的可以参考Raymond老师的《软件调试》的第30章---"WinDbg用法详解"和Windbg自带的帮助文件

    我使用调试器的经验完全来自于Ring3的Ollydbg,所以我在初用Windbg时觉得如果Ollydbg的功能我在Windbg中都知道如何使用的话,那我基本可以叫做入门了,下面我就以这个想法来谈谈Windbg的入门~~
    Windbg是基于命令控制的,刚开始觉得烦琐,其实用了之后才发现很强大~~~

    1.基本调试控制
    运行程序(Run): 快捷键:F5 命令:g
    单步步入(Step In): 快捷键:F8 命令:p
    单步步过(Step Over): 快捷键:F10 
    运行到光标所在行: 快捷键:F7
    执行到返回:gu
    执行到指定地址:g [Address]
    重新运行调试程序: 快捷键:Ctrl+Shift+F5(这个对驱动一般用不到)

    2.断点
    断点之于调试当然是非常重要的
    常用命令:
    bp [Address]or[Symbol] 在指定地址下断
    可以使用地址或符号,如
        bp 80561259(Windbg默认使用16进制)
        bp MyDriver!GetKernelPath
        bp MyDriver!GetKernelPath+0x12
    bp [Address] /p eprocess 仅当当前进程为eprocess时才中断
    这个很常用,比如你bp nt!NtTerminateProcess,但是只想在某一进程触发此断点时才断下来,那就加上这个参数吧,因为内核中的代码是各个进程共用的,所以此命令很实用
    bp [Address] /t ethread 仅当当前线程为ethread时才中断,用法跟/p参数类似
    bu [Address]or[Symbol] 下一个未解析的断点(就是说这个断点需要延迟解析)
    这个也很常用,比如我们的驱动名为MyDriver.sys,那么在驱动加载之前下断bu MyDriver!DriverEntry,
    然后加载这个驱动时就可以断在驱动入口,并且这个是不需要调试符号支持的
    bl 列出所有断点,L=List
    bc[id] 清除断点,c=Clear,id是bl查看时的断点编号
    bd[id] 禁用断点,d=Disable,id即断点编号
    be[id] 启用断点,e=Enable,id为断点编号

    3.查看和修改数据
    调试中不可避免的要查看和修改数据
    查看内存:
    db/dw/dd/dq [Address]       字节/字/双字/四字方式查看数据
    da/du [Address]           ASCII字符串/Unicode字符串方式查看指定地址
    其它常用的如查看结构
    dt nt!_EPROCESS
    dt nt!_EPROCESS 89330da0 (把0x89330da0作为对象指针)
    修改内存:
    eb/ew/ed/eq/ef/ep Address [Values] 
    字节/字/双字/四字/浮点数/指针/
    ea/eu/eza/ezu Address [Values] 
    ASCII字符串/Unicode字符串/以NULL结尾的ASCII字符串/以NULL结尾的Unicode字符串
    搜索内存:
    s -[b/w/d/q/a/u] Range Target
    搜索字节/字/双字/四字/ASCII字符串/Unicode字符串

    4.寄存器
    在用Windbg调试时可以Alt+4直接调出寄存器窗口,然后拖放到合适的位置就可以。
    要修改呢就直接双击相应的项就可以了。
    把命令的方式也说一下,比较简单:
    r 显示所有寄存器的值
    r eax 显示eax的值
    r eax=1 修改eax的值为1

    5.辅助命令
    !process 显示当前进程信息
    !process 0 0 显示当前所有进程(会有僵尸进程)
    !process 1f4 显示pid为1f4的进程信息,后面也可以跟eprocess的值
    !thread 显示当前线程信息
    !thread 
    !process 1f4 显示tid为768的线程信息,后面也可以跟ethread的值
    栈相关:
    k 显示调用栈
    kb 显示ebp和前3个参数
    kp 以函数调用形式显示栈

    以上就是常用的命令了~~~


    来个简单的实践过程,步骤如下:
    1.编译好你的驱动,假设名为ShowSSDT.sys,并把驱动符号文件ShowSSDT.pdb发送到MySysSymbols文件夹下(之前设定的自己的调试符号文件夹)
    2.启动虚拟机,选择调试方式进入系统
    3.迅速打开“双机调试”,建立调试连接,详细过程第二节讲过了
    4.等待虚拟机中系统启动完毕(不等也行,反正下断要在驱动加载之前就行了)
    5.在Windbg中按下Ctrl+Break,输入bu ShowSSDT!DriverEntry,回车确认,然后输入g命令继续执行
    6.把ShowSSDT.sys拖到虚拟机中,在虚拟机系统中启动InstDrv,加载此驱动
    7.回到Windbg窗口,如果一切正常的话,你会看到已经中断在ShowSSDT.sys的入口代码处了
    接下来,要单步还是要下断点、要继续执行什么的,就全由你来作主了~~
    仅作入门,Windbg自带的帮助其实很全了,学习要靠自己哦,小童鞋加油~~

  • 相关阅读:
    python之字典操作
    python之元组操作
    初始超算
    后缀自动机
    博弈
    曼哈顿最小生成树
    莫队算法
    主席树
    [HNOI2014]世界树
    [SDOI2011]消耗战
  • 原文地址:https://www.cnblogs.com/achillis/p/10181124.html
Copyright © 2020-2023  润新知