iOS10.2下的IPA砸壳

作者: iOS_小久 | 来源:发表于2019-05-18 18:57 被阅读66次

    前言

    从App Store上下载的ipa里面的二进制文件是经过加密的,class-dump和Hopper Disassembler都需要用到未加密的二进制文件,需要通过砸壳得到。网上敲壳教程还是挺多的,几乎都差不多,但都太旧了都没有更新,例如在iOS10.2下,传统的dumpdecrypted砸壳就会有问题,需要加点其它操作才能敲成功。

    小编这里推荐一个群:691040931 里面有大量的书籍和面试资料,很多的iOS开发者都在里面交流技术

    查看二进制文件是否加密

    使用可以otool来查看,otool -l 二进制文件路径 | grep -B 2 crypt

    $ otool -l WeChat.app/WeChat | grep -B 2地穴
              cmd LC_ENCRYPTION_INFO
          cmdsize 20
         cryptoff 16384
        cryptsize 49463296
          cryptid 1
    —
                 cmd LC_ENCRYPTION_INFO_64
          cmdsize 24
         cryptoff 16384
        cryptsize 53149696
          cryptid 1
    

    cryptid为1时说明被加密,为0时则是未加密。可以看到微信已经被加密了,第一个对应的是较老的armv7架构,后者则是arm64架构。被加密的二进制文件直接拿起来就撸是没用的,需要先敲壳。

    准备敲壳

    ssh连上的iPhone

    确保iPhone和Mac在同一个网段,我的iPhone的IP地址为192.168.1.22.OpenSSH的root密码默认为alpine

    $ ssh root@192.168.1.22
    root@192.168.1.22的密码: 
    Dankal-Device-5s:~root#
    

    这个时候已经顺利获取了iPhone的root权限,root相当于Windows中的管理员,权限最高,可读写。

    ssh相关的问题请看之前写过的“iOS10.2 SSH连接越狱设备”,这里就不多阐述。

    获取设备当前的进程

    iPhone打开微信,后台结束其他APP进程,控制台输入ps ax 或者ps -e

    Dankal-Device-5s:~root#ps -e
    PID TTY TIME CMD
      1 ??         0:26.19 / sbin / launchd
     21 ??         0:01.77 / usr / sbin / syslogd
     42 ??         0:17.65 / usr / libexec / logd
     44 ??         0:00.08 /System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated
    ...
    1190 ??         0:08.03 / 变种 /容器/捆绑/应用/ 46316B03 -5DC3- 4534 -8D40-A29FE9315E22 / WeChat.app /微信
    ...
    1391 ?? ??         0:00.17 / usr / local / bin / dropbear -F -R -p 22
    1392 ttys000     0:00.04 -sh
    1401 ttys000     0:00.01 ps -e
    1020 ttys001     0:00.02 login -fp mobile
    1021 ttys001     0:00.06 -SH
    

    找到微信的的进程,记住PID为1190,Bundle路径/var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat

    勾住进程

    Dankal-Device- 5 s: ~root #cygcript  - p  1190
    CY#
    

    看到cy#的出现就说明,成功勾住了微信的进程。

    获取沙盒路径

    通过Cycript与进程交互动态获取应用的沙盒路径,输入以下任一行代码。

    • [NSHomeDirectory() stringByAppendingString:@"/Documents"]
    • NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0]
    cy#[NSHomeDirectory()stringByAppendingStrin g: @ “/ Documents” ]
    @ “/ var / mobile / Containers / Data / Application / E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5 / Documents”
    

    出来显示的字符串即为沙盒品路径

    dumpdecrypted.dylib

    敲壳的最重要的东西就是dumpdecrypted.dylib,确保从Github上下载了最新的dumpdecrypted源码,解压后进入dumpdecrypted文件夹的跟目录,make编译dumpdecrypted.dylib。

    $ cd / Users / bingo / Downloads / dumpdecrypted-master
    $ make
    `xcrun --sdk iphoneos  - find gcc` -Os -Wimplicit -isysroot`xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path` / System /库/框架-F`xcrun --sdk iphoneos --show-sdk-path` / System / Library / PrivateFrameworks -arch armv7 -arch armv7s -arch arm64  - c - o dumpdecrypted。o dumpdecrypted。C 
    `xcrun --sdk iphoneos  - find gcc` -Os -Wimplicit -isysroot`xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path` / System /库/框架-F`xcrun --sdk iphoneos --show-sdk-path` / System / Library / PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib  - o dumpdecrypted.dylib dumpdecrypted。Ø
    
    

    结束后会在当前目录中生成dumpdecrypted.dylib,这里有坑,下面会说。

    拷贝dumpdecrypted.dylib到沙盒路径下

    scp拷贝贝文件到越狱设备的沙盒路径下,沙盒目录刚刚用Cycript动态获取到了,如果设备不支持scp或者出现问题,可以参考“让越狱设备支持scp文件传输”,或者使用iTools等工具实现文件传输,在此不再阐述。

    $ scp dumpdecrypted.dylib root@192.168.1.22:/ var / mobile / Containers / Data / Application / E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5 / Documents
    root@192.168.1.22的密码: 
    dumpdecrypted.dylib 100%193KB 242.3KB / s 00:00
    

    开始敲壳
    以上都是准备工作,接下来可以正式砸壳了。

    dumpdecrypted.dylib的具体用法是:DYLD_INSERT_LIBRARIES=to/Path/dumpdecrypted.dylib to/bundlePath

    Dankal-设备- 5个S: 〜根#CD的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件
    Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文档根#DYLD_INSERT_LIBRARIES = dumpdecrypted.dylib “的/ var /容器/捆绑/应用/ 46316B03-5DC3 -4534-8D40-A29FE9315E22 / WeChat.app /微信”
    dyld:无法加载插入的库'dumpdecrypted.dylib',因为找不到合适的图像。没有找到:
        dumpdecrypted.dyli B:所需的代码签名丢失了 “dumpdecrypted.dylib”
    中止陷阱:6
    

    很明显砸壳失败了,这跟说好的不一样!为什么别人砸壳成功了,而我却砸失败了?重复试了几次都不成功。

    于是开始找问题,首先怀疑我的设备的CPU架构不对,打开iTools可以明显看到是iPhone 5s,arm64,已越狱,没毛病,如果是32位处理器的话应该是越狱不成功的。

    再找问题,怀疑是yalu02越狱的时候出了问题,重启再越狱了一遍,还是一样的问题。

    继续寻找,设备不支持吗?网上搜索“iPhone5s砸壳失败”,很失望,没有相关的资料,搜到的全是真的手机壳的相关问题。

    最后,怀疑是越狱本身就有问题,毕竟iOS 10.2是非完美越狱。于是搜“iOS 10.2 dumpdecrypted失败”,终于摸索到相关文章,真的不容易啊,卡了一天,终于找到了解决方案。学会定位问题与使用搜索引擎对于程序员来说还是很重要的!

    正确砸壳

    dumpdecrypted对系统ios 9.3.2以上的版本砸壳失败,会报错Killed: 9解决方案

    当然,我们现在是iOS 10.2,上面的解决方案可能还有问题,最后找到正确的解决方法,就是另外下载dumpdecrypted.dylib,链接来自上面解决方案的页面下的评论。

    masbog

    也许一些用户需要最新的.dylib与iOS 10.2 sdk ... https://masbog.com/dumpdecrypt/11和一些iOS 10.2教程:拥抱:

    最终能找到问题所在我也感到非常神奇与幸运,为了预防站长的服务器挂掉或者链接失效,我已经将.dylib上传到了七牛云上,cdn加速下载链,以防不备之需。

    使用方法

    拷贝最新的dumpdecrypted.dylib到设备上的/usr/lib

    $ scp dumpdecrypted.dylib root@192.168.1.22:/ usr / lib
    root@192.168.1.22的密码: 
    dumpdecrypted.dylib 100%193KB 410.8KB / s 00:00
    

    iOS 10+:

    Dankal-Device- 5 s: ldid -S /usr/lib/dumpdecrypted.dylib
    
    

    最终一砸

    Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文档根#DYLD_INSERT_LIBRARIES = / usr / lib中/ dumpdecrypted.dylib “的/ var /容器/包/应用程序/ 46316B03-5DC3-4534-8D40-A29FE9315E22 / WeChat.app /微信”
    马赫Ø解密自卸车
    免责声明:此工具是 只意味着用于安全研究的目的,而不是用于应用饼干。
    [+] 在内存中检测到64位ARM二进制文件。
    找到[+]偏移到 cryptid :@ 0 x1000a0ca8(从0 x1000a0000)= ca8
    [+]在地址00004000处找到长度为53149696字节的加密数据- 类型 1。
    [+]打开/私有的/ var /容器/捆绑/应用/ 46316 B03- 5 DC3- 4534 - 8 D40-A29FE9315E22 / WeChat.app /微信为读数。
    [+]阅读标题
    [+]检测标题类型
    [+]可执行是 一个 FAT图像-搜索为 右架构
    [+]正确拱是在偏移58195968中文件
    [+]开放WeChat.decrypted 用于写入。
    [+]复制文件的未加密开头
    [+]将解密的数据转储到文件中
    [+]复制未加密的文件剩余部分
    [+] 在偏移3780 ca8 处将LC_ENCRYPTION_INFO-> cryptid设置为 0
    [+]关闭原始文件
    [+]关闭转储文件
    Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件根#
    

    查看成果
    砸壳完毕,会自动在当前目录生成砸壳后的二进制文件WeChat.decrypted

    $ ls
    00000000000000000000000000000000   Ksid MMResourceMgr SafeMode.dat db.globalconfig
    8 f9f003b02f320ae7f28b1250270eb48 LocalInfo.lst MMappedKV WeChat.decrypted mmupdateinfo.archive
    

    后话

    终于砸壳完毕,说难也不难,从App Store上下载的ipa就这样被砸掉了壳,可见所谓的Apple Store给ipa穿上的战衣也不过如此,并没有多么安全。敲壳后的二进制文件就可以做一些好玩的东西了,比如dump出头文件等,接下来的文章会慢慢记录。

    • 本文作者: 宾果
    • 本文链接: https ://bingozb.github.io/23.html
    • 版权声明: 本博客所有文章除特别声明外,均采用麻省理工学院许可协议。转载请注明出处!

    小编这里推荐一个群:691040931 里面有大量的书籍和面试资料,很多的iOS开发者都在里面交流技术

    相关文章

      网友评论

        本文标题:iOS10.2下的IPA砸壳

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