对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
结束
新年快乐!
网友评论