bogon:~ qp$ otool -l ~/Desktop/com_kwai_gif | grep cry
cryptoff 16384
cryptsize 16384
cryptid 1
第一步:获得cryptid,cryptoffset,cryptsize(用otool)
cryptid为加密状态,0表示未加密,1表示解密;
cryptoffset未加密部分的偏移量,单位bytes
cryptsize加密段的大小,单位bytes
第二步:将cryptid修改为0
第三步:gdb导出解密部分
第四步:用第二步中的解密部分替换掉加密部分
第五步:签名 (ldone)
第六步:打包成IPA安装包
对iOS的.ipa文件进行解密,我们称为砸壳,砸壳有两种方式,一种是破解其加密算法,一种是读取内存中正在运行的元数据。
手动砸壳概念
当软件运行在内存中后,实际上内存中软件已经被解密为二进制数据,我们只需要将内存中的数据取出来,再把MachO文件的加密部分替换掉即可完成砸壳操作。
操作步骤
- 在越狱手机中安装正版软件。
- 通过
ps -A | grep 软件名称
打印出运行中的正版软件路径
。
# ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。
$ps -A | grep AliPay
- 通过
scp -P 12345 root@ip地址:软件路径 ./
把手机进程中的软件machO文件
拷贝到电脑来。
# scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令
# -P 是端口号的意思
# 12345 是USB映射端口号,通过Wi-Fi链接的话默认端口号是22
# root 是最高级用户
# ./ 表示电脑跟目录
$scp -P 12345 root@192.168.1.23 ./.../.../AliPay ./
- 通过
otool -l machO文件 | grep cry
查看已加密的数据cryptoff
偏移量,和已加密过的 数据cryptsize
大小 ,otool介绍。
# otool(object file displaying tool) : 针对目标文件的展示工具,用来发现应用中使用到了哪些系统库,调用了其中哪些方法,使用了库中哪些对象及属性,它是Xcode自带的常用工具。
# -l 读取load commands信息,此信息在每个machO文件中都有。用于描述数据段的基本信息
# | shell的管道符
# grep cry 匹配包含cry字段的数据
$otool -l AliPay | grep cry
打印出如下信息
cryptoff 16384 #是MachO文件已加密数据段的偏移量,而偏移量前面的都是未加密的数据段。
cryptsize 15613952 # 是MachO文件中已加密的真实数据段大小
cryptid 0 #已加密是用1表示,未加密用0表示,当然如果要修改成其他数也是可以的。一般这个参数用0&1表示就足够
- 使用lldb的
image list
指令读取软件在内存中的首地址,也就是我们读取的这个软件在内存中的位置。
# 查看库列表
$image list
- 重点:使用lldb的
memory
指令memory read --force --outfile ./decypted.bin -- binary --count 数据大小(cryptsize) 内存中软件的首地址+便宜量(cryptoff)
读取内存中已被解密的二进制数据。
# memory 内存操作命令
# read 读取
# --force 表示按字节读取
# --outfile 导出文件 后面跟随文件位置和文件名及格式 bin是二进制文件
# --binary 表示是二进制文件
# --count 表示数据大小,后面跟随数据量,再跟随拷贝数据的开始位置
$memory read --force --outfile ./decypted.bin --binary --count 15613952 0x0000000104c54000+16384
- 重点:通过
dd seek=偏移量 bs=1 conv=notrunc if=./decrypted.bin of=./Mach-O文件
把已解密的数据放回原始的machO文件中。
# dd 用指定大小的文件写入另外一个文件当中去
# seek=目标文件开始写入的位置
# bs=1 表示按1个字节写
# conv=notrunc 写入后保留输出文件的原始部分
# if=./Mach-O文件 表示输入文件
# of=./Mach-O文件 表示输出的目标文件
$dd seek=16384 bs=1 conv=notrunc if=./decrypted.bin of=./AliPay
输出结果:
62914560+0 records in
62914560+0 records out
62914560+0 bytes transferred in 202.585956 secs (310557 bytes/sec)
- 查看machO文件是否砸壳成功
otool -l machO文件 | grep cry
cryptoff 16384
cryptsize 15613952
cryptid 1 仍然是1,但实际上已经砸壳成功。可以修改
通过 MachOView工具打开MachO文件,找到LC_ENCRYPTION_INFO_64
,再找到Crypt ID
。将其的Data值修改为0
,然后保存。
通过class-dump导出头文件、成功表示砸壳成功
$class-dump -H Alipay -o ./AlipayHeaders
结束
IPA应用程序提交到苹果商店时, 苹果官方的会对应用添加自己壳,所有苹果手机应用在app store下载在手机上,都会存在苹果官方的壳,所有就要进行砸壳,才能拿出手机中的IPA。
方式一、Clutch砸壳
下载Clutch(高版本不支持了,10.2还是可以用,12.1不行了),放入手机目录(全局环境变量):/usr/bin,并且赋予执行权限。利用爱思助手打开ssh通道
查看当前未砸壳程序
Clutch -I
进行砸壳
Clutch -d packageName
,如下是例子:
ios 12.1系统运行Clutch会报错,报错信息:Killed: 9
解决办法,命令界面输入:
cd /private/var/mobile/Documents(没有就建立一个)
ldid -e `which bash` > ent.xml
ldid -Sent.xml `which Clutch`
inject `which Clutch`
这个在ios12.1修复了,我还是没有成功.....
方式二、frida-ios-dump砸壳
前提,手机上安装frida.通过注入js实现内存dump,再由Python自动拷贝到电脑生成ipa包
1、配置frida-ios-dump环境:从Github下载工程
sudo mkdir /opt/dump && cd /opt/dump && sudo git clone https://github.com/AloneMonkey/frida-ios-dump
安装依赖:
sudo pip install -r /opt/dump/frida-ios-dump/requirements.txt --upgrade
修改dump.py参数(可直接打开修复):
vim /opt/dump/frida-ios-dump/dump.py
找到如下几行(32~35), 如我不需要修改:
User = 'root'
Password = 'alpine'
Host = 'localhost'
Port = 2222
2、使用,打开终端安装
brew install usbmuxd
设置端口映射(因为我上面连接手机是1025[看方式一端口],但是这个要22[不懂],这里2222是上面脚本里的连接端口)我个人认为是iproxy 2222 1025
,但是不行,用iproxy 2222 22
就可以。
(1)、打开第一个终端输入:iproxy 2222 22(端口映射)
然后会自动显示等待连接:waiting for connection
(2)、打开第二个终端[此时comand+N新建终端]输入:
image(登录成功后,进行3)
(3)、打开第三个终端,切换到/opt/dump/frida-ios-dump/目录下,运行./dump.py -l
(小写l)查看应用
(4)、对应用进行砸壳sudo ./dump.py boundID
(这里因为这个目录是sudo创建的,普通用户不能创建文件,直接运行dump.py会导致不能生成ipa)
(5)、生成在ipa在当前目录(/opt/dump/frida-ios-dump/目录),ls查询
image作者:ESE_
链接:https://www.jianshu.com/p/80c1311530c3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论