学习背景:在非越狱逆向开发的过程中,我们可以从界面(Reveal)、类与方法(class-dump)、或者网络(Charles)等方面及一个应用的功能点入手去寻找一些需要实现功能的入口线索。但是在未知源代码的情况下,想要精确定位一个功能点的实现位置及实现原理,就需要结合静态分析和动态调试来分析程序运行的动态和行为实现。
静态分析
静态分析是指在程序没有运行的情况下进行程序分析的一种方法,一般分为以下三种:
- 基于ipa和app包静态分析
- 基于文件格式的静态分析
- 基于二进制反汇编的静态分析
在二进制反汇编静态分析的过程中,我们可以两种反汇编的工具,一个是Hopper,一个是IDA。两者的功能都非常强大,可以显示被分析文件的反汇编代码、流程图及伪代码。其中常用的功能有字符串搜索,跳转地址,变量重命名等。
动态调试
动态调试和静态分析是相辅相成的。静态分析只能分析静态的函数内部执行。要想动态获取程序在运行时的参数传递、执行流程及寄存器内存等信息,就需要使用动态调试的方法。
LLDB动态调试
我们都知道,LLDB是Xcode自带的调试工具,既可以在本地调试Mac应用程序,也可以远程调试iPhone真机。我们平时在开发中调试程序接口和运行状态时也会经常使用。
其实原理是这样的:当使用Xcode调试真机App时,Xcode会将debugserver文件复制到手机中,以便在真机上启动一个服务,等待Xcode进行远程连接调试。所以只有当设备连接计算机真机调试App后,debugserver文件才会安装到设备的/Developer/usr/bin
目录下。但是,debugserver文件默认只能调试自己开发的应用,在调试从App Store下载应用时会出现"unable to start the exception thread"错误。
LLDB调试环境设置
不过既然知道了原理就可以试着去对debugserver去做一些权限处理就可以了,下面是具体的步骤:
1.准备工作
为了调试其他应用,需要给debugserver文件富裕task_for_pid权限。在调试前需要做如下准备工作。
(1)复制debugserver文件
使用scp
命令将debugserver文件从手机复制到Mac计算机上。
scp -P 2222 root@localhost:/Developer/usr/bin/debugserver ./
(2)签名权限
新建一个entitlement.plist文件,在其中写入如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple