我們一般分析別人的App都是分析砸過殼的AppiOS砸殼,一般會(huì)借助三方工具來砸殼,那么如果三方工具失效了呢?這個(gè)時(shí)候就需要我們自己砸殼了。在了解了砸殼原理后這個(gè)就很好理解了。雖然手動(dòng)有點(diǎn)麻煩,但還是能實(shí)現(xiàn)的。
一、導(dǎo)出app包。
1.1 查找app目錄
zaizai:~ root# ps -A | grep WeChat
26736 ?? 0:03.08 /var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app/WeChat
26742 ttys000 0:00.01 grep WeChat
1.2 拷貝app包
scp -r -P 12345 root@localhost:/var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app ./
這樣就獲得了加密的app包。
otool -l WeChat | grep crypt
cryptoff 6565888
cryptsize 4096
cryptid 1
對(duì)應(yīng)信息查看:

-
cryptoff:加密開始偏移。 -
cryptsize:加密數(shù)據(jù)大小。 -
cryptid:加密標(biāo)記。
cryptid僅僅是一個(gè)標(biāo)記,修改是這個(gè)無效的。
cryptsize與系統(tǒng)版本有關(guān)iOS14上線數(shù)據(jù)很小。
二、lldb砸殼
砸殼實(shí)際上就是從內(nèi)存中拷貝出解密的數(shù)據(jù)。
2.1從內(nèi)存中拷貝加密數(shù)據(jù)(內(nèi)存中是解密的)
1.直接用Xcode附加微信進(jìn)程。
2.imag list找到ASLR+PAGEZERO(0x0000000104500000):
(lldb) image list
[ 0] EB606691-98E6-384F-BABB-F46E7BC265F9 0x0000000104500000 /private/var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app/WeChat (0x0000000104500000)
3.拷貝數(shù)據(jù)
memory read --force --outfile 輸出文件 --binary --count 文件大小(cryptsize) 起始位置
(lldb) memory read --force --outfile ~/Desktop/WeChatDump/WeChat.bin --binary --count 4096 0x0000000104500000+6565888
4096 bytes written to '/Users/zaizai/Desktop/WeChatDump/WeChat.bin'
-
memory read --force:按字節(jié)讀取。 -
--outfile:輸出文件路徑。 -
--binary:輸出格式,二進(jìn)制。 -
--count:要拷貝的數(shù)據(jù)大小cryptsize。 -
MachO首地址+cryptoff:找到內(nèi)存中的起始位置。
這樣我們就拷貝到了解密后的數(shù)據(jù)WeChat.bin了。
這里不拷貝全部數(shù)據(jù)是因?yàn)?code>data段數(shù)據(jù)可能在運(yùn)行的過程中被改變了。
2.2 用解密后的數(shù)據(jù)替換原加密數(shù)據(jù)
dd seek=6565888 bs=1 conv=notrunc if=./WeChat.bin of=WeChat
-
seek:從輸入文件跳過所少開始寫入。offset。 -
bs:一次寫入多少字節(jié)。 -
conv:指令參數(shù)傳遞文件。notrunc表示不截?cái)?。(寫完?code>WeChat后面的內(nèi)容不截段) -
if:輸入的文件。 -
of:輸出的文件。
接著用MachOView修改cryptid為0:

直接在
Load Commands->LC_ENCRYPTION_64中找到Crypt ID修改Data為0。
??拷貝和寫入時(shí)間與電腦性能和數(shù)據(jù)大小有關(guān),需要耐心等待。
2.3 驗(yàn)證
2.3.1 class-dump驗(yàn)證
直接class-dump頭文件:
class-dump -H WeChat -o ./WeChat_Headers
發(fā)現(xiàn)能直接dump成功了;

沒有砸殼的應(yīng)用是
dump不成功地。
2.3.2 重簽名驗(yàn)證
接著用咋過殼的WeChat替換WeChat.app中的WeChat然后用Monkey重簽名運(yùn)行(當(dāng)然.app也可以打包成.ipa)。

重簽名驗(yàn)證也沒問題。
總結(jié)
-
LLDB手動(dòng)脫殼-
memory read命令- 通過
--outfile參數(shù)導(dǎo)出文件。 -
--count指定導(dǎo)出文件大小。
- 通過
-
dd命令寫入原文件-
seek指定偏移。(跳過多少開始寫入) -
conv保留沒有替換的部分。
-
-