首页
社区
课程
招聘
[原创]Win32Asm 驱动学习笔记<3>调试基础
发表于: 2013-8-6 16:55 10061

[原创]Win32Asm 驱动学习笔记<3>调试基础

2013-8-6 16:55
10061
版权声明

       本文所述内容很多来自互联网以及其他一些参考资料,并不是全部原创,属于学习笔记汇总,凡因此文引发的版权问题,作者本人不负任何责任。

自序

      虽我未学,下笔无文,然驱动入门之路何其曲折,何妨我将其倾注于笔墨文字,因其内容多引用经典,作者心得体会
穿插其间,故不敢擅称原创,借以笔记之说,攒此文字,以谓后来者。
           另作者不才,内容错漏之处还请海涵指正,谢谢。

Win32Asm 驱动学习笔记<3>调试基础

     第三章调试基础

本章目录
3.1 应用层调试信息的输出
   3.1.1 Debug宏简介
      3.1.2Debug宏的使用
[LEFT]3.2驱动调试信息的输出[/LEFT]
3.3  内核本地调试基础
3.4  坚持不懈,直到成功

正文开始:


[LEFT]        写驱动是一个不断调试的过程,因此我们有必要了解些调试手段,本章的内容主要是讲解程序中调试信息的输出。
    在应用层我们可以直接通过Debug系列宏来进行程序调试信息的输出,而在驱动层需要调用DbgPrint函数并且要配合DebugView监控内核来显示调试信息;
[/LEFT]
  
3.1 应用层调试信息的输出
    在应用层我们可以用Debug系列宏来进行调试信息的输出,它的定义在debug.inc。
[LEFT]   3.1.1 Debug宏简介
            Debug宏能在程序调试的过程中输出我们想要的信息,并且在发行版中这些代码会被优化掉
       我们使用前要在头文件中定义好它:
       includelib debug.lib
       include debug.inc

    另外,如果使用的是整合版,需要把RadAsm目录里的masm32目录复制一份到RadAsm安装的分区目录下,如”D:\ masm32”,否则会报错。

   3.1.2Debug宏的使用

         宏的定义都在debug.inc文件里,大家可以打开看下,我只介绍几个常用的宏:

      CTEXT

   作用:在.data段新建一个文本常量并返回地址给程序调用。

    调用例子:

           invoke MessageBox, NULL, CTEXT("OpenSCManager err!"), NULL, MB_OK + MB_ICONSTOP

   PrintText

     作用:用来调试输出文本内容

     调用例子:    PrintText<"debug message!">

       输出格式:内容(源文件名,所在行数)

     本例效果:debug message! (LoadDriver.asm, 34)
   

  PrintStringPrint   StringByAddr

  作用: 用来调试输出文本变量,并显示出源文件名及代码所在行
                   注意:前面一个参数是变量,后面一个参数需要变量地址
  
  调用例子:

    LOCAL szDriverFilePath [MAX_PATH]: CHAR
         PrintString  szDriverFilePath
         PrintStringByAddr  offset szDriverFilePath

   输出信息格式:变量名=变量内容(源文件名,行号)

   PrintDword  PrintDec

     作用:用来调试输出整数变量,并显示出源文件名及代码所在行

调用例子:
         Local  hSCManager
       PrintDword  hSCManager
       PrintDec  hSCManager

输出信息格式:变量名=变量内容(源文件名,行号)

  效果如下图:

[/LEFT]


[LEFT]3.2驱动调试信息的输出
     驱动需要通过DbgPrint来输出调试信息,这些输出信息可以通过DebugView对内核的监控来看到。
[/LEFT]
     DbgPrint可以对输出格式进行控制,如下表:
              符号                              格式说明符                    类型
