天天看点

IDA复合条件断点

---------------------------------------------

author:hjjdebug

date: 2017年 11月 26日 星期日 07:55:50 CST

---------------------------------------------

IDA复合条件断点

所谓条件断点就是满足一定条件才会中断的断点.

ida的条件断点或者说调试器的条件断点添加之后会显著影响代码执行效率,尤其是当

条件断点加在循环之内时, 因为每次运行到断点时,都要切换到调试器状态判断条件是否成立

才能确定是否该中断, 这个切换动作要执行成千上万条指令,意味着在这个局部,慢了成千上万倍.

本人亲历,运行几秒的程序,加了条件断点后,竟运行了30分钟才到达.

那如何解决这个问题,就是要用复合条件断点进行剪枝,才能达到秒杀的效果.就是说在大部分的循环中

都不设条件断点,只有在接近目标时,才设条件断点,达到节省时间的目的.

说得这么玄乎,那怎么剪枝?,怎么知道要接近目标? 还是看看实例吧.

背景:

在扫描病毒时,要扫描成千上万个文件,可能那个可疑的文件在后部,我们不关心前面的那些文件

只关心这个后部的文件.

假定在一个循环中,满足r2=0x19c(循环最大值,病毒库项个数), r3=0x8c(循环次数)扫到了可疑文件

你只需设定 break if (r2==0x19c && r3==0x8c) 即可.

你可能要说了,这么个小循环,哪在计算机话下!,

是的,这个小循环确实不大,但是前面还有r2=0x2a9c, r2=0x3e3, r2=...好多个循环没有列呢.这些值对应

着不同的病毒库. 现在需要你只关心r2=0x19c 时的库就好了!

问题是还不只是这个条件,这样断下来,也不是可疑文件,而是只有当调用过myScanElf函数后,再这样下断点才

管用,否则不是关键点. 因为执行的流程虽然是调用realScan, 但只有realScan调用到myScanElf, myScanElf

又递归调用到realScan后,才扫到了这个可疑文件,所以,要把前面的循环统统剪枝.

需求说清了,下面看看实现.

当然了,我们需要用到ida的脚本.

1. 设定myScanElf 断点, 中断后,再设定fScanDexSym 函数断点. (中断1次)

2. fScanDexSym 中断后, 查是否是PayWare库,是则设定loop断点.此时r2必然是0x19c了(中断几次)

3. loop中断后检查,只需检查0x8c次(中断0x8c此)

如此分而治之,通过大量剪枝,就可以秒杀到断点了!

不过实际上事情并不像描述的这么简单,由于IDA的bug, 你还会遇到其它问题, 例如loop中断虽断下来了,

但系统仍然向前跑, 破坏了你的调试环境, 这或许可以结合暂停按钮,再单步追踪等辅助解决. 现实和理想还是有点距离!

通过此例说明,纵使还有更复杂的触发条件,借助ida脚本,来完成条件设定.

说了这么多,其实核心是因为被调用的函数呈蘑菇云状,所以不能直接在底层函数直接下断点,而应该在上层先下断点, 然后再

再下层下断点, 实现二次断点或接力断点来有效中断!

继续阅读