YJX_Driver_014_VM+Wlndbg调试驱动

1、

【120】以 第12课 的源码为例

【160】用 DDK 重新编译源码

【210】为了便于调试,我们下一个断点(ZC: 直接在源码里面下断点啊?),∵ 在入口函数那里下断点不太好下(ZC: 为什么?),我们可以在 卸载例程 里面下一个断点。

  【250】如果需要在 入口函数那里就开始跟的话,需要在DriverEntry里面加代码

    “

    __asm int 3; // 也就是一条 0xCC指令

    ”

  【285】重新编译一下

【325】驱动文件"DDK_HelloWorld.sys"改名为"ddk.sys"

【345】为了以后使用方便,我们将 文件source 中 的 "TARGETNAME"对应的值 由"DDK_HelloWorld"改为"ddk"

【390】将 "ddk.sys"和 驱动工具 复制到 虚拟机

【440】ZC: 虚拟机 是 运行状态,此时 打开 Windbg,它能自动的连接到 虚拟机,我记得我之前是不能这样做的啊?为什么?是∵ 虚拟机/WinDBG的版本不同?∵ 虚拟机里面也安装了WinDBG的缘故?这里 虚拟机里面的WinDBG上面也没做啊...

【570】DriverMonitor 加载驱动ddk.sys,"GO",虚拟机断下来了

  【608】查看 WinDBG中的内容

    【635】Windbg中输入 指令"u DDK!DriverEntry",于是就能看到“DDK!DriverEntry+0x5”的地方是cc指令(ZC: 这里的"+0x5"应该是指函数体内的体5个字节偏移处(从0开始))

    【705】WinDBG中源代码自动就出现了,∵ 源代码的路径是自动包含在我们编译的驱动里面的。如果没有显示出来,通过 WinDBG--> 文件 --> "符号文件路径(s)..."  来设置我们驱动对应的 .pdb文件的路径

  【825】F10 ==> 步过, F8/F11 ==> 步入

  【1020】跳出函数,只看到了 工具栏上对应的按钮/对应的命令是"gu",但是不知道对应的快捷键是啥

    【1075】跳出函数 ==> shift+F11 ==> 也就是 返回到上一层CALL执行

 

【1205】

序:

  1、想必大家都用过OD调试程序,单在这里我要说 OD用户层调试 和 WinDBG内核调试 有本质的区别。在OD离我们可以选择对某个进程进行单独的调试,而在内核离WinDBG则把内核视为一个整体,单它们也有一些共同之处,下边就让我们一起来了解。

【1265】除了 使用 int3断点之外,还可以使用 bp断点(也是int3断点/CC断点)

  【1328】"bp DDK_Unload"    ==> 也是可以的

  【1363】正确/完整的下 bp断点的方式:"bp ddk!DDK_Unload"

    这里前面的"ddk"是模块名(驱动文件名)

  【1420】命令"bl" 显示 我们下的断点。显示信息类似:

    “0 e f8ef48c0  0001 (0001) DDK!DDK_Unload”

    【1430】第2位的"e" 表示这是一个执行断点

  【1447】命令"bd 断点序号"  禁用断点 (视频中执行的命令是:"bd 0")

    ZC: 那上面的 第1位 就是指明 断点的序号喽

  【1460】命令"bl" 显示出断点,注意 这里 第2位"d" 表明断点处于禁用状态:

    “0 d f8ef48c0  0001 (0001) DDK!DDK_Unload”

  【1480】命令"bc 断点序号"  清除断点

  【1560】命令"be 断点序号"  启用指定断点

 

【1600】再下2个断点:"bp nt!ZwOpenProcess","bp nt!NtOpenProcess"

【1642】"bc nt!NtOpenProcess" 说有语法错误

【1697】WinDbg里面删除断点 必须 "bc 断点序号" 或者 WinDBG-->编辑-->"断点(B)...",在这里对断点(们)进行操作

 

【1760】尝试 "bp DDk_Unload" 断点也可以下下来

  ZC: 那就是 不区分"bp"后面的大小写喽,那以后写函数名的时候要注意一点了,省的给自己WinDBG调试惹麻烦

  【1825】在卸载驱动的时候,已经断下来了

 

【1870】虽然这里 卸载例程被成功调用了

  【1900】但是,我们用 "Kernel Detecive"来看一下(ZC: 视频中的版本为 "Kernel Detecive v1.3.0")

    【1935】还是可以看到 DDK.sys的存在

  【1955】再次使用 DriverMonitor 载入我们的驱动的时候,它说驱动已经存在了。

  【1990】种种情况表明 驱动未被正常的卸载

 

【2035】再讲一下 比较常用的 WinDBG命令

  【2050】"u DDK_Unload" (指定位置的反汇编指令)

    【2110】"u"命令 也可以使用绝对地址:"u f8ef48c3"

  【2140】命令"a",进入交互的模式:"a f8ef48c3"

    【2168】进入交互的模式 之后,可以将该条命令改为"mov ecx,ecx",然后还能接着继续修改接下来的指令

      【2200】这里又 改了2条指令为"mov ecx,ecx"

    【2208】此时再次"u f8ef48c3"  【2220】"u DDK_Unload",WinDBG有报错,他说貌似指令定位错了,可能是由于驱动被卸载的原因

      【2253】此时输入了一个 空命令"",然后再次"u DDK_Unload",居然就可以正确显示了... 他说是∵ 刚才没回车...

      ZC: 通过再次从【2200】处开始看,貌似在 进入交互模式 之后,需要输入一个空命令"" 来退出 交互模式,然后才能再使用 "u DDK_Unload"/"u f8ef48c3" 来查看

    【2300】可以看到用 命令"a" 可以实现改写内核代码的功能

 

2、

本讲:

命令g  :运行

命令u  :汇编(指定位置的反汇编指令)

快捷键F10    :步过

快捷键F8/F11  :步入

快捷键shift+F11  :跳出,返回到上层CALL执行

快捷键F5    :运行

命令bp    :下断点。int 3,CC断点。

命令bl    :显示断点列表

命令bc    :清除断点

命令bd    :禁用指定断点

命令be    :启用指定断点

命令"a 模块名!函数名/绝对地址"    :进入交互模式,可用于修改内核源码

 

3、

 

posted @ 2016-03-31 12:42  DebugSkill  阅读(244)  评论(0编辑  收藏  举报