iOS逆向工程之iPhone工具集, 安装配置及使用

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按提示输入即可如图:

pp助手,打开ssh通道

后续再补充在LLDB与debugserver下, usbmuxd的使用.

第四步: 安装Cycript

Cydia搜索Cycript, 下载安装既可.

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

整体效果图, 如下:

usbmuxd连接iOS设备调试

第六步: 安装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直接复制进入也可以.

  1. 开始砸壳
    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.

监听后的效果:

socat.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容