天天看點

轉【iOS應用安全】遊戲安全之IPA破解原理及防禦

本文轉自:http://www.apkbus.com/android-215495-1-1.html   iOS應用安全遊戲應用有一個很泛濫但被視為雞肋的問題,即iOS IPA破解問題。因為國内大多數遊戲靠内購和廣告盈利,遊戲安裝包也隻是在早期象征性的收費,之後就會免費,是以對iOS應用安全IPA從隻能在購買者裝置安裝變成可免費到處安裝并不關注。         iOS應用安全破解軟體的問題,其實不僅僅是iOS上,幾乎所有平台上,無論是pc還是移動終端,都是頑疾。可能在中國這塊神奇的國度,大家都習慣用盜版了,并不覺得這是個問題,個人是這麼想,甚至某些盈利性質的公司也這麼想,并且還有些平台網站把盜版軟體當成噱頭,義正言辭地去宣傳用盜版是白富美,買正版是傻X。其實iOS應用安全破解軟體的問題,既不起源于中國,現階段也沒有發揚光大到稱霸的地位,目前屬于老二,當然很有希望趕超。據統計,全球範圍内,排名前五的破解app分享網站有以下幾家:         1. Apptrack代表軟體:Crackulous,clutch         破解界的老大哥,出品了多款易用的破解軟體,讓人人都會破解,鼓勵分享破解軟體,破解app共享卡正以恐怖的速度擴充。         2. AppCake代表軟體:CrackNShare        支援三種語言,中文、英文、德文,前景很可觀        3. KulApps 北美        4. iDownloads 俄國        5. iGUI 俄國         以上消息,對于依靠安裝包收費的iOS應用開發來說,無疑是噩耗,其實由不少人也在網上号召支援正版,要求知識産權保護的力度加強。這些願望或許終有一天會實作,但從技術的角度來分析iOS應用安全問題的所在,給出有效的防禦方案,無疑比願望更快。 ----破解原理部分----------------------------------------          Appstore上的應用都采用了DRM(digital rights management)數字版權加密保護技術,直接的表現是A帳号購買的app,除A外的帳号無法使用,其實就是有了數字簽名驗證,而app的破解過程,實質也是去除數字簽名的過程。去除過程包括兩部分,如下所示:          條件一,裝置越獄,獲得root權限,去除掉裝置上的簽名檢查,允許沒有合法簽名的程式在裝置上運作         代表工具:AppSync(作者:Dissident ,Apptrack網站的核心人物)       (iOS 3.0 出現,不同的iOS版本,原理都不一樣)          iOS 3.0後,MobileInstallation将可執行檔案的簽名校驗委托給獨立的二進制檔案/usrlibexec/installd來處理,而AppSync 就是該執行檔案的一個更新檔,用來繞過簽名校驗。iOS應用安全          iOS 4.0後,apple留了個後門(app給開發者預留的用于測試的沙盒環境),隻要在/var/mobile/下建立tdmtanf目錄,就可以繞過installd的簽名校驗,但該沙盒環境會造成沒法進行IAP購買,無法在GameCenter檢視遊戲排名和加好友,特征是進入Game Center會出現SandBox字樣。AppSync for iOS 4.0 +修複了這一問題。iOS應用安全         iOS 5.0後,apple增加了新的安全機制來保護二進制檔案,例如去掉二進制檔案的符号表,給破解帶來了難度。新版的AppSync for iOS 5.0+ 使用MobileSubstrate來hook libmis.dylib庫的MISValidateSignatureAndCopyInfo函數來繞過簽名驗證         條件二,解密mach-o可執行檔案         一般采用自購破解的方法,即先通過正常流程購買appstore 中的app,然後采用工具或手工的方式解密安裝包中的mach-o可執行檔案。         之是以要先獲得正常的IPA的原因是mach-O檔案是有DRM數字簽名的,是iOS應用安全加密過的,而解密的核心就是解密加密部分,而我們知道,當應用運作時,在記憶體中是處于解密狀态的。是以首要步驟就是讓應用先正常運作起來,而隻有正常購買的應用才能達到這一目的,是以要先正常購買。         購買後,接着就是破解了。随着iOS裝置cpu 的不同(arm 6 還是arm 7),mach-o檔案格式的不同(thin binary 還是fat binary),應用是否對破解有防禦措施(檢測是否越獄,檢測應用檔案系統的變化),破解步驟也有所不同,但核心步驟如下:         第一步:獲得cryptid,cryptoffset,cryptsize         cryptid為加密狀态,0表示未加密,1表示解密;         cryptoffset未加密部分的偏移量,機關bytes         cryptsize加密段的大小,機關bytes         第二步:将cryptid修改為0         第三步:gdb導出解密部分         第四步:用第二步中的解密部分替換掉加密部分         第五步:簽名         第六步:打包成IPA安裝包         整個IPA破解曆史上,代表性的工具如下:        代表工具:Crackulous(GUI工具)(來自Hackulous)        crackulous最初版本由SaladFork編寫,是基于DecryptApp shell腳本的,後來crackulous的源碼洩露,SaladFork放棄維護,由Docmorelli接手,建立了基于Clutch工具的最近版本。iOS應用安全         代表工具:Clutch(指令行工具)(來自Hackulous)         由dissident編寫,Clutch從釋出到現在,是最快的破解工具。Clutch工具支援繞過ASLR(apple在iOS 4.3中加入ASLR機制)保護和支援Fat Binaries,基于icefire的icecrack工具,objective-c編寫。         代表工具:PoedCrackMod(指令行工具)(來自Hackulous)         由Rastignac編寫,基于poedCrack,是第一個支援破解fat binaries的工具。shell編寫         代表工具:CrackTM(指令行工具)(來自Hackulous)         由MadHouse編寫,最後版本為3.1.2,據說初版在破解速度上就快過poedCrack。shell編寫       (以下是bash腳本工具的發展曆史(腳本名(作者)),雖然目前都已廢棄,但都是目前好用的ipa 破解工具的基礎。         autop(Flox)——>xCrack(SaladFork)——>DecryptApp(uncon)——>Decrypt(FloydianSlip)——>poedCrack(poedgirl)——>CrackTM(MadHouse)         代表工具:CrackNShare (GUI工具)(來自appcake)         基于PoedCrackMod 和 CrackTM         我們可以通過分析這些工具的行為,原理及産生的結果來啟發iOS應用安全防禦的方法。         像AppSync這種去掉裝置簽名檢查的問題還是留給apple公司來解決(屬于iOS應用安全系統層的安全),對于app開發則需要重點關注,app是如何被解密的(屬于iOS應用安全應用層的安全)。         我們以PoedCrackMod和Clutch為例         一、PoedCrackMod分析(v2.5)         源碼及詳細的源碼分析見:http://danqingdani.blog.163.com/blog/static/18609419520129261354800/         通過分析源碼,我們可以知道,整個破解過程,除去前期檢測依賴工具是否存在(例如ldid,plutil,otool,gdb等),僞造特征檔案,可以總結為以下幾步:         第一步. 将fat binary切分為armv6,armv7部分(采用swap header技巧)         第二步:獲得cryptid,cryptoffset,cryptsize         第三步. 将armv6部分的cryptid修改為0,gdb導出對應的armv6解密部分(對經過swap header處理的Mach-O檔案進行操作,使其在arm 7裝置上,強制運作arm 6部分),替換掉armv6加密部分,簽名        第四步. 将armv7部分的cryptid修改為0,gdb導出對應的armv7解密部分(對原Mach-O檔案進行操作),替換掉armv7加密部分,簽名         第五步.合并解密過的armv6,armv7         第六步.打包成ipa安裝包         注明:第三步和第四步是破解的關鍵,破解是否成功的關鍵在于導出的解密部分是否正确完整。         由于binary fat格式的mach-o檔案在arm 7裝置上預設運作arm 7對應代碼,當需要導出arm 6對應的解密部分時,要先經過swap header處理,使其在arm 7 裝置上按arm 6運作。         二、clutch分析         對于最有效的clutch,由于隻找到了clutch 1.0.1的源碼(最新版本是1.2.4)。是以從ipa破解前後的差別來觀察發生了什麼。 使用BeyondCompare進行對比,發現有以下變動。         1. 正版的iTunesMetadata.plist被移除 該檔案用來記錄app的基本資訊,例如購買者的appleID,app購買時間、app支援的裝置體系結構,app的版本、app辨別符         2.正版的SC_Info目錄被移除        SC_Info目錄包含appname.sinf和appname.supp兩個檔案。      (1)SINF為metadata檔案      (2)SUPP為解密可執行檔案的密鑰        3.可執行檔案發生的變動非常大,但最明顯的事是cryptid的值發生了變化

leetekiMac-mini:xxx.app leedani$ otool -l appname | grep "cmd LC_ENCRYPTION_INFO" -A 4          cmd LC_ENCRYPTION_INFO      cmdsize 20    cryptoff  8192    cryptsize 6053888    cryptid   0--          cmd LC_ENCRYPTION_INFO      cmdsize 20    cryptoff  8192    cryptsize 5001216    cryptid   0

轉【iOS應用安全】遊戲安全之IPA破解原理及防禦

        iTunesMetadata.plist 與 SC_Info目錄的移除隻是為了避免洩露正版購買者的一些基本資訊,是否去除不影響ipa的正常安裝運作。 ----破解防禦部分----------------------------------------         在IPA防禦方面,目前沒有預防破解的好辦法,但可以做事後檢測,使得破解IPA無法正常運作以達到防禦作用。         而該如何做事後檢測呢,最直接的檢測方法是将破解前後檔案系統的變化作為特征值來檢測。         通過分析PoedCrackMod源碼,會發現根據破解前後檔案時間戳的變化,或檔案内容的變化為特征來判斷是不可靠的,因為這些特征都可以僞造。如下所示,摘自于PoedCrackMod腳本         1.Info.plist         增加SignerIdentity,(目前主流的MinimumOSVersion版本為3.0,版本3.0之前的需要僞造SignerIdentity)

plutil -key 'SignerIdentity' -value 'Apple iPhone OS Application Signing' "$WorkDir/$AppName/Info.plist" 2>&1> /dev/null

        僞造Info.plist檔案時間戳

touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/$AppName/Info.plist"

        2.iTunesMetadata.plist 僞造iTunesMetadata.plist檔案

plutil -xml "$WorkDir/iTunesMetadataSource.plist" 2>&1> /dev/nullecho -e "\t<key>appleId</key>" >>"$WorkDir/iTunesMetadata.plist" #僞造AppleIDecho -e "\t<string></string>" >>"$WorkDir/iTunesMetadata.plist"echo -e "\t<key>purchaseDate</key>" >>"$WorkDir/iTunesMetadata.plist" #僞造購買時間echo -e "\t<date>2010-08-08T08:08:08Z</date>" >>"$WorkDir/iTunesMetadata.plist"

       僞造iTunesMetadata.plist檔案的時間戳

touch -r "$AppPath/$AppName/Info.plist" "$WorkDir/iTunesMetadata.plist"

        3.mach-O檔案         Lamerpatcher方法中,靠替換mach-O檔案中用于檢測的特征字元串來繞過檢測(題外話:裝置是否越獄也可以通過檢測檔案系統的變化來判斷,上篇文章有講到:http://www.apkbus.com/forum.php?mod=viewthread&tid=214725&extra=

        是以最可靠的方法是根據cryptid的值來确定,為0便是破解版。當檢測出破解版本時注意,為了避免逆向去除檢測函數,需要多處做檢測。同時檢測函數要做加密處理,例如函數名加密,并要在多處進行檢測。        而根據特征值來檢測破解的方法也不是完全沒用的,可以将特征值加密成無意義的字元串,最起碼Lamerpatcher方法就無效了。同樣,檢測函數需要做加密處理,并要在多處進行檢測。         看了破解ipa的原理,你會發現,所有的工具和方法都必須運作在越獄機上,是以将安全問題托付給蘋果,幻想他可以将iOS系統做得無法越獄,他提供的一切安全措施都能生效(例如安全沙箱,代碼簽名,加密,ASLR,non executable memory,stack smashing protection)。這是不可能的,漏洞挖掘大牛門也不吃吃素的,自己的應用還是由自己來守護http://t.cn/RzUn7DF

繼續閱讀