zoukankan      html  css  js  c++  java
  • Windbg:如何给字符串下条件断点

        因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp。用法和c中的字符串比较方法一致。在需要比较字符串成员变量的时候,遇到了点问题。因为字符串成员变量无法直接获取字符串内容。poi指令是直接取地址。所以需要结合伪寄存器和别名进行封装。

    伪寄存器语句如下:

      1 r @$t0=@@(&this->_test._Bx._Buf)

    _test变量的类型为string。@@为C++语法表达式。

    别名的语句如下:

      1 as /ma ${/v:testAlias} @$t0

    此时使用al,即可看到testAlias的内容即为_test的内容。

    此时配合$sicmp指令的语句如下:

      1 .if($cicmp("${testAlias}","Test")==0)

    用来判断别名testAlias的内容是否等于“Test”,不区分大小写。

    此时再配上bp,就得到了以下语句:

      1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .if($sicmp("${testAlias}","Test")==0{}.else{}"

    但是此时会遇到两个问题:

    Q1:$sicmp的第一个参数值不重新计算

    Q2:testAlias的值没有更新

    第一个问题可以使用.block来解决:

      1 .block {.if($sicmp("${testAlias}","Test")==0{}.else{}}

    第二个问题可以使用ad /q testAlias来删除老的别名解决。所以最终的语句如下:

      1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .block{.if($sicmp("${testAlias}","Test")==0){.echo Found; ad /q testAlias;}.else{.echo Not Found; ad /q testAlias; gc;}}"
  • 相关阅读:
    网线 ------ 交叉线
    ubuntu ------ 网络 ifconfig 不显示IP地址
    STM32L011D4 ----- 低功耗
    List 集合 使用 remove 踩得坑
    Map 集合遍历的4种方法
    elasticsearch 集群详解
    谷歌浏览器添加插件时显示程序包无效:"CRX_HEADER_INVALID" 解决办法
    MySql数据库 优化
    MySql 索引
    Kibana 安装
  • 原文地址:https://www.cnblogs.com/navono007/p/6242334.html
Copyright © 2011-2022 走看看