iOS遊戲安全之IPA破解原理及防禦

Game2遊戲:


文/ Dani Lee

在博客上談過了iOS遊戲的內購安全,存檔安全及內存安全。其實還有一個很氾濫但被視為雞肋的問題,即iOS IPA破解問題,因為國內大多數遊戲靠內購和廣告盈利,遊戲安裝包也只是在早期象徵性的收費,之後就會免費,所以對IPA從只能在購買者設備安裝變成可免費到處安裝並不關注。

破解軟件的問題,其實不僅僅是iOS上,幾乎所有平台上,無論是pc還是移動終端,都是頑疾。可能在中國這塊神奇的國度,大家都習慣用盜版了,並不覺得這是個問題,個人是這麼想,甚至某些盈利性質的公司也這麼想,著名的智能手機門戶網站91.com前不久就宣傳自己平台上盜版全,不花錢。其實這種把盜版軟件當成噱頭的網站很多,當然還沒出現過91這種義正言辭地去宣傳用盜版是白富美,買正版是傻X的公司。大家都是做實誠樣,把最新最受歡迎的盜版應用一一掛在首頁來吸引用戶。同步助手就是這種內有好貨,不要錯過的代表,並且在盜版圈子裡,享有良好的口碑,號稱同步在手,江山我有。

其實iOS破解軟件的問題,既不起源於中國,現階段也沒有發揚光大到稱霸的地位,目前屬於老二,當然很有希望赶超。據統計,全球範圍內,排名前五的破解app分享網站有以下幾家:

1. Apptrack 代表軟件:Crackulous,clutch

破解界的老大哥,出品了多款易用的破解軟件,讓人人都會破解,鼓勵分享破解軟件,破解app共享卡正以恐怖的速度擴充。

2. AppCake代表軟件:CrackNShare

新秀,支持三種語言,中文(難得!)、英文、德文,前景很可觀

3. KulApps 北美

4. iDownloads 俄國

5. iGUI 俄國

以上消息,對於依靠安裝包收費的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 4.0後,apple留了個後門(app給開發者預留的用於測試的沙盒環境),只要在/var/mobile/下建立tdmtanf目錄,就可以繞過installd的簽名校驗,但該沙盒環境會造成沒法進行IAP購買,無法在GameCenter查看遊戲排名和加好友,特徵是進入Game Center會出現SandBox字樣。 AppSync for iOS 4.0 +修復了這一問題。

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設備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工具的最近版本。

代表工具:Clutch(命令行工具)(來自Hackulous)

dissident編寫,Clutch從發佈到現在,是最快的破解工具。 Clutch工具支持繞過ASLR(apple在iOS 4.3中加入ASLR機制)保護和支持Fat Binaries,基於icefireicecrack工具,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

我們可以通過分析這些工具的行為,原理及產生的結果來啟發防禦的方法。

像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的基本信息,例如購買者的appleIDapp購買時間、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/null

echo -e ”t<key>appleId</key>” >> ”$WorkDir/iTunesMetadata.plist” #偽造AppleID

echo -e ”t<string>ChatMauve@apple.com</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文件中用於檢測的特徵字符串來繞過檢測

(題外話:設備是否越獄也可以通過檢測文件系統的變化來判斷,例如常見越獄文件,例如/Application/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylibd)

sed –in-place=.BCK

-e ’s=/Cydia.app=/Czdjb.bpp=g’

-e 's=/private/var/lib/apt=/prjvbtf/vbr/ljb/bpt=g'

-e's=/Applicatd0d0d0ions/deled0d0d0teme.txt=/Bppljcbtd0d0d0jpns/dflfd0d0d0tfmf.txt=g'

-e's=/Appld0d0d0ications/Cd0d0ydid0a.app=/Bppld0d0d0jcbtjpns/Cd0d0zdjd0b.bpp=g'

-e 's=ations/Cyd0d0d0/Applicd0ppd0d0dia.a=btjpns/Czd0d0d0/Bppljcd0ppd0d0djb.b=g'

-e 's=ate/vad0d0/privd0d0d0pt/d0b/ad0r/li=btf/vbd0d0/prjvd0d0d0pt/d0b/bd0r/lj=g'

-e 's=pinchmedia.com=pjnchmfdjb.cpm=g'

-e ’s=admob.com=bdmpb.cpm=g’

-e 's=doubleclick.net=dpvblfcljck.nft=g'

-e 's=googlesyndication.com=gppglfszndjcbtjpn.cpm=g'

-e ’s=flurry.com=flvrrz.cpm=g’

-e ’s=qwapi.com=qwbpj.cpm=g’

-e ’s=mobclix.com=mpbcljx.cpm=g’

-e ’s=http://ad.=http://bd/=g’

-e ’s=http://ads.=http://bds/=g’

-e ’s=http://ads2.=http://bds2/=g’

-e ’s=adwhirl.com=bdwhjrl.cpm=g’

-e ’s=vdopia.com=vdppjb.cpm=g’

“$WorkDir/$AppName/$AppExecCur”

#    “/Applications/Icy.app”

#    “/Applications/SBSettings.app”

#    “/Library/MobileSubstrate”

#    “%si %sg %sn %se %sr %sI %sd %st %sy”

#    “Sig nerId%@%@     ent ity ”

#    “Si  gne rIde    ntity”

偽造Mach-O文件時間戳

touch -r ”$AppPath/$AppName/$AppExec” ”$WorkDir/$AppName/$AppExec”

所以最可靠的方法是根據cryptid的值來確定,為0便是破解版。當檢測出破解版本時注意,為了避免逆向去除檢測函數,需要多處做檢測。同時檢測函數要做加密處理,例如函數名加密,並要在多處進行檢測。

而根據特徵值來檢測破解的方法也不是完全沒用的,可以將特徵值加密成無意義的字符串,最起碼Lamerpatcher方法就無效了。同樣,檢測函數需要做加密處理,並要在多處進行檢測。

看了破解ipa的原理,你會發現,所有的工具和方法都必須運行在越獄機上,因此將安全問題託付給蘋果,幻想他可以將iOS系統做得無法越獄,他提供的一切安全措施都能生效(例如安全沙箱,代碼簽名,加密,ASLR,non executable memory,stack smashing protection)。這是不可能的,漏洞挖掘大牛門也不吃吃素的,自己的應用還是由自己來守護。

目前iOS平台遊戲安全系列已完成3篇

《iOS平台遊戲安全之八門神器內存修改,IAP Free遊戲內購破解的防禦》

《iOS平台遊戲安全之存檔修改與防禦》

《iOS平台遊戲安全之IPA破解原理與防禦》

計劃再寫兩篇

《iOS平台遊戲安全之逆向》

《iOS平台遊戲安全之通信協議安全》

來完成本系列。

———————————————————–補充部分————————————————-

感謝cdteam的huangzhuliang,指出了我文章中錯誤的地方

補充:

iOS 應用軟件保護的問題,除了上文提到的在越獄機上安裝破解軟件外。還有一種,針對非越獄機的方法。

以PP助手和快用蘋果助手為例,不越獄,也可以安裝app store裡的“正版”應用。

我們可以通過逆向PP助手的dll文件,發現其原理是將正版購買相關信息同步到設備上,讓其通過簽名檢查。

具體原理待分析

歡迎交流!

參考:

http://hackulo.us/wiki/

遊戲網誌:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系

Comments are closed.