一个比较有意思的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搜索安装

image-20231009160159833

手机和电脑通过数据线连接,打开app,可以看到自己的手机了

image-20231009160311866

image-20231009160505635

在弹出的搜索框中输入想要提取的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外部上加了一层壳

image-20231010222613103

而加密后的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就是砸壳成功了

image-20231010223119598

导出.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,我晕

image-20231010225942873

但是headers文件夹确实出现了很多.h文件

image-20231010230020515

遇事不决直接百度:参考这里

那就是有文件缺失喽,在.h头文件里全局搜索关键字,也是没有找到。。这条线直接断了

Hopper分析二进制文件

转头一想,既然已经有可执行文件了,那我直接分析二进制不得了。

打开hopper,二进制文件直接拖进去,点OK

image-20231010230355125

点左侧搜索栏进行搜索

image-20231010230511992

果然找到了!

image-20231010230548186

找到相关代码位置

image-20231010230645054

点击这里查看伪代码

image-20231010230721308

image-20231010230741431

接下来就是看伪代码,因为不太懂怎么动态调试的,所以只能静态分析

经过漫长的分析,最终得出结论

authCode是一个UUID

image-20231010231016923

authCodeEncrypt是一个md5有关的一个加密后的字段。

呃。既然不能直接动态调试,那我直接用frida Hook下所有的md5不就可以了吗

Frida-Trace

上面已经安装好了Frida,这里不再赘述

先定位到进程的pid

然后直接输入

1
frida-trace -U -i "CC_MD5" 8701

这时候会生成一个文件夹__handlers__

找到里面的CC_MD5.js

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
onEnter(log, args, state) {
this.args0 = args[0]; // 入参
this.args2 = args[2]; // 返回值指针
},
onLeave(log, retval, state) {
var ByteArray = Memory.readByteArray(this.args2, 16);
var uint8Array = new Uint8Array(ByteArray);

var str = "";
for(var i = 0; i < uint8Array.length; i++) {
var hextemp = (uint8Array[i].toString(16))
if(hextemp.length == 1){
hextemp = "0" + hextemp
}
str += hextemp;
}
log(`CC_MD5(${this.args0.readUtf8String()})`); // 入参
log(`CC_MD5()=${str}=`); // 返回值
}
}

然后再次输入trace命令

出值,完事!

加密逻辑为:authCodeEncrypt=md5(前缀+authCode+盐)

image-20231010231727574