iOS逆向工程需要用到越狱手机, 需要注意的是9.2以下(不含9.2)的系统均可通过pp越狱助手进行越狱, 而9.2-9.3.3的系统需要设备是64位才可以进行越狱, 32位的系统暂不支持越狱,安装9.3.3以上系统的设备暂不支持完美越狱.10以上的系统可以通过yalu进行不完美越狱, 所以建议10以下的完美越狱
第一步: 越狱
使用pp越狱助手进行越狱,官方地址,一键式越狱,方便快捷,按步骤提示就可以完成越狱.需要提醒的两点是, 从安全的角度考虑不推荐普通用户越狱, 还有一点是, 越狱记得备份重要数据, 越狱不成功有可能丢失数据, 当然如果您用的是测试机就无所谓啦, 任意折腾, 尽情发挥~!
第二步: 安装OpenSSH及配置
越狱成功后, 就会多出个Cydia, 这个可是越狱后的神器. Cydia可以安装各种越狱插件, 当然也可以安装各种越狱软件, 当然最主要的就是用来逆向开发.
接着, 打开Cydia, 系统会自动进行一些更新升级, 需要等待一段时间, 加载完毕之后, 点击搜索, 输入openssh, 选择安装. 安装完这个工具后可以让你从mac登录进越狱设备, 然后进行一些基本操作. 想一下是不是很激动, 可以通过电脑来控制手机啦~! 既然可以实现自己电脑控制手机, 那么从其他电脑也可以登入您的手机(默认密码都是alpine), 也就导致了手机的不安全, 所以强烈建议您更改ssh的密码.
Ikee, iOS上的一种蠕虫病毒, 通过使用默认密码alpine入侵安装了openssh的越狱设备, 然后所有数据, 包括电话本, 短信, 甚至Apple ID都有可能被窃取.所以强烈建议您修改ssh密码
(1)修改ssh密码
首先打开ssh通道, 终端输入一下命令,
ssh root@您的手机IP地址
进入ssh后, iOS上的用户有2个, 分别是root和mobile, 修改密码的命令:
passwd root
修改root的密码, 按提示输入新的密码然后回车即可
passwd mobile
修改mobile的密码,按提示输入新的密码然后回车即可
(2)保存ssh密码到本机, 不用每次都输入ssh密码
每次通过ssh连接手机, 都要输入密码, 那应该有方法保存密码到本地里, 就不用每次输密码了吧? 思路很好, 方法马上呈现:
1.打开Finder, 快捷键执行
cmd+shift+g
即快速前往文件夹, 输入 ~, 然后回车
找到.ssh文件夹里面的known_hosts文件, 打开. 如果看不到.ssh文件可能是你系统隐藏了系统文件, Terminal执行下面命令, 后面是注释不用加, 显示系统隐藏文件:
$:defaults write com.apple.finder AppleShowAllFiles -bool true //Finder显示系统文件
$:defaults write com.apple.finder AppleShowAllFiles -bool false //Finder隐藏系统文件
1 ) 打开known_hosts, 找到iOS设备所在的那一行. 如下所示:
192.168.0.117 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdeksdfXpX9uvzGU25bQ2Rbyx571Hv40K3tar3QFNLa2cOgFTkAriUn2Nx6+j9PV8OtvxbagY4/+syR41TMUFuSTgbZX64zfDBRgStmPVaVbG2y0PoGT+e/scpJ8Ep0sKIqTctZbsdfFyUk8qva+5zvtJDRlYBS+vaC3MsSO6UeGaonTEx6SAY7FOkVe3/KkEWlM1Env/mFSEOzIa6eefluJB+OIK8WmcxLQJY66QCqp5HYUMneXTcuBK/3obWcsdfQKlLZ87k8KuYT21sv88wh+uf9oUTao206rhMBrJEKtG7i26W8EMdh4O4H8Cu2oligQ+pRxupi22OlT6f/BJ
完整删除上面这些, 关闭.
2 )生成authorized_keys
在Terminal中执行如下命令:
willys-MBP% ssh-keygen -t rsa //这是第一条命令
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/mac/.ssh/id_rsa): /Users/mac/.ssh/id_rsa //换成自己的目录
/Users/mac/.ssh/id_rsa already exists.
Overwrite (y/n)? y //选y
Enter passphrase (empty for no passphrase): //直接回车
Enter same passphrase again: //回车
Your identification has been saved in /Users/mac/.ssh/id_rsa.
Your public key has been saved in /Users/mac/.ssh/id_rsa.pub.
/Users/mac/.ssh/id_rsa换成自己的.ssh文件下的id_rsa目录, 提示密码时, 直接回车不设置密码即可.
然后生成authosrized_keys
willys-MBP% cp /Users/mac/.ssh/id_rsa.pub ~/authorized_keys //这是第二条命令
3 )配置iOS
willys-MBP% ssh root@192.168.1.114 //先ssh连接iPhone
root@192.168.1.114's password: //这里需要ssh密码
lizhifengdemacde-iPhone:~ root# ssh-keygen //第一条命令
Generating public/private rsa key pair.
Enter file in which to save the key (/var/root/.ssh/id_rsa): /var/root/.ssh/id_rsa
/var/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y //选y
Enter passphrase (empty for no passphrase): //直接回车
Enter same passphrase again: //再回车
Your identification has been saved in /var/root/.ssh/id_rsa.
Your public key has been saved in /var/root/.ssh/id_rsa.pub.
macde-iPhone:~ root# logout //退出ssh
Connection to 192.168.1.114 closed.
willys-MBP% scp ~/authorized_keys root@192.168.1.114:/var/root/.ssh //把mac上的authorized_keys拷贝到手机的.ssh下
root@192.168.1.114's password: //再次需要ssh密码
authorized_keys 100% 402 0.4KB/s 00:00
willys-MBP% ssh root@192.168.1.114 //配置完成, 以后ssh都不需要手动输入密码了
lizhifengdemacde-iPhone:~ root# //直接进入ssh
至此, 完成ssh的配置.
(2)ssh常用命令
1 )连接ios设备:
ssh root@192.168.1.102
后面换成iOS设备的IP地址
2 )把文件从本地拷贝到iOS上, 中间为mac文件地址, 后面为iOS地址
scp ~/1.png root@192.168.1.102:/var/tmp/
3 )把文件从iOS拷贝到电脑, 原理类似
scp root@192.168.1.102:/var/log/syslog ~/ioslog
第三步: usbmuxd配置及使用
先来看看usbmuxd的官方介绍:
A socket daemon to multiplex connections from and to iOS devices.
即用来连接iOS设备的传输, 在逆向工程里面我们主要拿来连接iOS设备, 上面我们用到的ssh是通过wifi进行传输, 而usbmuxd就是可以让我们通过USB连接设备, ssh调试我们的设备. 加快设备的连接速度, 在后面说到的lldb以及debugserver就会用到usbmuxd用来加快连接速度.
下载usbmuxd, 下载地址下载完成之后, 解压后得到几个文件, 我们需要用到的是tcprelay.py这个文件, usbmuxd的用法也比较简单, 先介绍加快ssh的速度:
1 ) 新建第一个Terminal窗口, 把tcprelay.py拖入Terminal, 在Terminal中输入
/Users/mac/Downloads/USBSSH/tcprelay.py -t 远程iOS上的端口:本地OSX/Windows上的端口
即可把本地OSX/Windows上的端口转发到远程iOS上的端口,如
/Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
出现如下,就说明是在等待转发状态了
willys-MBP% /Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
Forwarding local port 2222 to remote port 22
...
2 )再新建一个Terminal窗口, Terminal输入如下命令:
ssh root@localhost -p 2222
就可以通过USB连接设备了,如下
willys-MBP% ssh root@localhost -p 2222
macde-iPhone:~ root#
当然了, 也可以直接通过pp助手一键傻瓜式打开, 然后Terminal按提示输入即可如图:
后续再补充在LLDB与debugserver下, usbmuxd的使用.
第四步: 安装Cycript
Cydia搜索Cycript, 下载安装既可.
具体使用, 可参考这篇教程
第五步: 配置LLDB与debugserver
只要做过iOS开发的, xcode默认安装了LLDB, iOS设备被调试过后也会默认安装了debugserver, 无需安装. 在此说了一下LLDB(电脑端)及debugserver(手机端)以及两者结合usbmuxd的使用.
一. debugserver的用法
1 ) 用debugserver启动或附加进程
ssh连接设备, 然后输入以下命令:
lizhifengdemacde-iPhone:~ root# debugserver *:1234 -a "SpringBoard"
*代表接收任何IP地址的连接, 1234代表端口, -a表示附加的意思, 后面双引号内代表要附加的进程名字.
二. LLDB的用法
1 )启动LLDB, Terminal输入以下命令, 回车就可以启动LLDB调试器了.
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
具体LLDB目录根据xcode所在目录决定.本人为了方便, 给lldb制作了"替身"(相当于windows的快捷方式), 然把"替身"放在桌面, 用到lldb的时候, 右键显示原身, 然后拖入Terminal即可. 当然也可以直接把上面这行代码保存到文档, 直接复制粘贴也可以. 各位大神各显神通.
2 ) 连接iOS设备, Terminal输入以下命令:
(lldb) process connect connect://192.168.1.114:1234
至此, 就完成了lldb跟debugserver的连接. 接下来介绍lldb的常用命令:
3 )lldb常用的命令
A. 显示当前所有进程信息
(lldb) image list -o -f
回车后, 即可看到以下信息
[ 0] 0x00035000 /System/Library/CoreServices/SpringBoard.app/SpringBoard(0x0000000000036000)
[ 1] 0x00019000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/7.1.2 (11D257)/Symbols/usr/lib/dyld
[ 2] 0x00453000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x0000000000453000)
[ 3] 0x0182f000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/7.1.2 (11D257)/Symbols/System/Library/PrivateFrameworks/StoreServices.framework/StoreServices
...
上面的信息中, 左边方括号的数字代表模块的序号, 第二列如0x00035000代表ASLR偏移, 简单理解为位移即可, 第三列代表模块的全路径, 括号后代表位移之后的起始地址. 我们关注的主要是第二列的位移.
B. 断点设置
(lldb) br s -a address
如在某个地址前面打一个断点, address代表十六进制的地址, 如下:
(lldb) br s -a 0x00234a
我们可以通过IDA反编译二进制文件, 然后定位目标函数的位置, 找到偏移前的基地址, 然后通过LLDB查看ASLR偏移, 两者相加, 即可找到目标函数的在运行时的真实地址, 通过上面的断点设置, 直接在该目标函数下断点. 来验证我们的一些推理, 用以进一步的查找以及逆向.
C.断点相关设置
当进程停止, 可输入"c"让进程继续:
(lldb) c
"c"即continue.
禁用所有断点:
(lldb) br dis
"dis"即disable, "br"即breakpoint.
禁用某个断点:
(lldb) br dis 6
6代表第几个断点.
启动所有断点:
(lldb) br en
启动某个断点:
(lldb) br en 5
删除所有断点:
(lldb) br del
删除某个断点:
(lldb) br del 5
在执行某个指令之前, 预先设置一些指令:
(lldb) br del 8
打印寄存器的值:
(lldb) p $r6
执行下一条指令, 并且进入函数体:
(lldb) ni
执行下一条指令, 并且不进入函数体:
(lldb) si
给指定的寄存器赋值, 用以验证分支:
(lldb) register write r5 0
上述命令作用为修改r5寄存器的值为0.
三. 首先使用usbmuxd通过USB数据线连接调试设备:
1 )新建Terminal,把本地2222端口转发到iOS的22端口
/Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
2 )再新建一个Terminal, ssh过去并用debugserver 连接到SpringBoard
ssh root@localhost -p 2222
debugserver *:1234 -a "SpringBoard"
3 )再新建一个Terminal, 把本地1234端口转发到iOS的1234端口
/Users/mac/Downloads/USBSSH/tcprelay.py -t 1234:1234
4 )再新建一个Terminal, 用lldb开始调试
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
lldb连接1234端口
process connect connect://localhost:1234
整体效果图, 如下:
第六步: 安装dumpdecrypted,进行砸壳
从AppStore下载的APP被苹果加密过的, 可执行文件被套上了一层保护壳, 而class-dump无法作用于加密过的APP. 所以要解密APP的可执行文件, 想要进行"砸壳". dumpdecrypted是由越狱社区的知名人士Stefen Esser出品的一款砸壳工具, 被越狱社区广泛应用在iOS逆向工程研究中. 接下来介绍dumpdecrypted的使用:
1 )下载dumpdecrypted的源码, 如下:
willys-MBP% cd /Users/mac/Desktop/fry
willys-MBP% git clone git://github.com/stefenesser/dumpdecrypted/
Cloning into 'dumpdecrypted'...
remote: Counting objects: 31, done.
remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 31
Receiving objects: 100% (31/31), 7.10 KiB | 0 bytes/s, done.
Resolving deltas: 100% (15/15), done.
Checking connectivity... done.
willys-MBP% ls
dumpdecrypted
如果下载不了, 到GitHub上, 链接
接着编译dumpdecrypted.dylib, 如下:
willys-MBP% cd dumpdecrypted
willys-MBP% make
编译完成后, 会在当前目录生成一个dumpdecrypted.dylib文件. 这个是接下来砸壳用到的工具(编译一次即可, 后续砸壳都用同这个dylib).
2 )ssh进iOS设备.
willys-MBP% ssh root@localhost -p 2222
lizhifengdemacde-iPhone:~ root# ps -e
上面用到usbmuxd, 可以加快ssh速度.ps -e回车后可看到下面这些信息, 在此需要保证我们砸壳的APP在运行的状态,
PID TTY TIME CMD
1 ?? 0:02.27 /sbin/launchd
16 ?? 0:01.09 /usr/sbin/notifyd
20 ?? 0:04.91 /usr/libexec/UserEventAgent (System)
22 ?? 0:01.39 /usr/libexec/pphelper/PPHelperLaunchd
...
400 ?? 0:08.11 /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat
401 ?? 0:00.11 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
这里看到的WeChat的pid为400, 并且可执行文件的全路径为:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat. 接下来我们要找到WeChat的ducuments路径.
3 )通过cycript查找documents路径, 同时保证WeChat处于运行状态.
lizhifengdemacde-iPhone:~ root# cycript -p 400 //这里的400就是上面我们找到WeChat的pid值
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/"
cy#
于是, 我们得到了WeChat的documents目录, 即:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/
4 )将步骤1得到的dumpdecrypted.dylib拷贝到documents目录下.Terminal执行:
willys-MBP% scp /Users/mac/Desktop/fry/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.114:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/
dumpdecrypted.dylib 100% 193KB 192.9KB/s 00:00
willys-MBP%
iFunBox直接复制进入也可以.
- 开始砸壳
dumpdecrypted.dylib的用法是:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
具体操作是这样的, 先切到documents的路径下, 然后用dumpdecrypted进行砸壳:
root# cd /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/ //切到步骤3的document路径下
lizhifengdemacde-iPhone:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents root# ls //ls可以看到我们的dumpdecrypted.dylib在当前的目录下, 这个可是砸壳关键
00000000000000000000000000000000/ CrashReport/ LocalInfo.lst MMappedKV/ WeChat.decrypted bfc6237ab526bc81dd2bd2b7cf050210/ mmupdateinfo.archive
108ebb8e2ff6e023e75d5a518e7ac49d/ Ksid MMResourceMgr/ SafeMode.dat b06f23ff87ff45d5df8d9029111a8ed4/ dumpdecrypted.dylib
lizhifengdemacde-iPhone:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat //后面的路径是步骤1获得的可执行文件路径, 复制粘贴在这里即可
砸壳如无意外, 就可以在当前目录下生成WeChat.decrypted, 切回到电脑端的Terminal, 复制这个WeChat.decrypted文件到电脑上. 执行下面的命令:
willys-MBP% scp root@192.168.1.114:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/WeChat.decrypted /Users/mac/Desktop/fry //把WeChat.decrypted放在了电脑目录上
WeChat.decrypted 100% 105MB 2.6MB/s 00:41
willys-MBP%
砸出来的文件有点大, 不过没关系, 我们关心的只是他的头文件, 接下来通过这个WeChat.decrypted 文件class-dump出头文件.
6 )class-dump生成头文件
先切到放置WeChat.decrypted文件的目录下,
willys-MBP% cd /Users/mac/Desktop/fry
然后用class-dump生成头文件, 如下:
willys-MBP% class-dump --arch armv7 -H WeChat.decrypted -o /Users/mac/Desktop/fry
willys-MBP%
class-dump --arch 这里是固定写法, armv7是iOS设备的对应arm型号, -H 固定写法, WeChat.decrypted代表可执行文件的名称 -o表示输出到文件中, /Users/mac/Desktop/fry代表输出的文件目录, 砸壳出来的头文件都将放置在这个目录下. 至此, 砸壳完成.
第七步: 安装iFile
Cydia搜索安装即可, 相当于手机端的Finder.
第八步: 安装Terminal
Cydia搜索Terminal, 选择可用的进行安装, 具体使用方法跟电脑端的Terminal一样.
第九步,安装socat, 查看手机Log输出
1.iOS设备安装socat
cydia搜索socat, 安装.
2.Terminal连接到手机root, 查看手机系统日志
Weide-iPad:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
========================
ASL is here to serve you
> watch
进入到命令行交互界面,这时可以输入help查看帮助
输入watch开始监听手机log.
监听后的效果: