標籤:
在《iOS應用逆向工程》4.6.2節中,我們曾推薦使用iPhoneCake源的AppCrackr 1.7版給App砸殼。這種方式簡單粗暴,省時省力,但正是因為它過於方便有木有,導致幾乎所有iDevice使用者都可輕鬆上手,隨便褻玩,所以不少使用者都拿它來破解程式,而不是學習《iOS應用逆向工程》,簡直可以說是嬸可忍叔不可忍!這也導致了iOS越獄開發社區普遍認為這個軟體助長了盜版的氣焰,沒有脫離低級趣味,對iPhoneCake源進行了強烈譴責,責令其限期整改。迫於壓力,iPhoneCake在前段時間將AppCrackr下架,而書中提到的xsellize源中的AppCrackr則是1.5舊版,已不能在進階系統中使用。所以,為了響應業界反盜版的呼聲,提倡毛主席“自己動手豐衣足食”的革命精神,讓“砸殼”這件事恢複單純的研究目的,在這裡我們會使用更偏geek一些的dumpdecrypted方式來給App砸殼,不再推薦AppCrackr、Clutch、Crackulous等純UI方式。由於dumpdecrypted剛經曆過一次大升級,目前網上可以找到的使用教程均已到期,所以這裡我們手把手帶大家進行一次完整的“砸殼 + class-dump”,請大家準備板凳瓜子汽水,開始圍觀。如果能對著電腦,邊看邊做,善莫大焉!樓豬才疏學淺,如有紕漏,敬請斧正,洗耳恭聽,汙言穢語,免開尊口,感謝支援!
一、設定 1. 下載dumpdecrypted的源碼源碼是“https://github.com/stefanesser/dumpdecrypted/archive/master.zip”,下載後請將其解壓至你習慣的位置樓豬這裡把它存放在/Users/wwc(自己電腦的名稱)/Desktop/Code目錄下2. 確認你的iDevice系統版本設定 -> 通用 -> 關於本機3. 修改Makefile中的SDK欄位dumpdecrypted必須使用與iOS版本相同的SDK版本編譯,才能正常工作。開啟“終端(Terminal)”,輸入
xcrun –sdk iphoneos –show-sdk-path,查看輸出,看看目前的預設SDK是什麼版本,例如樓豬的是“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk”。這裡分2種情況:
i. 如果你使用的iOS版本同以上輸出的SDK版本符合(例如樓豬使用的正是iOS 6.1.5),則無需對dumpdecrypted工程中的檔案作任何改動;ii. 如果你使用的iOS版本同以上輸出的SDK版本不符則需要更改Makefile(友情提示:可用文字編輯器開啟)中的SDK=`xcrun –sdk iphoneos –show-sdk-path`為iOS版本相同的SDK版本。什麼,你只有一個SDK?去https://developer.apple.com/downloads/index.action下載舊版本的Xcode,然後把裡面的SDK提取出來。什麼,不會提取?自己去Google一下,罰你今晚表睡覺了!提取出了舊版的SDK後,樓豬習慣把它們放在新版SDK相同的目錄下,然後將SDK=`xcrun –sdk iphoneos –show-sdk-path`改為SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.X.sdk
或
SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.X.sdk
,即iOS版本需要與SDK版本相同。 注意,5.1版SDK編譯出的dylib是向下相容的,可以用於iOS5.0,6.1版SDK同理。(注意:這個有待驗證,樓豬還沒這麼幹過)
4. 修改Makefile中的GCC_UNIVERSAL欄位和dumpdecrypted.c如果你的iOS/SDK版本是7.0,則goto “這裡繼續:”。如果並不是7.0,則需要修改Makefile中的GCC_UNIVERSAL欄位和dumpdecrypted.c。將Makefile中的
GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64
改為
GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s
再將dumpdecrypted.c第76行的
if (lc->cmd ==LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)
改成
if(lc->cmd == LC_ENCRYPTION_INFO)
,儲存。這裡繼續:接著直接cd到“/Users/wwc/Desktop/Code/dumpdecrypted-master/”下,然後輸入“make”並斷行符號,產生“/Users/wwc/Desktop/Code/dumpdecrypted-master/dumpdecrypted.dylib”。
5. 太麻煩?直接下載樓豬編譯好的檔案https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_5.dylibhttps://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_6.dylibhttps://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_7.dylib
二、砸殼1.將“鎚子”放入裝置中
查看iOS裝置的IP地址,然後在Mac上使用scp命令將dumpdecrypted.dylib檔案放到iOS裝置中:
$ scp dumpdecrypted.dylib [email protected]:/var/tmp
[email protected]‘s password:
dumpdecrypted.dylib 100% 81KB 81.0KB/s 00:00
2.砸
選定一個讓你覺得非常不爽或非常感興趣的app,我就隨便選了一個QQ。在iOS裝置上開啟iFunBox,查到它的可執行檔的路徑為:/var/mobile/Applications/xxxxxxxx/QQ.app/QQ
然後用SSH連到iOS裝置上,cd到剛剛動態庫的路徑:/var/tmp。
$ ssh [email protected]
[email protected]‘s password:
root# cd /var/tmp/
root# ls
FlipswitchCache/ com.apple.audio.hogmode.plist
L65ancd.sock= com.apple.tccd/
L65d.sock= com.apple.timed.plist
MediaCache/ cydia.log
RestoreFromBackupLock* dumpdecrypted.dylib*
SpringBoard_reboot_flag launchd/
com.apple.assistant.bundleservicecache.plist mobile_assertion_agent.log
砸殼(久等了):
- root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/xxxxxxxx/QQ.app/QQ
- mach-o decryption dumper
-
- DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
-
- [+] detected 32bit ARM binary in memory.
- [+] offset to cryptid found: @0xd5a90(from 0xd5000) = a90
- [+] Found encrypted data at address 00004000 of length 3047424 bytes - type 1.
- [+] Opening /private/var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/QQ.app/QQ for reading.
- [+] Reading header
- [+] Detecting header type
- [+] Executable is a FAT image - searching for right architecture
- [+] Correct arch is at offset 16384 in the file
- [+] Opening QQ.decrypted for writing.
- [+] Copying the not encrypted start of the file
- [+] Dumping the decrypted data into the file
- [+] Copying the not encrypted remainder of the file
- [+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a90
- [+] Closing original file
- [+] Closing dump file
成果:
root# ls
FlipswitchCache/ com.apple.audio.hogmode.plist
QQ.decrypted com.apple.tccd/
L65ancd.sock= com.apple.timed.plist
L65d.sock= cydia.log
MediaCache/ dumpdecrypted.dylib*
RestoreFromBackupLock* launchd/
SpringBoard_reboot_flag mobile_assertion_agent.log
com.apple.assistant.bundleservicecache.plist
其中的QQ.decrypted就是目標產物 ///////////////////////注意://///////////////////////////這一段樓豬沒有得到驗證,有心的小夥伴可以驗證一下,然後反饋給樓豬,樓豬再次先謝過了。
class-dump在嶄新的21世紀,App的可執行檔一般都是fat binary,也就是說一個二進位檔案裡包含適合多個CPU架構使用的可執行檔,雖然CPU架構是向下相容的(也就是說armv64可以執行armv7s的指令,反之則不行),但向下相容一般會導致一部分效能的犧牲。這樣如果一個binary既包含適用於armv7架構的可執行檔,又包含armv7s的,還包含arm64的,就意味著它可以在iPhone 4(armv7),4s(armv7),5(armv7s),5s(arm64)上都發揮100%的效能。雖然除了處女座以外的其他星座使用者一般是感受不到這個效能的提升的~但是,機器比處女座還要處女座,它在執行一個fat binary時,會選擇最適合自己CPU的那個可執行檔,其他的可執行檔其實是沒有得到執行的。因此dumpdecrypted.dylib起作用的只有實際得到執行的那一個可執行檔,舉個例子,如果Victim裡含有armv7和armv7s這2種架構,而我們的操作機是一台iPhone5/4,那麼dumpdecrypted砸掉的是armv7s/armv7那部分的殼,armv7/armv7s部分仍是有殼的。自然地,class-dump的作用對象必須是砸掉殼的binary,所以我們要在class-dump時指定目標,在本例中,就是 class-dump –arch armv7s Victim.decrypted
或
class-dump –arch armv7 Victim.decrypted
///////////////////////注意://///////////////////////////
樓豬直接執行了class-dump命令提取了標頭檔,命令如下:
class-dump -H QQ.decrypted -o /Users/wwc/Desktop/Code/headers
等待命令執行完畢,查看這個目錄,你想要的東西就在裡面了。
這是樓豬借鑒了各方經驗,加上自己親自動手操作得到的結論,可能某些地方存在紕漏,希望各位小夥伴積極指正。小弟在此拜謝了。
IOS 逆向工程之砸殼