摘要:关于x64dbg的条件断点的记录。md网上关于x64dbg的资料少的可怜,接下来就详细的说说。

OD里面的断点设置条件时默认不管加不加0x默认都是按照十六进制算,IDA不加0x就是按照十进制。x64dbg和OD规则一样,反人类。

关于下面各个操作步骤的说明

当在程序中点击按钮后会触发0x0045AB89处的断点,在0x401E98可以看到寄存器的值可以看到输入的字符串。

所用到的断点.jpg

msg打印输出

ebx:{ansi@ebx}

msg打印1.jpg

ebx:{s:ebx}

三个???,因为是编码的问题,把输入换成英文字符就好了

msg打印2.jpg

把输入换成英文后

msg打印3.jpg

两者的区别:

ebx:{ansi@ebx}  这个打印结果为 1234
ebx:{s:ebx} 这个打印结果为 "1234"

普通的条件断点

当ECX寄存器的值等于0x00469B4C,程序断下
组合条件断点2.jpg

当ECX寄存器的值等于0x00469B4C,并且EAX等于0时,程序断下
组合条件断点.jpg

当地址ESP+4指向的内容是0x202时暂停
组合条件断点3.jpg

字符串条件断点

插件地址

这个网上找了很久也没人说,最后在x64dbg的github issue上找到了答案
插件地址: strmatch plugin
插件作者的说明

Simple string matching plugin for x64dbg. Supports UTF8, UTF16 and Local codepages.
[strmatch] documentation:
  1. Command: strmatch_set index, "string"
  2. Expression function: [action]_[encoding](va, index)
  Actions: strcmp, stricmp, strstr, stristr
  Encodings: utf8, utf16, local
  Example: strcmp_utf16(va, index)

Example
strmatch_set 1337, "hello"
stristr_utf8(edx, 1337)

自翻中文版

1337相当于c语言变量
ebx寄存器的值是字符串的地址

strmatch_set 1337, "bb"
strcmp_local(ebx, 1337) //两个字符串不同返回0,相同就返回一。
stricmp_local(ebx, 1337) //两个字符串不同返回0,相同就返回一,不区分大小写。
strstr_local(ebx, 1337) //ebx指向的字符串是否包含1337字符串, 不包含返回0,包含返回1。
stristr_local(ebx, 1337) //ebx指向的字符串是否包含1337字符串,不区分大小写,不包含返回0,包含返回1。

其中的local可以根据编码换成utf8, utf16。local应该是本机默认的编码?反正windows下就是gbk。
例如strcmp_local可以换成strcmp_utf8,感谢插件作者,真好用。

使用方法

  • 在最下面的命令行输入strmatch_set 1337, "bb",然后回车

字符串比较1.jpg

  • 设置条件断点
    stristr_local(ebx, 1337) == 1

字符串比较2.jpg

  • 在程序中输入字符串123bbDD

字符串比较3.jpg

  • 断点断下成功

字符串比较断下.jpg

步进直到条件满足/步过直到条件满足

功能说明:

TraceIntoConditional/ticnd
通过StepInto(F7)跟踪程序,直到满足指定条件或达到最大步数。
参数1 使用的条件。当计算为0以外的值时, 跟踪将停止
参数2 在调试器放弃之前跟踪的最大步数


TraceOverConditional/tocnd
通过StepOver(F8)跟踪程序,直到满足指定条件或达到最大步数。
参数1  使用的条件。当计算为 0 以外的值时, 跟踪将停止
参数2  在调试器放弃之前跟踪的最大步数

使用例子:

//要么eax=0x79要么运行够10000步调试器停止。
//ticnd相当于一步一步运行,推荐用这个,虽然运行速度慢。
ticnd eax==0x79,10000
 
//tocnd会跨过函数调用
tocnd eax==0x79,10000 

//从ECX指向的内存处取一个字节,当这个字节等于B7的时候,调试器暂停。
// 这个功能不能用,当ECX的值是一个非法地址比如0x202,也会暂停。
//划重点 不能用
//划重点 不能用
ticnd byte:[ecx]==B7,10000

关于字符串条件下tocnd或者ticnd

就很好奇,明明x64dbg开发者貌似github上的issue也回的贼快,不知道为啥就不能好好写一个帮助文档。越用越感到x64dbg是真的强大。
使用方法:

  • 启动运行跟踪:

字符串ticnd.jpg

字符串ticnd2.jpg

  • 在最下面的命令行输入strmatch_set 1337, "bb",然后回车

字符串ticnd3.jpg

  • 设置条件断点
    stristr_local(ebx, 1337) == 1

字符串ticnd4.jpg

字符串ticnd5.jpg

  • 断下成功

字符串ticnd6.jpg

所用到的测试软件以及插件

附件.rar