IDA Pro 调试器命中计数器

逆向工程 艾达 调试器 命中计数器
2021-06-13 18:09:02

我正在寻找一种方法来找出在断点命中之前执行了多少次指定地址处的指令。

有标准的方法吗?我在它的界面中找不到这个。

3个回答

免责声明:我现在没有可用的 IDA 来试用它,所以细节可能是错误的。

只需在断点条件中添加一些代码即可。例如

extern bpcount;
bpcount++;
Message(form("%d. hit\n"), bpcount);
return (bpcount>500);

这将在每次出现断点时增加计数,但只有在超过 500 次点击后才会中断程序。将 return 指令替换为return 0if you never want to break, or return 1if you always want to break.

显然,IDA 7.0(及更早版本?)支持断点的“通过计数”,您甚至可以在断点列表窗口中看到该列,但我发现无法通过 UI 对其进行配置。

您可以使用以下 Python 命令创建一个带有传递计数的断点0x12345678,您要设置它的地址在哪里,以及42命中计数:

add_bpt(0x12345678, 1, BPT_DEFAULT)
set_bpt_attr(0x12345678, BPTATTR_COUNT, 42)

Python在断点上添加了脚本。

f = open('C:\\Users\\T3\\Desktop\\Count.txt', 'r+')
strData = f.readline()
n = int(strData)
n = n + 1
f.seek(0)
f.write(str(n))
f.close()
return 0

Count文件开头包含0但执行后包含命中计数。


这种方式有一个缺点。文件 IO 很慢,因此可以使用注册表计数器,因为它存储在内存中(仅适用于 Windows)。