產品文檔 > 全平臺端安全 > iOS加固保護

頂象iOS加固保護

一、產品簡介

頂象iOS加固保護是頂象基于虛機源碼保護技術,針對iOS平臺推出的下一代加固產品。可以對iOS APP中的可執行文件進行深度混淆、加固,并使用頂象獨創的虛擬機技術對代碼進行加密保護,使用任何工具都無法直接進行逆向、破解。

二、產品功能

目前iOS加固主要包含邏輯混淆、字符串加密、代碼虛擬化保護這三大類功能。通過對下面的代碼片段進行保護來展示各個功能的效果:

source.png

將代碼編譯后拖入IDA Pro中進行分析,可以得到這樣的控制流圖,只有6個代碼塊,且跳轉邏輯簡單,可以很容易地判斷出if-else以及while的特征:

orig_cfg.png

將其反編譯為偽代碼,代碼邏輯及源代碼中使用的字符串均清晰可見,與源代碼結構基本一致,效果如下

orig.png

2.1 代碼邏輯混淆

通過將原始代碼的控制流進行切分、打亂、隱藏,或在函數中插入花指令來實現對代碼的混淆,使代碼邏輯復雜化但不影響原始代碼邏輯。

對代碼進行邏輯混淆保護后,該函數的控制流圖會變得十分復雜,且函數中穿插了大量不會被執行到的無用代碼塊,以及相互間的邏輯跳轉,逆向分析的難度大大增強:

obf_cfg.png

若開啟防反編譯功能,則控制流圖會被完全隱藏,只剩下一個代碼塊,且無法反編譯出有效代碼(如下圖所示),這對于對抗逆向分析工具來說非常有效,包括但不限于(IDA Pro, Hopper Disassembler, Binary Ninja, GHIDRA等)

hcf_cfg.png

hcf.png

2.2 字符串加密

把所有靜態常量字符串(支持C/C++/OC/Swift字符串)進行加密,運行時解密,防止攻擊者通過字符串進行靜態分析,猜測代碼邏輯。

對代碼中的字符串進行加密之后,所有的字符串都被替換為加密的引用,任何反編譯手段均無法看到明文的字符串。你好,世界!,Hello, World!等字符串原本可以被輕易的反編譯出來,但保護之后已經看不到了:

xse.png

2.3 代碼虛擬化

將原始代碼編譯為動態的DX-VM虛擬機指令,運行在DX虛擬機之上,無法被反編譯回可讀的源代碼,任何工具均無法直接反編譯虛擬機指令。

采用代碼虛擬化保護后,對函數進行反編譯將無法看到任何與原代碼相似的內容,函數體中只有對虛擬機子系統的調用:

vmp.png

2.4 防調試

防止通過調試手段分析應用邏輯,開啟防調試功能后,App進程可以有效地阻止各類調試器的調試行為:

xcode_anti_debug.png

三、適用范圍

  • Xcode版本: 9.0 ~ 11.2
  • iOS版本:不限
  • 支持語言:Objective-C(C/C++), Swift
  • 支持格式
    • App類型,僅支持.xcarchive格式,不支持.ipa格式
    • 動態庫類型,僅支持.framework格式,不支持.dylib格式
    • 靜態庫類型,支持.framework.a格式
  • 其他要求
    • Build SettingEnable Bitcode 設置為 YES
    • 使用 Archive 模式編譯以確保Bitcode成功啟用,否則編譯出的文件將只包含bitcode-marker
    • 若無法開啟Bitcode,可使用輔助工具進行處理,詳見五、iOS加固輔助工具 -> 5.2 啟用 bitcode
    • 壓縮后體積在 500M 以內

四、使用指南

