LLDB调试器栈符号化

By xia0

#强化你的lldb调试器

#Why?

lldb作为苹果iOS和macOS的调试器在正向开发中十分强大,不过对于逆向人员来说却不是很友好。尤其是那些符号表被strip以后的执行文件。去定位追溯一个函数的执行流程时,查看当前的栈帧只有一堆内存地址,如果要定位是哪个函数通常的流程就是找到当前模块的内存偏移,然后栈上的地址逐一减去改偏移然后去ida中查找改地址,最后才能定位到函数名。流程琐碎且都是重复工作,花费大量时间去定位符号信息。因此我想做一个能自动恢复栈帧符号的命令。只要输入改命令就能显示函数的调用情况。

#How?

但是符号表都已经被strip了怎么才能恢复符号呢?我的想法就是macho可执行文件中其实是有很大一部分段储存的OC函数信息,里面肯定是有类名和方法名的,我们要做的就是通过栈中的地址,遍历所有的类以及方法,找到最佳的类方法即可。判断原则就是找到距离栈地址最近且小于等于栈地址的类方法。然后记录类名和方法名即可。

正好lldb提供了python的接口,可以开发自定义的命令。

#And what ?

虽然有python接口,但是lldb里面集成了一个OC的解释器,其语法要求特别严格,按照通常开发的写法会有很多错误,经过不断的调试和修复bug,一个开发版基于lldb python栈符号恢复命令开发完成。git地址在这里

这里面还有的搜索算法以及异常处理还需要优化,以及对于block这类函数还不能恢复,不过对于大多数的场景目前还是可用。具体效果可以如下:

https://github.com/4ch12dy/xia0LLDB/blob/master/resource/b_bt.jpg?raw=true

https://github.com/4ch12dy/xia0LLDB/blob/master/resource/b_sbt.jpg?raw=true

#update

现已支持恢复block结构符号解析,通过提供的ida脚本,得到一个json格式的block符号文件,然后在lldb命令行中输入sbt -f block-json-file-path即可加载该文件。效果如下:

#原始的bt命令结果

orig_bt

#sbt命令(没有加载block符号文件)

sbt-noblockfile

#sbt命令(带有block符号文件)

sbt-blockfile