標籤:
相信大多數AppStore開發人員在閱讀完《iOS應用逆向工程9》之後,對iOS開發的理解會深入不少。一入侯門深似海,tweak的出現讓各種裸奔App的作者瞬間跪了,自己的App被玩弄於股掌之間,內牛滿面:cry:
但是,一些防護性優秀App的出現,給安全性堪憂的AppStore注入了一針強心劑。他們用到的防護方式處於業界領先地位,值得我們學習:handshake:。如北京時間9月30日更新的美團iOS用戶端4.8.1版3,就能夠強力阻止各種dylib的注入,使得一切tweak均為狗比。下面,小弟就帶大家看看美團是怎麼做到的,而我們又可以通過什麼方式,破解這種防護。
一、下載美團,把玩把玩
下載完成,啟動App之後,ssh到iOS,運行
ps -e
得到輸出
1374 ?? 0:03.53 /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan
好的,拿到了美團的目錄路徑和進程名。下面我們分別嘗試用Cycript注入dylib,和用debugserver來動態調試:
此處應有圖,掛掉了,也找不回來了
嗯……事情變得棘手了:注入dylib和動態調試都失敗了。動態調試失敗,很大的機率是採用了ptrace方法,這裡就不贅述了,網上隨便搜一搜就有很多例子;而dylib注入失敗是大家比較少碰到的情況,我們就從它下手,看看到底發生了什麼。
二、anti-DYLD_INSERT_LIBRARIES
dylib的注入一般是通過DYLD_INSERT_LIBRARIES這個環境變數來實現的,現在dylib連注入都失敗,即其constructor根本未得到執行,說明此行為不是由美團的程式碼完成的,而應該發生在代碼執行前。既然這樣的話,此行為多半是因MachO頭部的某個標註,導致dyld3有意為之的。那麼……
我們直接去看看dyld的原始碼5好了啊!原始碼總共也沒幾行,我們著重看看pruneEnvironmentVariables這個函數,它的注釋寫道:
同時注意到這個switch case:
switch (sRestrictedReason) { case restrictedNot: break; case restrictedBySetGUid: dyld::log("main executable (%s) is setuid or setgid\n", sExecPath); break; case restrictedBySegment: dyld::log("main executable (%s) has __RESTRICT/__restrict section\n", sExecPath); break; case restrictedByEntitlements: dyld::log("main executable (%s) is code signed with entitlements\n", sExecPath); break; }
三種情況下,DYLD_環境變數會被dyld無視,分別是:
1. 可執行檔被setuid或setgid了;
2. 可執行檔含有__RESTRICT/__restrict這個section;
3. 可執行檔被簽了某個entitlements。
其中,因為Apple的審核機制,1和3不能由使用者指定,因此不大可能出現在AppStore App中。為了確保萬無一失,我們簡單驗證一下就好了:
FunMaker-5s:~ root# ls -l /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan-rwxr-xr-x 1 mobile mobile 25340624 Sep 30 10:23 /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan*FunMaker-5s:~ root# ldid -e /var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>FSS9ANCQ68.com.meituan.access</string> <string>FSS9ANCQ68.com.meituan.imeituan</string> </array> <key>com.apple.developer.pass-type-identifiers</key> <array> <string>T3ZLXP4K5B.*</string> </array> <key>application-identifier</key> <string>FSS9ANCQ68.com.meituan.imeituan</string> <key>aps-environment</key> <string>production</string> </dict></plist><?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"> <dict> <key>keychain-access-groups</key> <array> <string>FSS9ANCQ68.com.meituan.access</string> <string>FSS9ANCQ68.com.meituan.imeituan</string> </array> <key>com.apple.developer.pass-type-identifiers</key> <array> <string>T3ZLXP4K5B.*</string> </array> <key>application-identifier</key> <string>FSS9ANCQ68.com.meituan.imeituan</string> <key>aps-environment</key> <string>production</string> </dict></plist>
可以看到,imeituan這個可執行檔既沒有setuid/setgid位,也沒有特殊的entitlements,那麼它含有__RESTRICT/__restrict這個section的可能性激增。至於如何驗證我們的想法,用OSX逆向頂級大牛fG!3的改造版MachOView7看看就好了嘛~
好了,這應該就是美團4.8.1所採用的大殺器了,這種anti-DYLD_INSERT_LIBRARIES的方法,其實早在iOS 7完美越獄時,已經由GeoHot提到過了5:shocked:膜拜!!!
三、anti-anti-DYLD_INSERT_LIBRARIES
既然anti-DYLD_INSERT_LIBRARIES是由__RESTRICT/__restrict實現的,那麼anti-anti-DYLD_INSERT_LIBRARIES自然就等同於anti-RESTRICT/restrict咯!而要anti-RESTRICT/restrict也很簡單,把imeituan這個可執行檔用macvim等二進位編輯器開啟,把所有的__RESTRICT/__restrict字串給重新命名一下就好了,比如:
這樣dyld就找不到__RESTRICT/__restrict,也就不會忽略DYLD_INSERT_LIBRARIES了嘛!
把改過以後的imeituan拷貝回iOS,
snakeninnys-MacBook:~ snakeninny$ scp /Users/snakeninny/imeituan root@192.168.3.3:/var/mobile/Applications/DCDC3F9D-227A-414F-B796-54AA9DB0F39A/imeituan.app/imeituan
因為我們對App的可執行檔進行了靜態patch,其md5值已經改變,所以Apple簽名失效,正常情況下美團App無法啟動。要解決這個問題,很方便,也很慚愧,因為要用到盜版App的利器——AppSync……
在Cydia中搜尋AppSync,安裝並respring後即可禁用iOS的簽名校正。一切就緒後,開啟美團,用Cycript重新測測看:
FunMaker-5s:~ root# cycript -p imeituancy# [UIApp displayIdentifier]@"com.meituan.imeituan"
打完收工~
四、總結
根據我們的分析結果,來一個馬後炮,我們可搜到Sam2的一篇新博文23(關鍵詞“DYLD_INSERT_LIBRARIES __RESTRICT”),講到的正是這個文章所提到的內容。除了更專業更詳細外,他還給出了怎麼用這種機制給自己的App加上防護的方法,完爆我們這種只破壞不保護的猥瑣行徑:huffy:,值得崇拜~!
參考:
1. http://www.samdmarshall.com/blog/blocking_code_injection_on_ios_and_os_x.html23
2. http://geohot.com/e7writeup.html5
3. http://www.opensource.apple.com/source/dyld/dyld-210.2.3/src/dyld.cpp5
4. https://theiphonewiki.com/wiki/Launchd.conf_untether1
防止tweak依附,App有高招;破解App保護,tweak留一手