4.1 待加固文件準備

  1. 在Xcode左側導航欄,選擇要保護的工程,在Targets列表中,選中要保護的Target

  2. 點擊進入 Build Settings 標簽頁,在 Build Options 一欄找到 Enable Bitcode ,設置為 Yes

    • 注意:需要確保當前要編譯的Target,以及所依賴的所有Target及子工程全部開啟Enable Bitcode

    (自Xcode 7.0版本之后,iOS項目的Bitcode開關默認就已開啟)

    xcode-bitcode.png

  3. 在 Build Settings 中添加自定義配置 HIDE_BITCODE_SYMBOLS = NO,此為建議配置,不強制要求

    xcode-hide-symbols.png

  4. 將編譯目標(Active Scheme)設置為要保護的Target,Device設置為 Generic iOS Device ,并點擊點擊菜單欄 Product -> Archive ,等待Archive完成

    xcode-archive.png

    • 若工程中引入了第三方提供的動、靜態庫,但沒有開啟bitcode,則會導致打包失敗,此時可以使用頂象iOS加固輔助工具(點此下載)強制開啟第三方庫的bitcode,具體操作詳見5.2 啟用 bitcode
  5. Archive完成后:

    • 若要保護的文件類型是App,則在Archive后自動彈出的 Organizer 窗口中,右鍵點擊Archive文件,并選擇Show in Finder

      xcode-archive1.png

      然后在Finder中, 右鍵點擊xcarchive文件,點擊"壓縮…",得到 .zip 格式的壓縮包

      • 如果壓縮包大小超過后臺上傳限制,可以使用頂象iOS加固輔助工具(點此下載)提取加固必需的文件,具體操作詳見5.3 提取 xcarchive
    • 若要保護的文件類型是 framework ,根據編譯日志找到Xcode編譯輸出的路徑

      framework.png

      然后在Finder中定位到該路徑,右鍵點擊.framework文件,點擊"壓縮…",得到 .zip 格式的壓縮包

    • 若要保護的文件類型是 .a 格式的靜態庫,根據編譯日志找到Xcode編譯輸出的路徑

      static_library.png

      該 .a 文件不需要壓縮,直接上傳即可

4.2 上傳加固文件進行加固

  1. 登錄頂象控制臺,并進入iOS加固保護頁面

  2. 選擇加固版本,并點擊立即使用,彈出創建任務窗口

    new_task.png

  3. 根據需要自行調整保護配置

    • 代碼混淆強度:針對單個函數的混淆力度,混淆強度越高越難以破解,同時帶來的性能影響越大,代碼體積增長越明顯,一般情況下不建議使用強力混淆。

    • 代碼混淆比例:隨機選取指定比例的函數/字符串進行混淆/加密,未被選中的函數/字符串則不作處理,此選項可用于平衡安全性和性能、體積的影響。

    • 字符串加密:啟用后會對代碼中所有的字符串進行加密保護,反編譯后無法導出明文字符串。

    • 防調試保護:為App提供運行時防調試能力,防止攻擊者通過調試來動態分析App的邏輯。

    • 虛機保護強度:指代碼虛擬化保護的強度,被保護的代碼將進入虛擬機運行,無法被任何工具反編譯。

    • 加固后開啟Bitcode:指加固后輸出的xcarchive包中,是否需要包含Bitcode,如果需要帶bitcode上架Appstore,請選擇“是”。

      • 開啟后加固后的包中會同時包含二進制代碼及Bitcode,會增大加固包的體積,但是不管開啟與否最終用戶下載到的App體積是相同的。
      • 如果原本工程并未開啟Bitcode,因為需要進行加固才開啟Bitcode,或者不需要帶Bitcode上架,此處建議直接選擇“否”。
    • Xcode版本,請選擇編譯待加固文件所使用的Xcode版本,選擇過低的版本將無法加固,選擇過高的版本則可能導致加固后無法使用。

    • 上傳待加固文件:將第一步中準備的文件(.zip/.a)上傳。

  4. 點擊確定,創建加固任務

4.3 下載加固包

  1. 任務提交成功后,會進入加固等待隊列,后臺加固處理完成后可至任務列表進行下載

    ios-download.png

  2. 下載后得到加固包,格式與源包格式一致,為.zip壓縮包或者.a靜態庫

    • 若上傳的是完整的xcarchive壓縮包,可直接解壓縮,雙擊即可導入到Xcode Organizer中,可在Organizer中進行ipa導出、提交AppStore等后續處理。

    • 如果上傳的壓縮包是通過頂象iOS加固輔助工具提取出來的,則需要使用工具將加固包替換進原xcarchive中,后續導出或者提交AppStore直接對原xcarchive進行操作即可。

  3. 若加固失敗,可點擊任務列表右側"查看失敗原因",查看具體原因。

    ios-fail.png

五、iOS加固輔助工具

5.1 功能簡介

本工具用于輔助使用頂象iOS在線加固系統,常規情況下,用戶無需使用本工具即可進行加固,但在某些特殊情況下需要使用本工具在用戶本地進行一些操作以輔助加固的進行,可以點擊此處下載

本工具包含以下功能,各功能模塊相互獨立,若需要使用其中一個功能,不代表一定需要使用工具中的其他功能。

  • 啟用 bitcode
  • 提取 xcarchive

