本章中我们会在越狱手机上对APP进行调试,我们将进行下面几个内容的探索:
1、将自定义
.cy
文件引入到手机磁盘,连接手机APP并调试(非砸壳APP)。
2、class_dump
,导出APP的头文件。
3、Reveal
,UI调试。
4、debugserver
。
一、hank.cy
文件的使用
1.1、拷贝hank.cy
并使用
首先这里提供一个hank.cy
文件,目的是帮助我们调试APP。hank.cy
拿到hank.cy
文件之后,我们要做的就是将它导入到我们的越狱手机里面,相当于一个插件。
-
1、USB连接手机
这一步的操作,我们在16、越狱 & OpenSSH里面有详细的讲解。看文章的最后。 -
2、创建专属文件夹
image
一般情况先我们会把hank.cy
文件拷贝到/usr/lib/cycript0.9
文件夹下面,但是这样做是不规范的。我们参考cycript
作者saurik的格式,在com
文件夹下面建立自己的文件夹,用于存放我们自己的插件。
比如我这边就建立了一个Jax
文件夹。
// 使用 `mkdir`指令创建文件夹
$ mkdir <文件名>
- 3、拷贝
hank.cy
到指定文件夹
$ scp -P 2222 ./hank.cy root@localhost:/usr/lib/cycript0.9/com/Jax
-
4、
hank.cy
的使用
将hank.cy
拷贝到越狱手机指定文件夹之后,我们就可以来是使用了。- 通过
cycript
指令,连接正在运行的APP。
这里我们可以通过ps -A
指令来查看当前运行的进程都有哪些。
连接APP:
- 通过
$ cycript -p <进程名>
或者
$ cycript -p <进程编号>
- 使用
hank.cy
使用之前要先引入hank.cy
,由于我们没有直接放在cycrity0.9
这个文件夹里面,所有引入的时候需要加上路径:
$ @import com.Jax.hank
image
// 获取ROOT VC
$ HKRootvc ()
// 获取当前控制器
$ HKCurrentVC ()
1.2、theos && ldid 的配置
我们在安装MonkeyDev
的时候,已经安装了theos
,同时也安装了ldid
。我们可以通过brew list
指令来查看一下:
theos
我安装在了opt
目录下(cmd + shift + .
可以查看隐藏文件夹):image
确保了
theos
安装完毕之后,也好确保其环境变量也配置好了:image
1.3、查看图层信息
接着上面的,我们已经通过HKCurrentVC ()
拿到了APP当前页面的控制器,那么我们来打印一下当前的图层信息:
$ #0x13a041600.view.recursiveDescription() .toString ()
image
由于
Unicode
编码问题,打印出来的图层信息里面,汉字显示的是Unicode
编码。这个时候我们可以使用在线转换的形式,知道我们想要找的控件,当然我们页面通过Python 指令
将APP页面中的汉字转换为Unicode
编码,再搜索编码定位到控件。image
image
1.4、定位Target && Function
比如我们上面定位到了一个UIButton
,那么我们可以继续查找UIButton
所对应的Target
和触发事件。
- 获取所有的
Target
$ #<组件地址>.allTargets
image
- 获取控件所有的
Events
$ #<组件地址>.allControlEvents
image
这里看到,输出了一个64
。其实
UIControlEventTouchUpInside
就是64:image
- 获取触发事件
在得到了Target
和Event
之后,我们就可以获取到当前控件所触发的方法是什么了。
$ [#<组件地址> actionsForTarget: #<Target地址> forControlEvent: <Event编号>]
image
此时我们已经知道了,我们想要HOOK的方法,以及对应的控件名,
Target
名等等。这个时候我们只需要去砸壳APP,HOOK对应的方法就可以了。这个时候其实我们严谨一点,还要确认
tipButtonAction
是否有参数和返回值。此时我们利用class_dump
去导出所有的头文件。
二、class-dump的使用
同样的我们之前在安装MonkeyDev
的时候,已经安装了class-dump
:
如果没有安装可以按一下步骤安装官方网站:
- 下载
class-dump
:$ git clone https://github.com/nygard/class-dump
。 - 编译项目,生成命令行工具。可直接使用。
- 将命令行工具导入
/usr/local/bin/class-dump
,给权限:$ sudo chmod +x class-dump
。
-
使用class-dump
在得到砸壳的APP包之后,使用class-dump
。17、应用砸壳-
单一架构
$ class-dump -H <MachO文件> -o <头文件存放的目录>
-
多种架构
比如arm64
的
$ class-dump --arch arm64 -H <MachO文件> -o <头文件存放的目录>
拿到所有的头文件之后,全局搜所一下(注:我这里使用的是
imageSublime Text
打开的所有头文件,使用cmd + shift + F
全局搜索):
-
三、Theos 的使用
3.1、tweak
tweak
代表越狱手机中Cydia
里面的插件。
运行成功之后,我们会得到如下文件,这就是我们的
teak
工程:image
3.2、接下来我们就要配置tweak
工程:
- 配置
Makefile
文件,由于此时用的是USB连接,所有我是这样配置的。(如果是WiFi连接,修改一下就好了):
image
注意:
tweak
工程不要放在有中文的路径下,否则后面的执行会报错
3.3、注入HOOK代码:
撰写HOOK
代码
注:
HOOK
代码的注入分为三个步骤
1、make
--- 编译
2、make package
--- 打包
3、make install
--- 注入
- 执行
make
(此时我将工程文件夹放在了桌面)
此时我执行make
指令,遇到了下面的错误:
image
这是因为我们使用了NSLog
但是并没有引入Foundation
框架。此时我们可以引入Foundation
框架,也可以引入UIKit
框架:
image
再次make
就成功了:
image
这里有个坑,大家要注意了,这里我之前的是输出是
NSLog(@"\n\n\n\nHOOK到了\n\n\n\n\n\");
但是一直报错,我就给改成了NSLog(@"hook");
就成功了。
Tweak.x
Tweak.xm
;Makefile
tuyaSmartDemo_FILES = Tweak.x
tuyaSmartDemo_FILES = Tweak.xm
。这里还是
theos
的适配问题,大家注意一下。
-
执行
imagemake package
--- 打包
-
执行
imagemake install
--- 注入
执行成功之后,在控制台可以看到我们HOOK
的代码。
注意:上面的流程执行完以后,我们就已经使用
imagetheos
完成了HOOK
,这个过程其实是我们自己写了一个插件,并安装到了预约手机。可以在Cydia
里面看到(注:如果插件失效,直接卸载掉,重复上面的流程就可以了。):
- 其他指令
make clean
清理缓存。
3.4、theos 注意事项
- 注意事项1
theos
和Xcode是对应的。如果有多个Xcode,一定要指定Xcode。
不如我现在的Xcode Select路径是:
image
这个时候可以使用如下指令自定Xcode Select:
xcode-select --switch <Xcode Select路径>
- 注意事项2
theos
创建的tweak
工程路径不能有中文。
四、 Reveal
- 手机端安装插件
在越狱手机里面安装Reveal Loader
插件:
image
安装完成之后,我们会在手机的设置页面发现,多了一个Reveal
:
在这里面我们可以选自需要
Reveal
的APP:image
- Mac端操作
此时我们打开Mac端的Reveal
发现并没有任何的变化。这是因为有一个关键的步骤我们还没做。
image
这个时候,我们点击help -> Show Reveal Library in Finder -> iOS Library
:
来到这里:
image
这里面的RevealServer
可执行文件是关键。我们要把它拷贝到越狱手机里面。
步骤如下:
-
USB连接手机。
-
进入根部目录的
imageLibrary
文件夹。(注意:一定要进入根目录下,否则路径不对,是没有效果的。下图是我如何找到根目录的,仅供参考)
-
创建
RHRevealLoader
文件夹:mkdir RHRevealLoader
。 -
将
imageRevealServer
拷贝到RHRevealLoader
文件夹下,并改名为:libReveal.dylib
-
上面的配置完之后,我们会在Mac端
imageReveal
里面看到我们连接的APP,并且可以进行UI调试:
注:
Reveal
调试不会阻塞进程,可以试试更改UI内容。
五、debugserver
5.1 debugserver原理与简单使用
我们Xcode中的lldb可以调试手机中的应用,是因为手机中的debugserver
开启的相关服务。所以在越狱环境中,我们只需要开启debugserver
服务,就可以利用LLDB远程调试三方应用了。
- 举个例子,我们上面对正版应用进行了
reveal
。但是如果逆向正版应用的过程中,希望进行断点调试该怎么做呢?这个使用可以通过LLDB
来进行断点调试,前提是我们要附加进程。LLDB的安装与使用
1、首先,我们创建一个Xcode工程(随便创建一个就可以)。
2、在Debug -> Attach to Process
中选择我们要逆向的APP进程,附加上去:
3、在控制台,我们就可以惊醒调试了,而且还可以ViewDebug
:
5.2、debugserver的位置探索
在/Applications/Xcode.app/Contents/Developer/Platforms
里面,我们找到iPhoneOS.platform -> DeviceSupport
,在这个文件夹里面有很多系统版本,我们随便找一个系统版本中,找到DeveloperDiskImage.dmg
,打开它。
image
找到
usr -> bin -> debugserver
。这就是debugserver
的位置。image
我们的Xcode在第一次连接手机的时候,会将对应系统里面的信息拷贝到手机,其中就包含
debugserver
。位置如下:/Developer/usr/bin
image
那么我们怎么验证这两个debugserver
是同一个呢?
这个时候,我们可以对两个debugserver
进行md5
运算,如果得到的结果一样,那么这两个debugserver
就一样的。
-
对Mac端对应系统里面的
imagedebugserver
进行md5
运算:
得到的结果是:b771aad8917de2ff41feb5acfe4a9b15
-
将手机端的
imagedebugserver
拷贝出来,进行md5
运算:
得到的结果是:b771aad8917de2ff41feb5acfe4a9b15
可以发现,得到的结果是一样的,所以两个debugserver
是一样的;换句话说,手机端的debugserver
就是从Mac端拷贝过去的。
5.3、启动debugserver
我们上面使用Xcode附加进程的形式,启动了debugserver
;其实我们还可以手动去启动debugserver
。
步骤如下:
- iPhone中开启
debugserver
服务。
image
可以看到debugserver
有很多的服务。
我们要使用的是:
$ ./debugserver <主机地址>:<端口号> -a <应用进程名/进程编号>
- 由于主机地址是当前手机,可以使用
localhost
代替 - 端口号:启动
server
服务,开发端口,让远程的lldb
通过server
调试进程
image
- 由于主机地址是当前手机,可以使用
这个时候,手机端就进入了等待连接的状态。
-
Mac端启动LLDB连接iPhone
- 启动
lldb
$ lldb
- 连接
debugserver
$ process connect connect://<手机IP>:<服务端口号> // eg: `(lldb) process connect connect://192.168.50.173:12346`
- 如果Mac端的连接不成功,我们可以使用USB连接的方式。
这个时候,我们要做的是,在进行USB端口映射
的时候,添加12346:12346
:
python tcprelay.py -t 22:2222 12346:12346
这样我们就可以把上面连接
debugserver
中的<手机IP>
换成localhost
。 - 启动
网友评论