轉【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

 

        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

 

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章