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

作者: WillyGeek | 来源:发表于2016-10-06 18:00 被阅读2457次

    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

    相关文章

      网友评论

      • 50adf4328361:公司想测试下 自己APP的可逆性
        WillyGeek:@gongxuekun 额…
        50adf4328361:@WillyGeek 现在要破解微信 找漏洞加粉
        WillyGeek:私信告诉你们公司的APP, 可以帮你看看. 如果需要防止被别人逆向, 可以关注论坛:http://iosre.com
      • 50adf4328361:找到.ssh文件夹里面的known_hosts文件, 打开. 如果看不到.ssh文件可能是你系统隐藏了系统文件, Terminal执行下面命令, 后面是注释不用加, 显示系统隐藏文件: 系统iOS8的 找不到啊
        50adf4328361:@WillyGeek 前面的修改密码 可以不修改吗 公司的手机 修改之后别人用会有麻烦
        50adf4328361:@WillyGeek 一定要连接手机才能找到还是?新手
        WillyGeek:known_hosts这个文件是在mac上查找的, 而不是你的手机上

      本文标题:iOS逆向工程之iPhone工具集, 安装配置及使用

      本文链接:https://www.haomeiwen.com/subject/dpgwettx.html