最新消息:本站技术交流 QQ 群:28124927

编写 LLDB 调试器脚本

iOS/MacOSX/移动安全 exchen 539浏览 0评论

编写 LLDB 调试器脚本

LLDB 调试器提供对 Python 脚本的支持,可以执行一些自动化的操作,提供工作效率。本文从 HelloWorld 开始学习如何编写 LLDB 脚本。

编写第一个 LLDB 脚本

下面我们来实际操作编写 LLDB 调试器脚本。在计算机上建立一个目录用于存脚本文件,比如我们在 /Users/exchen/lldb 这个目录下操作,新建一个 HelloWorld.py 的文件

test 函数是我们准备要导出的功能,里面的 4 个参数是固定的,含义如下:

  • debugger 是当前调试器对象,类型是 lldb.SDBDebugger。

  • command 是命令的参数,类型是字符串。

  • result 是执行命令后返回的参数,类型是 lldb.SBCommandReturnObject

  • internal_dict 当前脚本的所有变量和函数,类型是字典。

lldb_init_module 函数是在加载脚本时会执行的,command script add -f 是用于将 Python 代码导出成自定义的命令,其中 HelloWorld 是脚本的名称,这个要和脚本的文件名保持一致,test 是函数的名称,mycmd 是导出的命令名称。在 lldb 加载这一段脚本,输入 mycmd 命令就可以执行 test 函数里的代码。

执行 command script import 将脚本引入到调试器,输入 mycmd 命令可以看到打印出 hello, world,证明 test 函数的代码得到执行。输入 help mycmd 可以查看到相应的提示信息。

了解 LLDB 配置文件

LLDB打开时会自动加载~/.lldbinit配置文件,通过这个配置文件可以设置加载的脚本路径等。上面我们编写了第一个脚本,在启动 LLDB 需要手动执行 command script import 才能引入脚本,如果将 command script import 添加到 ~/.lldbinit 每次启动 LLDB 时就会自动会引入脚本。默认这个配置文件是不存在的,我们手动创建一个,然后添加下面的命令,这样每次 LLDB 启动都会自动引入 HelloWorld.py。

除了引入自定义脚本,lldbinit配置文件还可以设置命令的别名、命令提示符文字等等,比如我们添加下面的信息

此时再打开 LLDB 会发现命令行的提示文字显示的是 “(exchen lldb)”,输入connect 命令别名就可以连接程序进行调试,省去了每次烦琐地输入一大串命令。

编写实际功能的脚本

在上面我们已经编写了一个 HelloWorld 脚本,通过这个脚本我们了解到 LLDB 脚本的大概框架,但是这个脚本并没有任何实际功能,接下面我们要编写一个有以实际功能的脚本,这个脚本的功能是导出三个命令,具体代码如下:

从上面的代码 lldb_init_module 可以看出导出了三个命令,第一个命令是 aslr,用于获取 aslr 的地址,原理是调用 image list -f -o 命令,从返回的结果中匹配出括号中有 0x 开头的就是第一个模块的 alsr 地址。

第二个命令是 gm,用于跳转到 main 函数的入口点,原理是 lldb 连接启动的进程时,第一条指令是在 dyld 里的 _dyld_start 函数,该函数最后一条指令是 br x16,会跳转到 main 函数,使用 dis 命令查看 _dyld_start 的反汇编代码,从结果中查找字符串 br x16 得到这条指令所在的地址,然后调用添加断点,再调用 continue 命令让程序运行起来,断点在 br x16 处会触发,然后再执行 si 单步步入即可达到 main 函数,操作过程如下:

第三个命令是 ba,功能在调试器里给 IDA 里看到的地址添加断点,省去了每次从 IDA 里看到地址,需要手动加上 aslr 地址才能和调试器的地址对应上。

关于更多脚本编写的说明可以参考 LLDB 官网的文档 http://lldb.llvm.org/use/python-reference.html

转载请注明:exchen's blog » 编写 LLDB 调试器脚本

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址