來自:https://www.ianisme.com/ios/2326.html
一、前言:
從APPStore上面下載下來的程序都有殼,我們不能對他進(jìn)行任何操作,iOS逆向的第一步就是脫殼。下面跟我一起實(shí)戰(zhàn)一下。
二、工具:
1.一步越獄手機(jī)(建議選4s)
2.dumpdecrypted
三、步驟:
3.1 下載對應(yīng)的程序包
首先我使用我已經(jīng)越獄的iPhone4s從Appstore下載APP,此處我以某程序?yàn)槔2⑹褂肞P助手等工具導(dǎo)入到電腦里。
3.2 查看是否加密
解壓ipa文件,拿到里面的主文件,對其進(jìn)行架構(gòu)查詢
file 主文件名
如圖:
此APP支持兩種架構(gòu),我們查詢下它的加密情況
otool -l 主文件名 | grep crypt
如圖:
cryptid 1代表加密,cryptid 0代表未加密。兩個(gè)分別對應(yīng)著armv7和arm64,也就是它們都有加密。
3.3 使用dumpdecrypted砸殼
地址:傳送門->https://github.com/ianisme/IANDecryptiOSApp/tree/master/dumpdecrypted
3.3.1 編譯dumpdecrypted.dylib文件
首先我們需要編譯我們的dumpdecrypted.dylib文件,越獄手機(jī)的iOS的版本要和SDK的版本相同。我手機(jī)是iOS8.1.3,因此我選用了8.1的SDK,在Xcode6.1中可以找到。
打開終端我們輸入一下命令查找下我需要的SDK地址:
find / -name iPhoneOS8*
我這里的得到的地址為:
/Applications/Xcode6.1.1/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
我們需要修改Makefile文件中的
SDK=`xcrun --sdk iphoneos --show-sdk-path`
改為:
SDK=/Applications/Xcode6.1.1/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk
如果是的sdk是7.0的,需要繼續(xù)去掉arm64的內(nèi)容。8.0以上版本請略過
我們需要將Makefile文件中的
GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64
改為
GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s
我們再將dumpdecrypted.c文件中的
if (lc->cmd == LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)
改為:
if (lc->cmd == LC_ENCRYPTION_INFO)
下面進(jìn)入到dumpdecrypted根目錄,make進(jìn)行編譯,獲得dumpdecrypted.dylib
3.3.2 定位二進(jìn)制文件地址
我們在電腦上解壓縮那個(gè)ipa包,取到里面的Info.plist文件,獲取里面的Bundle identifier,例如:com.ianisme.xxxxx
如圖:
在手機(jī)上跑我提供的這個(gè)Demo:
傳送門->https://github.com/ianisme/IANDecryptiOSApp/tree/master/getAppBundle
找到對應(yīng)Bundle identifier的對應(yīng)的resourcesDirectoryURL和dataContainerURL
如圖:
3.3.3 進(jìn)行脫殼處理
得到地址后我們將編譯好的dumpdecrypted.dylib傳輸?shù)絛ataContainerURL的tmp目錄下
如圖:
然后切換到dataContainerURL的tmp目錄執(zhí)行如下代碼:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/FEA0A0C0-EF52-4D76-8EEC-422D5D8331D4/XXXX.app/XXXX
進(jìn)行脫殼
如圖:
在tmp目錄下生成了一個(gè)XXXX.decrypted這就是脫殼后的主文件
我們把文件用scp命令導(dǎo)出
如圖:
3.4 armv7抽取處理
此時(shí)我們把XXXX.decrypted的擴(kuò)展名去掉,使用otool查看脫殼情況
我們發(fā)現(xiàn)64位的殼沒有脫掉,因?yàn)槲矣玫氖莍Phone4s,處理器架構(gòu)是armv7,只能脫這部分的殼。
我們將app的armv7抽取出來,就可以保證app只以armv7模式運(yùn)行,指令集向下兼容,也就是4s以上的機(jī)型都可以運(yùn)行的。不得不說現(xiàn)在4s依然威武,到處都少不了他。
運(yùn)行如下代碼:
lipo XXXX -thin armv7 -output XXXX_armv7
XXXX_armv7就是最終的無殼主文件,將ipa包里面的替換掉,這就是一個(gè)無殼的APP了。
四、總結(jié):
逆向是把雙刃劍,有利于提高我們的技術(shù),也有可能為不懷好意的人提供了捷徑,以上內(nèi)容僅供學(xué)習(xí)參考,請勿用于非法用途,謝謝。