一次踩坑的IOS逆向
一个比较有意思的app,在数据抓取的时候发现: ios端的app未登录的用户有几十次免费查看数据的机会,而安卓app强制登录才能查看信息。
让我想到有没有一种办法可以模拟无限个新用户,那就不需要注册即可采集了。
说干就干
抓包
一开始我以为ios端跟安卓端一样可以快乐的抓包,后来发现ios端的是真的难抓,我就怀疑是不是ios手机没有越狱
注: 以下都是基于Charles证书安装好的情况下
ios越狱
不舍得让我的14pm 越狱,所以直接去tb买了台备用越狱机子,如果有老机子我肯定自己动手越狱,其实难度不大,i4tools有一键越狱。
安装Filza
在Cydia里 【软件源】——【编辑】——【添加】——【输入apt.abcydia.com】
添加完成后,在 Cydia 的搜索栏中输入「Filza」进行下载。
安装SSL Kill Switch2
借助插件 SSL Kill Switch 2 可以突破 SSL 双向认证,下载地址:https://github.com/nabla-c0d3/ssl-kill-switch2。
下载完成后通过sftp将安装包传入手机,使用Filza安装deb文件
然后在设置里开启SSL Kill Switch2,再次尝试抓包
再次尝试抓包
上述步骤设置完,还是抓不到,而且只要一抓包就会无法联网。
看来不能用常规手段解决这个问题。
那就试一下号称什么包都能抓到的r0capture能不能解决问题
安装frida
在Cydia里 【软件源】——【编辑】——【添加】——【输入build.frida.re】
添加完成后,在 Cydia 的搜索栏中输入「frida」进行下载。
r0capture
下载地址:https://github.com/r0ysue/r0capture
配置方式: https://github.com/r0ysue/AndroidSecurityStudy/blob/master/FRIDA/A01/README.md
配置完成后,命令行输入python3 r0capture.py -U -f 包名 -v
随着屏幕跳出目标app, 它顺利的展示了数据(不存在无法联网的情况)
然后终端陆陆续续的展示出https包解密后的数据…..(r0牛!)
定位参数
抓到包之后发现果然ios跟安卓的请求头是不一的(估计是俩外包团队开发的)
发现有两个字段: authCode
authCodeEncrypt
1 | authCode: *****-1A44E742-99BB-4B8A-972E-7F2A53D4D02A..Accept: */*..authCodeEncrypt: 2e940536fb12e372a8b413a7755760a5 |
现在就是搞定这俩字段,模拟生成即可
获取ipa包
安卓里的是apk安装包,ios里的是ipa包,可以通过App Store获取(几乎都是加密带壳的),或者第三方渠道(基本没壳)
之前我们可以通过iTunes来提取商店的ipa文件, 但12.+版本以后这个功能就被拿掉了
目前可以借用Apple Configurator 工具来实现
安装:
可以直接在App Store搜索安装
手机和电脑通过数据线连接,打开app,可以看到自己的手机了
在弹出的搜索框中输入想要提取的app名称
保持等待, 下载完后会提示是否替换, 这个时候注意不要做任何操作
右键点击Finder选择前往文件夹, 输入:
1 | ~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/ |
进入文件的最深层路径, 可以找到该App的ipa包(注意这里是加壳的!)
砸壳
iOS中的app,发布渠道一般都是App Store
。
从App Store
下载的APP全都是经过苹果加密过的ipa
包。
而Apple会为了安全,给app加密(使用Apple ID相关的对称加密算法),这个过程俗称为:加壳
,就像给app外部上加了一层壳
而加密后的ipa
包,是无法继续后续的逆向过程的
- 后续的典型的逆向过程是
- 用
IDA
/Hooper
等去反编译
- 用class-dump等去导出头文件
- class-dump直接去导出,未砸壳的App Store上的二进制的话只能导出
CDStructures.h
这个空的头文件,无法得到想要的各种类的头文件 - 对砸壳后的ipa,去用
MonkeyDev
动态调试
- 用
很多网站可以免费砸壳,或者收费很少。
咱自己动手丰衣足食,Cydia下载一个CrackerXL+,无脑砸壳
具体不再说了,很简单的操作,参考这篇文章https://www.jianshu.com/p/d1712e515432
砸壳完成后会给到.ipa文件
只需要改成.zip然后解压就能看到app了
右键app——显示包内容
然后在该文件夹进入终端
输入 otool -l 应用名 | grep crypt
出现cryptid 0
就是砸壳成功了
导出.h头文件
首先下载class-dump、添加到环境变量
亲身尝试安装官网版本会报错
Cannot find offset for address xxx in stringAtAddress:
推荐下载大佬改造版本
https://github.com/AloneMonkey/MonkeyDev/blob/master/bin/class-dump
输入class-dump -H qitongcha -o ./headers/
看到一对日志输出,全是什么failed,我晕
但是headers文件夹确实出现了很多.h文件
遇事不决直接百度:参考这里
那就是有文件缺失喽,在.h头文件里全局搜索关键字,也是没有找到。。这条线直接断了
Hopper分析二进制文件
转头一想,既然已经有可执行文件了,那我直接分析二进制不得了。
打开hopper,二进制文件直接拖进去,点OK
点左侧搜索栏进行搜索
果然找到了!
找到相关代码位置
点击这里查看伪代码
接下来就是看伪代码,因为不太懂怎么动态调试的,所以只能静态分析
经过漫长的分析,最终得出结论
authCode
是一个UUID
而authCodeEncrypt
是一个md5有关的一个加密后的字段。
呃。既然不能直接动态调试,那我直接用frida Hook下所有的md5不就可以了吗
Frida-Trace
上面已经安装好了Frida,这里不再赘述
先定位到进程的pid
然后直接输入
1 | frida-trace -U -i "CC_MD5" 8701 |
这时候会生成一个文件夹__handlers__
找到里面的CC_MD5.js
写入:
1 | { |
然后再次输入trace命令
出值,完事!
加密逻辑为:authCodeEncrypt=md5(前缀+authCode+盐)