對iOS的.ipa文件進(jìn)行解密统倒,我們稱為砸殼,砸殼有兩種方式意系,一種是破解其加密算法,一種是讀取內(nèi)存中正在運(yùn)行的元數(shù)據(jù)神郊。
手動砸殼概念
當(dāng)軟件運(yùn)行在內(nèi)存中后肴裙,實(shí)際上內(nèi)存中軟件已經(jīng)被解密為二進(jìn)制數(shù)據(jù)趾唱,我們只需要將內(nèi)存中的數(shù)據(jù)取出來,再把MachO文件的加密部分替換掉即可完成砸殼操作蜻懦。
操作步驟
- 在越獄手機(jī)中安裝正版軟件甜癞。
- 通過
ps -A | grep 軟件名稱
打印出運(yùn)行中的正版軟件路徑
。
# ps命令最常用的還是用于監(jiān)控后臺進(jìn)程的工作情況,因?yàn)楹笈_進(jìn)程是不和屏幕鍵盤這些標(biāo)準(zhǔn)輸入/輸出設(shè)備進(jìn)行通信的,所以如果需要檢測其情況,便可以使用ps命令了宛乃。
$ps -A | grep AliPay
- 通過
scp -P 12345 root@ip地址:軟件路徑 ./
把手機(jī)進(jìn)程中的軟件machO文件
拷貝到電腦來悠咱。
# scp 是secure copy的簡寫蒸辆,用于在Linux下進(jìn)行遠(yuǎn)程拷貝文件的命令
# -P 是端口號的意思
# 12345 是USB映射端口號,通過Wi-Fi鏈接的話默認(rèn)端口號是22
# root 是最高級用戶
# ./ 表示電腦跟目錄
$scp -P 12345 root@192.168.1.23 ./.../.../AliPay ./
- 通過
otool -l machO文件 | grep cry
查看已加密的數(shù)據(jù)cryptoff
偏移量析既,和已加密過的 數(shù)據(jù)cryptsize
大小 躬贡,otool介紹。
# otool(object file displaying tool) : 針對目標(biāo)文件的展示工具眼坏,用來發(fā)現(xiàn)應(yīng)用中使用到了哪些系統(tǒng)庫拂玻,調(diào)用了其中哪些方法,使用了庫中哪些對象及屬性宰译,它是Xcode自帶的常用工具檐蚜。
# -l 讀取load commands信息,此信息在每個(gè)machO文件中都有沿侈。用于描述數(shù)據(jù)段的基本信息
# | shell的管道符
# grep cry 匹配包含cry字段的數(shù)據(jù)
$otool -l AliPay | grep cry
打印出如下信息
cryptoff 16384 #是MachO文件已加密數(shù)據(jù)段的偏移量闯第,而偏移量前面的都是未加密的數(shù)據(jù)段。
cryptsize 15613952 # 是MachO文件中已加密的真實(shí)數(shù)據(jù)段大小
cryptid 0 #已加密是用1表示缀拭,未加密用0表示咳短,當(dāng)然如果要修改成其他數(shù)也是可以的。一般這個(gè)參數(shù)用0&1表示就足夠
- 使用lldb的
image list
指令讀取軟件在內(nèi)存中的首地址蛛淋,也就是我們讀取的這個(gè)軟件在內(nèi)存中的位置诲泌。
# 查看庫列表
$image list
- 重點(diǎn):使用lldb的
memory
指令memory read --force --outfile ./decypted.bin -- binary --count 數(shù)據(jù)大小(cryptsize) 內(nèi)存中軟件的首地址+便宜量(cryptoff)
讀取內(nèi)存中已被解密的二進(jìn)制數(shù)據(jù)铣鹏。
# memory 內(nèi)存操作命令
# read 讀取
# --force 表示按字節(jié)讀取
# --outfile 導(dǎo)出文件 后面跟隨文件位置和文件名及格式 bin是二進(jìn)制文件
# --binary 表示是二進(jìn)制文件
# --count 表示數(shù)據(jù)大小敷扫,后面跟隨數(shù)據(jù)量,再跟隨拷貝數(shù)據(jù)的開始位置
$memory read --force --outfile ./decypted.bin --binary --count 15613952 0x0000000104c54000+16384
- 重點(diǎn):通過
dd seek=偏移量 bs=1 conv=notrunc if=./decrypted.bin of=./Mach-O文件
把已解密的數(shù)據(jù)放回原始的machO文件中诚卸。
# dd 用指定大小的文件寫入另外一個(gè)文件當(dāng)中去
# seek=目標(biāo)文件開始寫入的位置
# bs=1 表示按1個(gè)字節(jié)寫
# conv=notrunc 寫入后保留輸出文件的原始部分
# if=./Mach-O文件 表示輸入文件
# of=./Mach-O文件 表示輸出的目標(biāo)文件
$dd seek=16384 bs=1 conv=notrunc if=./decrypted.bin of=./AliPay
輸出結(jié)果:
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葵第,但實(shí)際上已經(jīng)砸殼成功『夏纾可以修改
通過 MachOView工具打開MachO文件卒密,找到LC_ENCRYPTION_INFO_64
,再找到Crypt ID
棠赛。將其的Data值修改為0
哮奇,然后保存。
- 通過class-dump導(dǎo)出頭文件睛约、成功表示砸殼成功
$class-dump -H Alipay -o ./AlipayHeaders
結(jié)束
新年快樂鼎俘!