iOS逆向里面比较重要的几项技能:动态调试、静态分析、HOOK关键函数、重签名

前言

先来讲下动态调试,iOS动态调试需要一个服务端和客户端程序,服务端程序在手机上监听要动态调试程序的进程ID或是程序名,客户端程序在Mac OS系统上运行。

1
2
3
服务端程序:debugserver
客户端程序:lldb
#这两个程序不用额外的去外网下载,只要你的Mac电脑有装XCode,并且进行真机调试过(真机调试一般可以在淘宝买UDID开发者证书,就是和你手机UDID绑定的证书那么你就可以在你手机上安装开发你的APP|土豪(开发者账号))

只要你手机进行真机调试过,那么在你手机的这个目录下就会有debugserver

1
2
/Developer/usr/bin/debugserver
#不过这个debugserver 默认只能调试自己开发的APP,我们逆向当然是要逆别人的程序,所以想要debugserver能调试三方APP,需要进行一些修改,下面就是修改的一些重点。

配置debugserver 赋予权限

debugserver默认只能调试自己开发的应用,调试其他应用会抛异常unable to start the exception thread。默认的debugserver缺少task_for_pid()权限,因此需要给debugserver赋予task_for_pid权限。——这是网上摘抄的话

网上过时方法

我发现网上配置debugserver的方法已经过时,不适用iOS13系统,导致debugserver还是无法调试三方APP,所以按照如下方法进行。

iOS13及以上配置方法

新建一个文件名为ent.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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.backboardd.debugapplications</key>
<true/>
<key>com.apple.backboardd.launchapplications</key>
<true/>
<key>com.apple.diagnosticd.diagnostic</key>
<true/>
<key>com.apple.frontboard.debugapplications</key>
<true/>
<key>com.apple.frontboard.launchapplications</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>com.apple.system-task-ports</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>platform-application</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>

用ldid对debugserver签名 赋予权限

1
2
ldid -Sxml全路径 debugserver全路径`
例如:`ldid -Sent.xml debugserver

这里要SSH连入iPhone手机执行命令:需要越狱您的iPhone,不会的请去看 疯先生越狱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#开启端口转发,数据线连SSH
iproxy 2222 44 #默认用Checkra1n越狱的端口号为44,其余的默认为22
#连入iPhone SSH
ssh root@localhost -p 2222 #iPhone默认ssh密码,alpine

#切换到debugserver存在的目录
iPhone:~ root# cd /Developer/usr/bin/
iPhone:/Developer/usr/bin root# ls
DTDeviceArbitration* ScreenShotr* axauditd* debugserver*

#新建ent.xml文件
iPhone:/Developer/usr/bin root# vim ent.xml #将1、里面的ent.xml内容复制进去,并且保存

#最后ldid赋予权限
iPhone:/Developer/usr/bin root# ldid -Sent.xml debugserver

#拷贝到系统目录
iPhone:/Developer/usr/bin root# copy ./debugserver /usr/bin

截屏2020-02-06下午7.52.51

验证debugserver 进行动态调试

配置好iPhone端的debugserver后,就可以在Mac电脑上用lldb远程进行动态调试了lldb调试大全后续会讲,此次注重debugserver的配置,lldb一笔带,只要知道lldb是Mac上的客户端用来动态调试。

以调试Sugram 聊天软件为例

手机端:

1
2
3
4
5
6
#查看Sugram的进程ID
iPhone:~ root# ps aux|grep "Sugram"
mobile 6542 0.0 2.9 5055392 59136 ?? Ss 8:38PM 0:00.51 /var/containers/Bundle/Application/12CA134A-E92A-4F35-BEAA-542F84A0A39F/Sugram.app/Sugram

#注入方式对Sugram进行监听
iPhone:~ root# debugserver 127.0.0.1:1234 --attach 6542

这时候被注入监听的那个APP就会进入卡死状态,因为debugserver已经对Sugram进行调试状态。

电脑端:

1
2
3
4
5
#先用iProxy 转发debugserver监听的端口
iproxy 1234 1234
#进入lldb 进行远程调试
lldb
(lldb) process connect connect://localhost:1234

最后!

出现如下画面说明debugserver 配置正确,lldb也可以进行动态调试了。😁😁 –专注逆向、网络安全 Lee

截屏2020-02-06下午8.48.39

欢迎各位大佬:一起研究逆向、PWN、WEB安全、物联网安全

Pwn菜鸡学习小分队群聊二维码