zoukankan      html  css  js  c++  java
  • windbg条件断点

     

    条件断点(condition breakpoint)的是指在上面3种基本断点停下来后,执行一些自定义的判断。

      在基本断点命令后加上自定义调试命令,可以让调试器在断点触发停下来后,执行调试器命令。每个命令之间用分号分割。

     语法格式如:

    0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
    0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"

    这两条是等价的.

     当然

    .if

    {

    }

    .else

    {

    }

    更好理解

     0:000> bp `mysource.cpp:143` "j (poi(MyVar)>0n20) ''; 'gc' " 
    0:000> bp `mysource.cpp:143` ".if (poi(MyVar)>0n20) {} .else {gc}"

    MyVar大于20则不stop,

    否则stop下来进行调试.

     MyVar符号表示符号所在的内存地址,而不是符号的数值,相当于C语言中的 &操作符的作用。Windbg命令poi的作用是取这个地址上的值,相当于C语言中的*操作符.因此这里取得MyVar的值.

     伪寄存器,帮助保存调试的中间信息

    考虑这样的情况,如果要记录某一个函数被执行了多少次,应该怎么做?简单的做法就是修改代码,在对应的函数入口做记录。可是,如果要记录的函数是系统API呢?

    设置寄存器   条件断点

     eax内的值为0xa3断点Sop. 没问题,Hah.

    0:000> bp mydriver!myFunction "j @eax = 0xa3  '';'gc'" 
    0:000> bp mydriver!myFunction ".if @eax = 0xa3  {} .else {gc}"
    但以下就不一定了,eax中人值为0xc0004321,

    不一定会断下来.

    为什么呢?

    原因是内核态时,MASM会对EAX中的值进行符号扩展.

    那么0xc0004321  会变成0xFFFFFFFFc0004321  

    这样当然断不下来啦。

    0:000> bp mydriver!myFunction "j @eax = 0xc0004321  '';'gc'" 
    0:000> bp mydriver!myFunction ".if @eax = 0xc0004321  {} .else {gc}"

     如何处理呢?看看下面就知道了.

    0:000> bp mydriver!myFunction "j (@eax & 0x0`ffffffff) = 0x0`c0004321  '';'gc'" 
    0:000> bp mydriver!myFunction ".if (@eax & 0x0`ffffffff) = 0x0`c0004321  {} .else {gc}"

    爽吧,高位清0!

     下面的命令可以统计VirtualAllocEx被执行了多少次:

    bp /1 /c @$csp @$ra;g

    bp kernel32!VirtualAllocEx "r $t0=@$t0+1;.printf \"function executes: %d times \",@$t0;.echo;g"

    这里用到的$t0就是Windbg提供的伪寄存器。可以用来存储中间信息。这里用它来存储函数执行的次数。r命令可以用来查看,修改寄存器(CPU寄存器和Windbg的伪寄存器都有效)的值。随便挑一个繁忙的进程,用这个命令设定断点后观察:

    0:009> bp kernel32!VirtualAllocEx "r $t0=@$t0+1;.printf
    \"function executes: %d times \",@$t0;.echo;g"
    0:009> g
    function executes: 1 times
    function executes: 2 times
    function executes: 3 times
    function executes: 4 times

     

      哈哈,这确实是一个好方法.

     

     

  • 相关阅读:
    APICloud框架——获取本地图片信息
    APICloud框架--sublime使用自定义loader
    Felx布局(三)
    Flex布局(二)
    Linux时间与Windows差8个时区的问题解决方法
    警惕javascript代码中的“</script>”!
    字母数字推理题
    “黑客”究竟是什么
    博客园自定义博客侧边栏公告的过滤漏洞
    一行命令实现Android自动关机
  • 原文地址:https://www.cnblogs.com/ahuo/p/1952355.html
Copyright © 2011-2022 走看看