iOS App的加固保護原理

来源:https://www.cnblogs.com/163yun/archive/2018/04/17/8867975.html
-Advertisement-
Play Games

本文從攻防原理層面解析了iOS APP的安全策略。iOS以高安全性著稱,但它並非金剛不壞之身。對於信息安全而言,止大風於青萍之末是上上策,杭研深入各個細節的研發工作,正是網易產品質量的保障。 一、iOS的安全問題 世所公認,iOS系統安全性非常高,很少出現漏洞,幾乎不會中毒的情況。然而隨著各種iOS ...


本文由  網易雲 發佈。

 

本文從攻防原理層面解析了iOS APP的安全策略。iOS以高安全性著稱,但它並非金剛不壞之身。對於信息安全而言,止大風於青萍之末是上上策,杭研深入各個細節的研發工作,正是網易產品質量的保障。

 

一、iOS的安全問題

 

世所公認,iOS系統安全性非常高,很少出現漏洞,幾乎不會中毒的情況。然而隨著各種iOS安全隱患的頻頻出現,人們逐漸認識到,iOS跟Android一樣也面臨嚴重的安全問題。蘋果宣稱所有的iPhone都很安全,不會被惡意軟體攻擊,其實這隻不過蘋果封閉式的系統管理能夠及時處理漏洞罷了,這也正是蘋果不敢開放的原因。

 

我們已經習慣,每個新的iOS系統出來沒多久,就會有大牛找到越獄的方法。比較有名的越獄團隊如iH8Sn0w、Geohot、Comex等,以及國內的盤古團隊。就像最新iOS 10.1.1版本,剛出來一個星期,安全研究員Luca Todesco就在推特上曬圖自曝越獄成功,iH8Sn0w和盤古團隊也取得了不錯的進展。只要越獄了,iPhone手機就處於完全裸奔狀態,很多平時不能做的事情就可以做了,比如破解分析APP、大範圍泄露用戶隱私數據等。

 

其中,跟我們iOS開發者息息相關的問題,主要就是被破解、分析。APP被破解分析進而刷單作弊,或者APP被山寨以次充好等。APP一直以來存在的“山寨”現象,引起越來越多開發者的不滿,山寨泛濫的後果將是劣幣驅逐良幣,打擊創新者的積極性,造成惡性迴圈。

 

下麵舉幾個例子:

  1. 山寨APP

 

比如上面的《神廟逃亡》應用,左邊是合法的,右邊是山寨的,山寨的APP就把圖標的背景色以及局部做了一些修改,看起來和正品是如此的相似。

  1. 微信多開

 

這類APP在淘寶上都有銷售。正常情況,一個手機只能有一個微信賬號線上,但是微信分身版讓用戶可以在同一個手機上同時登錄多個微信號,這樣可以滿足一些用戶的不同需求,比如進行公眾號營銷、用不同的微信號聯繫不同的人等。同時這些破解後的微信還有一鍵轉發小視頻、一鍵評論、一鍵點贊等強大的功能。

  1. 自動搶紅包

 

下麵是一款紅包神器的運行頁面:

 

打開這款神器後再登錄微信,如果微信群里有人發出紅包,它就會第一時間幫你搶到紅包了,從此“發家致富,迎娶白富美,走上人生巔峰”,哈哈!

 

那麼,看起來如此高級的東東又是怎麼實現的呢?下麵我們做簡要的介紹,只有在瞭解了它們的實現原理後,我們才能更好地保護我們的APP不被分析、破解。

 

二、iOS分析方法

 

懂得如何攻擊才會懂得如何防禦,一切都是為了之後的防禦作准備。這裡總結一下為hack而做的準備工作。

2.1常用的命令和工具

 

(1)otool可查看可執行程式都鏈接了哪些庫。

 

(2)nm可以顯示程式符號表。

nm -g DeviceInfo

(3)ldid:iPhoneOS.platform提供的簽名工具。

 

我們自己編譯的程式需要簽上名才能跑在iPhone/iPad上。

 

2.2 class-dump-z

      

     它通常是和Clutch一起使用的,因為APP Store上的APP都是加密過的,需要先解密。Clutch解密後,就可以得到APP的源碼結構,包括資源文件、二進位文件等,下麵以XX新聞APP為例:

      

      “class-dump NewsBoard”,就可以得到應用的類信息,包括函數名,下麵是該APP的一個登陸頁面的頭文件:

 

2.3 IDA等靜態分析工具

       靜態分析iOS APP的工具除了IDA,還有一款強大的工具– Hopper Disassembler,在某些方面,它比IDA更強大。

       上圖顯示,從IDA工具就可以看到該APP使用的一些類名和方法名,進而就可以分析到方法裡面的實現邏輯了。

 

2.4實例

       我們在開發一款SDK的時候,想瞭解下公司外部競品SDK的使用情況,到底有多少APP在集成他們的SDK。那麼,這到底該怎麼做呢?

       去競品那裡打聽?好像不太現實,唯一的辦法就是“自動動手,豐衣足食”。我們從XX助手上獲取一定數量的APP,一般是拉取榜單的數據,比較有意義,然後分析拉到的APP里包含了哪些SDK。當然這得基於概率統計學的原理,獲取足夠多的樣本,比如一萬、十萬都是可以的。那麼又如何從XX助手伺服器拉取這些數據呢?

大家可能都會想到,那就是分析XX助手的網路協議,然後通過代碼模擬網路協議,請求數據,獲取APP,再分析APP的符號。分析網路協議,最簡單的就是網路抓包,但是估計現在很難再有裸奔的網路包了,XX助手確實也沒有明文的網路包,所以只有逆向分析了。值得慶幸的是,它的APP沒有做加固、保護,分析起來就簡單多了。、

 

2.4.1界面分析

我們首先從界面分析程式的大體邏輯結構。

來到XX助手的榜單頁面,使用cycript列印界面佈局:

[[UIApp keyWindow] recursiveDescription].toString()

找到每一個下載控制項,這裡隨便找一個:

通過UITableViewCellContentView這個控制項,找它的包含關係。

 