5.2 啟用 bitcode

5.2.1 功能說明

此功能模塊用于強制開啟第三方庫的bitcode,由于頂象iOS在線加固工具是基于bitcode進行,打包時必須確保Enable Bitcode = YES,打出的包才可以用于加固。若此時工程中存在未開啟bitcode的第三方庫,則會導致打包失敗,提示類似如下信息:

ld: 'xxxxx' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.

ld: bitcode bundle could not be generated because 'xxxxx' was built without full bitcode.

此時可以使用本工具將報錯提示中的第三方庫強制"開啟"bitcode。

使用本工具"開啟bitcode"后并非真的在庫中嵌入了bitcode,而是欺騙xcode令其認為這些庫已經開啟了bitcode,進而可以正常地進行編譯、打包,真實的bitcode必須由源碼生成。

5.2.2 適用場景

  • 工程中以二進制(非源碼)方式引入了第三方庫,且該第三方庫未開啟bitcode
    • 若工程中以源碼方式引入第三方庫,如第三方提供子工程,或者通過Pods/Carthage等依賴管理工具引入了三方庫的源碼,則直接在該庫對應的 Target 的 Build Settings 中找到 Enable Bitcode 設置為 YES 即可,不需要使用本工具進行處理
  • 支持以下格式的第三方庫
    • .framework 格式的靜態庫(Static Library)
    • .framework 格式的動態庫(Dynamic Library)
    • .framework 格式的Object文件(Relocatable Object File)
    • .a 格式的靜態庫(Static Library)
  • 支持處理單個庫文件, 或者指定文件夾,由工具自動搜索并處理文件夾內所有未開啟bitcode的第三方庫

5.2.3 使用說明

  1. 開啟頂象iOS加固輔助工具,并調至 啟用bitcode 選項卡

  2. 在上方輸入框處選擇待處理的文件,可以直接將文件/文件夾拖拽至輸入框中,也可以點擊輸入框在彈出的窗口中進行選擇

  3. 工具會自動判斷輸入的文件是否包含bitcode,若輸入為文件夾,則會自動搜索文件件下的所有動靜態庫,并判斷是否包含bitcode

  4. 點擊“執行”按鈕,將會把所有未開啟bitcode的文件進行處理,”強制”開啟bitcode

5.2.4 注意事項

  1. 被處理的原始原件將會在同一目錄下被備份為.bak文件

  2. 對于動態庫,經過此工具處理后,只是用于欺騙本地Xcode,讓其可以在開啟Bitcode的情況下順利完成打包,但打出的包不能直接用于提交AppStore,若直接提交會收到 Invalid Bundle 的提示,必須先經過頂象加固處理后方可提交。(靜態庫以及Object文件不受此影響)

  3. 使用此工具處理后,在創建加固任務時,請將 加固后開啟bitcode 設置為

5.3 提取 xcarchive

5.3.1 功能說明

此功能模塊用于完成xcarchive的壓縮以及加固文件的替換。頂象iOS在線加固對上傳的文件大小有一定限制,若app體積過大,則xcarchive壓縮后可能會超出此限制,此時可以使用此工具提取加固必須的文件進行壓縮,減小壓縮包體積。待完成加固后,再將下載下來的加固包替換回原始包中。

5.3.2 適用場景

  • 待加固的包為xcarchive格式,且壓縮后體積超出了上傳限制(當前為500M),若未超過限制,則不需要使用本工具。

5.3.3 使用說明

  1. 開啟頂象iOS加固輔助工具,并調至"提取xcarchive"選項卡,按照界面提示依次進行操作

    optimus-extract.png

  2. xcarchive文件 輸入框處選擇待加固的xcarchive文件,可以直接xcarchive文件拖拽至輸入框中,或者點擊輸入框并在彈出的窗口中選擇

  3. 輸出路徑 默認在選擇的xcarchive同一目錄下,點擊 輸出路徑 輸入框,可在彈出的窗口中選擇其他路徑以進行修改

  4. 點擊 提取 按鈕,工具將提取加固必須的文件進行壓縮,保存為上一步中指定的文件

  5. 訪問頂象控制臺,使用上一步提取出的文件進行加固

  6. 完成加固后,將加固包下載至本地,拖拽至 加固文件路徑 輸入框,并點擊 替換 按鈕,加固后的二進制文件將自動替換進原始xcarchive中