%c,%lc                          ANSI字符                char
           %C, %wc                           宽字符                 wchar_t
            %d, %i                       十进制有符号整数              int
                 %D                               十进制__int64               __int64
                 %L                         十六进制的LARGE_INTEGER          LARGE_INTEGER
             %s, %ls                           NULL终止的ANSI字符串             char*
            %S,%ws                       NULL终止的宽字符串         wchar_t*
              %Z                          ANSI_STRING字符串        ANSI_STRING
              %wZ                         UNICODE_STRING字符串     UNICODE_STRING
              %u                             十进制的ULONG             ULONG
              %x                         小写字符十六进制的ULONG      ULONG
               %X                      大写字符十六进制的ULONG        ULONG
               %p                             指针Pointer             32/64位

      备注:根据DDK上说明,Unicode格式(%C, %S, %lc, %ls, %wc, %ws, %wZ)只能在 IRQL = PASSIVE_LEVEL时才能使用。

调用例子:
invokeDbgPrint, $CTA0("驱动加载成功! "),
invokeDbgPrint, $CTA0("驱动加载成功!eax  = %X\n"), eax

效果如图



[LEFT] 3.3 内核本地调试基础

    调试内核模式的代码需要合适的调试器,常用的有SoftIce和Syser以及微软的Windbg,但是随着windbg的不断更新强大,以及对windows高度的兼容性,windbg已经成为了主流,所以我们这里主要讲windbg。
     网上搜了下,整理了下具体步骤。[/LEFT]
步骤:
1.下载符号表 ,安装到真实系统中。
     系统版本选择下载页面:

    http://msdn.microsoft.com/zh-cn/windows/hardware/gg463028
   

    常用系统符号表:

   Windows 7 RTM x86 零售符号,所有语言(文件大小:323 MB - 大多数客户的理想选择。)
   Windows 7 Beta x86 零售符号,所有语言(文件大小:292 MB - 大多数客户的理想选择。)
   Windows XP with Service Pack 3 x86 零售符号,所有语言(文件大小:209 MB - 大多数客户的理想选择。)
2. 下载windbg程序的最新版本,同样也安装到真实系统中。
     

       最新的6.7原版+汉化:http://www.xdowns.com/soft/38/63/2012/Soft_94013.html

    先安装原版,然后复制汉化文件到安装目录即可。

3. 设置windbg符号路径:srv*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols

        这些完成后,我们就可以在本机调试了,本来后面还有虚拟机设置等用来动态调试,但现阶段我们没必要了解太多,只需知道本机一些简单的静态调试命令即可,为我们以后了解内核结构打下基础:

比如 ,我们想反汇编下内核的ZwTerminateProcess函数,就这样操作:

  打开windbg,按键 CTRL+K  ,弹出窗口选择最后一项:本地调试

在下面的输入框输入:  u nt! ZwTerminateProcess

注意:这里的nt! 表示内核 ntoskrnel.exe , 因为ring3里有同名函数,所以要加上nt!以 区别开来。

lkd> u nt! ZwTerminateProcess
nt!ZwTerminateProcess:
804dead0 b801010000      mov     eax,101h
804dead5 8d542404        lea     edx,[esp+4]
804dead9 9c              pushfd
804deada 6a08            push    8
804deadc e8500b0000      call    nt!ZwYieldExecution+0x9bd (804df631)
804deae1 c20800          ret     8
804deae4 b802010000      mov     eax,102h
804deae9 8d542404        lea     edx,[esp+4]