使用[#0x15baf520 nextResponder]往上找,可以得到:TRTableMultipleViewCell。

TRTableMultipleViewCell分為3列,每一列包含一個TRAppListSubCell,而每個TRAppListSubCell對應一個TRAppInfo對象,猜測這個TRAppInfo就是下載後的數據對象,Hook這個類的方法可以看到:

 

TRAppInfo對應一個App的相關信息,包括下載地址,為了得知這些信息是怎麼初始化的。在-[TRAppInfo setAdsite:]下斷點: b -[TRAppInfo setAdsite:],然後查看調用堆棧:

其中的一個類TRApiServices很像是網路請求的介面。Hook該類的調用輸出,點擊 榜單 ,並有了以下log輸出:

          至此,我們基本確定了我們需要的函數名了。

2.4.2逆向分析

接下來,就是逆向分析getChartsAppListForCountryId和parseGetChartsAppListData這兩個函數了。

        使用IDA工具打開XX助手APP,定位到getChartsAppListForCountryId這個函數:

再進一步去分析”writeBodyHeader”方法以及”getBody”等方法,就可以知道網路請求的發送格式了;要想知道網路數據返回的格式,還得去分析” parseGetChartsAppListData:error”這個方法,一切準備妥當後,就可以下載了。

 

三、iOS加固保護原理

 

從上面的分析來看,我們可以從以下幾個方面來保護我們的APP:

1.字元串混淆

對應用程式中使用到的字元串進行加密,保證源碼被逆向後不能看出字元串的直觀含義。

2.類名、方法名混淆

對應用程式的方法名和方法體進行混淆,保證源碼被逆向後很難明白它的真正功能。

3.程式結構混淆加密

對應用程式邏輯結構進行打亂混排,保證源碼可讀性降到最低。

4.反調試、反註入等一些主動保護策略

這是一些主動保護策略,增大破解者調試、分析APP的門檻。

3.1字元串加密

字元串會暴露APP的很多關鍵信息,攻擊者可以根據界面顯示的字元串,快速找到相關邏輯的處理函數,從而進行分析破解。加密字元串可以增加攻擊者閱讀代碼的難度以及根據字元串靜態搜索的難度。

 

比如一個APP中有如下的一些字元串定義在代碼文件中:

經過加密後,代碼文件變成如下的形式:

裡面已經沒有明文的字元串了,全是用byte的形式保存的,打包生成APP後,他們也就無法直觀的看出實際內容了,這對破解者會造成巨大的難度:

 

3.2符號混淆

 

符號混淆的中心思想是將類名、方法名、變數名替換為無意義符號,提高應用安全性;防止敏感符號被class-dump工具提取,防止IDA Pro等工具反編譯後分析業務代碼。

比如一款混淆後的APP,用IDA等工具打開,如下圖所示:

 

“Labels”欄里,顯示的這些符號,不管是類名還是方法名,誰也看不出來到底什麼意思,這個函數到底是什麼功能,就有點丈二和尚摸不著頭腦的感覺,這就大大增加了破解者分析APP的難度。

 

3.3代碼邏輯混淆

 

代碼邏輯混淆有以下幾個方面的含義:

  1. 對方法體進行混淆,保證源碼被逆向後該部分的代碼有很大的迷惑性,因為有一些垃圾代碼的存在;
  2. 對應用程式邏輯結構進行打亂混排,保證源碼可讀性降到最低,這很容易把破解者帶到溝里去;
  3. 它擁有和原始的代碼一樣的功能,這是最最關鍵的。

混淆前後的對比如下(左邊是原始結構,右邊是混淆後的結構):

下麵以iOS APP中的main函數為例:

它就只有一行有效代碼,包含兩個關鍵函數,已經算最簡單的函數體了,混淆前的彙編代碼如下:

這裡主要包含兩個API的符號: NSStringFromClass、UIApplicationMain。其餘就是一些消息發送以及記憶體管理的相關符號,但如果進行一定的代碼邏輯混淆後,這個結構就會變得大不一樣了。

 

 

 

NSStringFromClass、UIApplicationMain這兩個函數,邏輯結構已經變得非常複雜了,如果一個函數中,包含更多的代碼的話,那這個結構將更加複雜,對破解者來說將是一個很耗時間、精力的過程,一般早早就會放棄分析了。

 

3.4URL編碼加密

對程式中出現的URL進行編碼加密,防止URL被靜態分析。

 

3.5網路傳輸數據加密

對客戶端傳輸數據提供加密方案,防止通過網路介面的攔截獲取數據。

 

3.6主動保護策略

除了上面的一些被動保護方法,我們還可以加入一些主動的防護機制,比如反調試等。

 

iOS平臺下的Anti-Debug方法一般有以下一些:

  1. 檢查進程的狀態是否為 P_TRACED。
  2. 調用ptrace請求來檢查進程是否被調試。由於可能被攻擊者繞過該方法的調用,在應用的多處增加ptrace函數會提高應用的安全性。
  3. 通過sysctl查看信息進程里的標記,判斷自己是否正在被調試。sysctl是用以查詢內核狀態的介面,並允許具備相應許可權的進程設置內核狀態。

 

iOS下的這些方法,相對於Linux下的方法要少很多,例如fork一個子進程,ptrace父進程進行檢測方式不再奏效。而且,要完全防止程式被調試或者被逆向,理論上是不可能的,但可以增加破解者調試的難度。

 

總之,添加以上的一些保護措施後,iOS APP的安全性會獲得很大的增強,大大提高了破解者破解的難度。對於iOS開發者來說,有必要瞭解這些措施,特別是針對一些金融、證券類APP的開發,保護方面的需求比較大,比如國內某知名移動支付工具就添加了一些調試檢測以及反調試的功能。

 

——王桂林

網易杭州研究院信息安全部

2016.12

 

 

瞭解 網易雲 :
網易雲官網:https://www.163yun.com/
新用戶大禮包:https://www.163yun.com/gift
網易雲社區:https://sq.163yun.com/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 效果圖如下: 二級列表附有點擊事件。 1、佈局文件: 此處加了一個自定義的導航RelativeLayout,記得註activity的時候添加 android:theme="@style/Theme.AppCompat.Light.NoActionBar" 去掉自帶的導航。 2、一級列表佈局: 3、二 ...
  • 參考高通文檔: 80 NL239 4_F_PMIC_SW_Driver_Overview_MSM8916.pdf DTS文檔: android\kernel\Documentation\devicetree\bindings\batterydata\batterydata.txt 項目數據節點需要的 ...
  • 在網上看到幾篇不錯的博客,分享和學習一下! Android使用WebView載入網頁 https://blog.csdn.net/tuke_tuke/article/details/51684254 教你怎麼配置Android的AndroidManifest.xml讓你不用重覆新建項目 https: ...
  • 開發文檔 官方開發文檔 開發IDE 官方工具下載 UI組件 WeUI:是一套同微信原生視覺體驗一致的基礎樣式庫,由微信官方設計團隊為微信內網頁和微信小程式量身設計; ZanUI-WeApp:是有贊移動 Web UI 規範 ZanUI 的小程式現實版本,結合了微信的視覺規範 MinUI:是基於微信小程 ...
  • 需要:pod 'YYKit' 在block語句塊中,如果需引用self,而self對象中又持有block對象,就會造成迴圈引用迴圈引用(retain cycle),導致記憶體泄露,比如以下代碼 一般我們是這麼解決的,使用一個__weal修飾的weakSelf變數指向self對象,在block中使用we ...
  • 使用最廣泛的解析XML文檔的方法有兩種,一種基於SAX,另一種基於DOM。SAX解析器是事件驅動型的,在解析時增量地讀取XML文檔,當解析器識別出一個結點的時候會調用相應的委托方法。 參考資料《iOS編程指南》 ...
  • 安卓使用的資料庫是sqlite 創建方式:新建一個類繼承SQLiteOpenHelper 這裡第二個參數:資料庫的名字,第三個參數為結果集(游標)寫成null即可,最後一個參數為資料庫的版本,寫1即可 在MainActivity中新建實例即可創建資料庫: 好的,運行即可創建資料庫成功 接下來看下My ...
  • The Apple Developer Program License Agreement has been updated. In order to access certain membership resources, you must accept the latest license ag ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...