5.3.4 注意事項

  1. 替換加固包時,原始xcarchive包若需要保留,需自行備份,或者使用提取出的zip文件再次進行替換即可恢復。

  2. 提取完畢后工具可以先關閉,等加固完成后重新開啟,替換時重新在 xcarchive文件 處選擇之前提取的xcarchive即可

  3. 如果提取后的壓縮包(只包含加固必須的二進制文件)體積仍然超過了最大限制,將無法使用在線加固系統進行加固。

六、常見問題

6.1 什么是Bitcode?

為什么要開啟Bitcode?不開啟Bitcode是否可以加固?

A: Bitcode是一種源代碼被編譯為二進制機器碼過程中的中間表示,它既不是源代碼,也不是機器碼。開啟Bitcode之后,Xcode編譯出的二進制文件中會嵌入Bitcode。Apple在Xcode7中引入了Bitcode機制,并默認將其開啟,通過提交包含Bitcode的ipa,Apple可以在新產品或者新技術發布后,無需開發者參與,即可通過Bitcode對程序進行優化、或者編譯出適用于新產品的應用程序。

頂象的加固技術正是基于Bitcode進行處理,因此需要開啟Bitcode進行打包,不開啟Bitcode無法進行加固。

6.2 開啟Bitcode之后打包失敗

若提示xxx does not contain bitcode 或者 xxx was built without full bitcode

A: 原因是項目中依賴的庫文件沒有開啟bitcode

  • 若報錯的庫文件有對應的源代碼(自己開發的或者是通過Pod等工具引入的第三方庫,在Xcode中存在對應的源代碼及Target),則按照上述方式找到該Target,并開啟bitcode即可

  • 若報錯的庫文件為第三方提供的已經編譯好的二進制文件(沒有源代碼),則需要聯系該第三方提供包含Bitcode的版本。也可以使用頂象iOS加固輔助工具強制開啟,詳見五、iOS加固輔助工具 -> 5.2 啟用 bitcode

  • 若報錯為xxx was built without full bitcode,說明該第三方庫配置了 Enable Bitcode = YES,但并不是以Archive方式打包的,而是本地編譯的Development版本,由于本地編譯、測試過程中并不需要bitcode,因此Xcode在此種場景下只會在二進制文件中添加一個字節的bitcode marker以加快編譯速度。解決方案:聯系該第三方庫的提供方使用Archive方式編譯。也可以使用頂象iOS加固輔助工具強制開啟,詳見五、iOS加固輔助工具 -> 5.2 啟用 bitcode

若提示 -weak_library and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together

A: 在 Other Linker Flags 中找到類似 -weak_library /usr/lib/libxxx.dylib 的配置,改為 -weak-lxxx 的形式,如將 -weak_library /usr/lib/libstdc++.dylib 改為 -weak-lstdc++

6.3 加固對體積的影響

A: 不同的加固參數會帶來不同的體積變化,并且相同的加固配置對于不同的代碼所產生的影響也是不確定的,這取決于代碼自身的復雜程度。以下為基于歷史樣本的統計值,僅供參考。

計算方法為:加固后二進制中__TEXT的大小 / 加固前__TEXT的大小,并非整個二進制文件或者ipa包的體積變化。

類型體積變化
基礎版(限制30%)約2倍
標準版(簡單混淆)約1.5倍
標準版(普通混淆)約2.2倍
標準版(強力混淆)約3.1倍
旗艦版(開啟全部功能)不超過4倍

加固后,__TEXT的大小有可能會超出AppStore限制,具體限制請參閱App Store Connect官方文檔,請根據實際情況合理設置加固參數。

注:從二進制文件整體的角度來看,加固后體積可能會變小,因為加固前二進制文件中同時包含未加固的機器碼和比機器碼大數倍的bitcode,若未勾選加固后開啟bitcode,加固后的二進制文件中將只包含機器碼,bitcode會從二進制中被移除。

6.4 加固輔助工具無法打開

A: 這是由于蘋果的安全機制導致,Mac OSX默認只允許AppStore中下載軟件

  • 若提示“來自身份不明的開發者”,請參考Apple官方指導 打開來自身份不明開發者的應用

  • 若提示“文件已損壞”,請依次打開“系統偏好設置”->“安全性與隱私”->“通用”->“允許從以下位置下載的應用”,選擇“任何來源”,然后再嘗試打開

    • 若沒有“任何來源”,請先在終端中運行sudo spctl --master-disable后,重試
400-8786-123
QQ在線咨詢
在線咨詢
必威体育 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>