IDA调试技巧(妥妥的干货分享)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDA调试技巧(妥妥的干货分享)相关的知识,希望对你有一定的参考价值。

参考技术A IDA自动生成假名字。他们用于表示子函数,程序地址和数据。根据不同的类型和值假名字有不同前缀

先切换到graph view,然后在菜单上的“Options”、“General”里勾选

点击ok,即可看到效果

可以看到,多了前面的地址,这样就不用再graph view和text view之间来回切换了。

刚开始进行逆向分析的时候,我们就接触到这个公式

我们在每次下断点的时候,都是通过先手工在IDA里查看的偏移前模块基地址,再手工在LLDB里查看ASLR偏移,最后手工在计算器里将两者相加的方式来计算偏移后模块基地址的,虽然结果可以保证100%正确,但操作流程稍有些复杂,特别是每次计算偏移后模块基地址,每次copy,copy,然后add,这样真的超级烦超级烦有木有?那么,有没有简单的方法呢?

接下来,我们一起看看,如何才能只手工操作一次,就可以搞定所有断点的地址。那就是让IDA直接显示计算好的偏移后模块基地址。

这里ASLR偏移是0x00000000000a0000。

首先将鼠标光标点击到IDA右边的界面,这样才会有我们需要设置的选项。

在菜单上的“Edit”、“Segments”、“Rebase program...”里将“Value”的值加上TargetApp的ASLR偏移,

我们可以看到起始的地址是0x100000000

加上ASLR偏移地址

点击ok,这里需要等待一会。完成之后现在IDA里面的地址就是我们想要的偏移后模块基地址了,就可以直接拿来用了。

我们走起一个试验一下:

我们在右边IDA view里搜索方法名onClickButtonPressed,对这个方法进行下断点

搜索匹配到:

然后我们在调试的时候lldb下断点

ok,可以看到下面断点的方法就是我们搜索的方法名。

Xcode 高级调试技巧

每天与你分享 IT好书 技术干货 职场知识

Xcode 调试技巧

在使用正确的情形下,IDE 内置的调试工具能够帮我们节省大量时间。例如,与原始手动控制台打印相比,最简单设置断点进行单步调试的效率则要高出一个量级。而且这还仅仅只是调试武器库里的冰山一角,Xcode 有一整套方便的工具,旨在加快调试工作流程。

断点处自动执行任务

先来回顾一下断点调试时的常见场景:代码执行到了断点处暂停后,我们一般都会在控制台输入 po myVariable 等 LLDB 命令来获取上下文信息,然后再继续代码执行操作。

显然如果上述手动敲命令行的事情需要多次执行的话,那么调试过程也就变得非常乏味了,理想的情形应该是将其自动化,步骤如下:


    • 选中断点右键进行编辑


    • 点击 Add Action


    • 选中 Debugger Command


    • 输入你想执行的 LLDB 命令


    • 勾选 Automatically continue after evaluating actions,如果你希望执行相关命令后,继续运行程序。

Xcode 高级调试技巧

这样当每次断点被触发后,我们设置的自定义命令就会被执行。整个过程无需手动敲 LLDB 命令,节约不少的开发时间。

条件断点

有时候我们可能希望设置的断点只会在特定情形下才会触发。一个常见的例子就是:在某循环语句代码中,我们希望某断点在特定情形下被触发。这样我们就能避免大量无效触发,而且将自己从持续的 continue 点击下解脱出来。

Xcode 高级调试技巧

上面的例子中断点只会在 counter > 20 时才会被触发。当然你还可以使用更为复杂的 BOOL 语句,甚至是执行函数调用。

断点忽略

与条件断点相反,有时候我们可能需要在特定的时候跳过断点。例如,某个功能函数在生命周期内会被多次调用,但是我们对第一次调用不感兴趣。因此我们可以如下进行设置,使其在首次调用时直接跳过触发断点的行为:

Xcode 高级调试技巧

异常断点

上述几个情形下,我们都会明确在某行代码设置断点,但是有时候我们需求的断点则无法提前预设。例如,当程序在运行时发生异常并且未被捕获,此时程序会出现 Crash 。虽然 Xcode 会在控制台的打印出具体的调用栈等信息,并且大多数时候这些信息对于错误定位都非常有用,但是它毕竟没有直接将我们带到特定的上下文。

为了解决这个问题,我们就需要针对特定事件设置断点而非特定代码。你可以根据自己感兴趣的事件类型进行具体设置:

Xcode 高级调试技巧

符号断点

异常断点严格意义上来说是符号断点的一个具体类型,我们还可以定义更多自定义类型的通用断点。例如,我们可以对 viewDidLoad 方法的调用设置一个通用断点,在每次调用时进行触发:

Xcode 高级调试技巧

通过这种方式,我们就无需在每个调用处手动设置断点。

变量跟踪

上述的那些断点都是针对程序中的代码执行。但是应用却不是只包含代码,其中还有非常重要的另一个对象:数据。所以除了代码执行需要设置断点之外,某些数据的变化过程也有可能是我们所关心事件。

为了实现数据变化过程的跟踪,首先我们需要在变量可见域内设置断点。然后我们那在控制台右键设置变量观察,最后你可以取消该辅助断点。

Xcode 高级调试技巧

当然,我们也可以在控制台通过 LLDB 命令来完成设置:

watchpoint set variable self.counter

完成设置后,变量在整个生命周期内发生的任何变化都会触发断点。

总结

上述这些调试技巧仅仅只是很小的一部分,但是如果运用得当的话还是能够极大优化调试体验和速度。


延伸推荐



长按二维码,可以关注我们哟

每天与你分享IT好文。


异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!

扫一扫上方二维码,回复“关注”参与活动!

以上是关于IDA调试技巧(妥妥的干货分享)的主要内容,如果未能解决你的问题,请参考以下文章

reverse IDA使用技巧IDA动态调试Linux_ELF配置+例题:SCUCTF新生赛2021-DebugMe

Xcode 高级调试技巧

路由器漏洞调试的一些技巧

继续分享 5 个实用的 vs 调试技巧

Visual Studio 2015中的常用调试技巧分享

分享一个python调试程序BUG的技巧,有谁又会不出BUG呢