防止tweak依附,App有高招;破解App保護,tweak留一手

來源:互聯網
上載者:User

標籤:

相信大多數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留一手

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.