zoukankan      html  css  js  c++  java
  • OD实例2条件断点

    以下演示如何下条件断点:

    在调试过程中,经常希望断点满足一定条件时才中断,这类断点称为条件断点,

    在OD的帮助文档有详细的说明:

    (1)按寄存器条件中断:

    用OD打开Conditional_bp.exe,在0040147c,按shift+F2设置条件断点:

    输入表达式eax == 040000,这样如果eax为0400000h,OD将中断,

    用OD帮助文档解释下:

    040000- 所有整数常量都认为是十六进制的,除非后面跟了点

    EAX - 寄存器EAX的内容,解释为无符号数

    (2)按存储器条件中断

    先看下CreateFileA函数:

    HANDLE WINAPI CreateFile(
      __in          LPCTSTR lpFileName,//指向文件名的指针
      __in          DWORD dwDesiredAccess,
      __in          DWORD dwShareMode,
      __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes,
      __in          DWORD dwCreationDisposition,
      __in          DWORD dwFlagsAndAttributes,
      __in          HANDLE hTemplateFile
    );
    
    

    运行Conditional_bp.exe,对CreateFileA设断,单击OpenTest按钮,断下来,在堆栈窗口单击右键,执行Address/Relative to ESP(地址/相对于ESP)菜单:

    则堆栈窗口最左边标识了各参数相对于当前ESP的地址:

    假设当CreateFile打开"c:\\1212.txt"时实现中断,则shift+F2

    键入字符 [STRING[esp+4]] =="c:\\1212.txt"

    用OD帮助文档解释下:

    [esp+4] - 在地址esp+4处的无符号双字内容

    STRING [123456] - 以地址123456作为开始,以零作为结尾的ASCII字符串。中括号是必须的,因为您要显示内存的内容
    [STRING 123456]=="Brown fox" - 如果从地址0x00123456开始的内存为ASCII字符串"Brown fox"、"BROWN FOX JUMPS"、 "brown fox???",或类似的串,那么其值为1。比较不区分大小写和文本长度

    EAX=="Brown fox" - 同上,EAX按指针对待。

    UNICODE [EAX]=="Brown fox" - OllyDbg认为EAX是一个指向UNICODE串的指针,并将其转换为ASCII,然后与文本常量进行比较

    运行,断了下来

     也可直接在CMD框中输入bp CreateFileA,[STRING[esp+4]]=="c:\\1212.txt"(注意CreateFileA大小写别错了,中间有无逗号没有影响)

    如果是UNICODE,就用[UNICODE[ESP+4]]=="c:\\1212.txt"

    OD条件断点BUG:

    首先我们看一下 CreateFileA 在 MSDN 中的解释:
    HANDLE CreateFile(
      LPCTSTR lpFileName,          // pointer to name of the file
      DWORD dwDesiredAccess,       // access (read-write) mode
      DWORD dwShareMode,           // share mode
      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                   // pointer to security attributes
      DWORD dwCreationDisposition,  // how to create
      DWORD dwFlagsAndAttributes,  // file attributes
      HANDLE hTemplateFile         // handle to file with attributes to 
                                   // copy
    );
    从上面我们可以看出第一个参数就是文件名指针,也就是说这个参数中存放的就是文件名称的地址。在32位程序中调用这个函数时这个参数的堆栈地址就应该是esp+4(4×8=32),同理,下一个参数就应该是esp+8。其它类推,返回值是esp+0。我们现在要判断文件名,这里的文件名就是esp+4地址所指向的地址中的内容。取地址中的内容在OD中用双方括号来操作,如取esp+4中的内容就该写成这样:[esp+4]。现在我们取的[esp+4]中的内容还是个地址,所以要得到文件名则还要再取这个地址中的内容,就该这样:[[esp+4]]。而那个STRING前缀在OD中的解释是以零作为结尾的ASCII字符串。所以我们下条件断点时这样写:
    bp CreateFileA,[STRING [esp+4]]=="abcdefghigklmn"
    但却发现断不下来,写成这样:
    bp CreateFileA,[[STRING [esp+4]]]=="abcdefghigklmn"
    才能断下来,这里就应该是三层的地址了。为什么这样目前尚不清楚


     

    以下演示条件记录断点

    条件记录断点除了具有条件断点作用,还能记录断点处函数表达式或参数的值,也可以设置通过断点的次数,每次符合暂停条件时,计数器减一

    如要记录Conditional_bp.exe调用CreateFileA函数的情况,在CreateFileA函数的第一行,按Shift+F4键,出现条件记录窗口:

     在Condition(条件)域中输入要设置的条件表达式,

    Explanation(说明)域中由用户自己设置一个名称,Expression(表达式)域中是要记录的内容的条件,只能设置一个表达式,如填的是[ESP+4},则要选择"Pointer to ASCII String",才能正确打印出字符串,

    Pause program是指OD遇到断点时是否中断,Log value of expression是指遇到断点时是否记录表达式的值, Log function arguments是指遇到断点时是澡记录函数参数,

    Never(从不),On condition(按条件),Always(永远)等条件

  • 相关阅读:
    excel VBA构造正则函数(双参数)
    excel VBA构造函数就是这么简单
    excel VBA中正则模块vbscript.regexp的用法
    excel VBA构造正则函数(单参数)
    USB 设备插拔事件处理
    MySQL 修改 root 密码命令
    函数指针
    串口编程需要注意的地方
    写开机自启动程序应该注意的一点
    C++ 中 delete 和 delete[] 的区别
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693496.html
Copyright © 2011-2022 走看看