要查看数据,可以这样:   d nt! ZwTerminateProcess
lkd> d nt! ZwTerminateProcess
804dead0  b8 01 01 00 00 8d 54 24-04 9c 6a 08 e8 50 0b 00  ......T$..j..P..
804deae0  00 c2 08 00 b8 02 01 00-00 8d 54 24 04 9c 6a 08  ..........T$..j.
804deaf0  e8 3c 0b 00 00 c2 08 00-b8 03 01 00 00 8d 54 24  .<............T$
804deb00  04 9c 6a 08 e8 28 0b 00-00 c3 8b ff b8 04 01 00  ..j..(..........
804deb10  00 8d 54 24 04 9c 6a 08-e8 14 0b 00 00 c2 10 00  ..T$..j.........
804deb20  b8 05 01 00 00 8d 54 24-04 9c 6a 08 e8 00 0b 00  ......T$..j.....
804deb30  00 c2 10 00 b8 06 01 00-00 8d 54 24 04 9c 6a 08  ..........T$..j.
804deb40  e8 ec 0a 00 00 c2 04 00-b8 07 01 00 00 8d 54 24  ..............T$

以整数排列,这样:dd nt! ZwTerminateProcess
lkd> dd nt! ZwTerminateProcess
804dead0  000101b8 24548d00 086a9c04 000b50e8
804deae0  0008c200 000102b8 24548d00 086a9c04
804deaf0  000b3ce8 0008c200 000103b8 24548d00
804deb00  086a9c04 000b28e8 ff8bc300 000104b8
804deb10  24548d00 086a9c04 000b14e8 0010c200
804deb20  000105b8 24548d00 086a9c04 000b00e8
804deb30  0010c200 000106b8 24548d00 086a9c04
804deb40  000aece8 0004c200 000107b8 24548d00



总结下我们学到WinDbg命令:  

u      反汇编

d      以二进制显示

dd     以整数显示

3.4 坚持不懈,直到成功

       在开发驱动的过程中,一定会遇到无情的蓝屏,这时候就需要我们静下心来,仔细检查代码,不能被眼前的困难吓到,要深信:坚持不懈,终会成功。
    一篇《坚持不懈,直到成功》的演讲送给大家,如果大家遇到困难想放弃时就回过头来大声的读读这篇演讲,请相信它的魔力,读完它你就会有新的动力。
坚持不懈,直到成功   
                                                               
   我不是为了失败才来到这个社会上的,我的血管里也没有失败的血液在流动。我不是任人鞭打的羔羊,我是猛狮,不与羊群为伍。我不想听失意者的哭泣,抱怨者的牢骚,这是羊群中的瘟疫,我不能被它传染。失败者的屠宰场不是我命运的归宿。

  坚持不懈,直到成功。
  
   从今往后,我承认每天的奋斗就像对参天大树的一次砍击,头几刀可能了无痕迹。每一击者似微不足道,然而,累积起来,巨树终会倒下。这恰如我今天的努力。就像冲洗高山的雨滴,吞噬猛虎的蚂蚁,照亮大地的星辰,建起金字塔的奴隶,我也要一砖一瓦地建造起自己的城堡,因为我深知水滴石穿的道理,只要持之以恒,什么都可以做到。
 我要尝试,尝试,再尝试。障碍是我成功路上的弯路,我迎接这项挑战。我要像水手一样,乘风破浪。
 只要我一息尚存,就要坚持到底,因为我深知:坚持不懈,终会成功。

本章小结:

      本章的知识是非常重要的,一定要完全掌握,为以后驱动学习打下基础。

相关链接: 【原创】Win32Asm 驱动学习笔记 1-2 章

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (11)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
占位编辑。。。
2013-8-6 17:05
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
3
前排围观
2013-8-6 17:14
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
4
呵呵 ,写的很挫,见笑
2013-8-6 17:15
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
5
+1~~~
2013-8-6 17:16
0
雪    币: 167
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
支持,不解释
2013-8-6 17:19
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
7
谢谢支持
2013-8-7 08:44
0
雪    币: 6366
活跃值: (4336)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
8
好东西,感谢
坚持不懈,直到成功
2013-8-7 10:02
0
雪    币: 707
活跃值: (1301)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
9
学习你的好文章!
2013-8-7 11:46
0
雪    币: 941
活跃值: (1264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
占位学习,谢谢楼主
2013-8-7 17:54
0
雪    币: 210
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fsf
11
好贴。喜欢
2013-9-9 21:14
0
雪    币: 9
活跃值: (165)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
坚持不懈,直到成功!
2018-1-18 10:24
0
游客
登录 | 注册 方可回帖
返回
//