iOS 如何做才安全--逆向工程 - Reveal、IDA、Hopper、https抓包 等

来源:http://www.cnblogs.com/dahe007/archive/2016/06/03/5546990.html
-Advertisement-
Play Games

iOS應用的安全性 常常被大家忽視。 1、首先,我們可以通過軟體 下載 AppStore的ipa文件(蘋果 把開發者上傳的ipa進行了加殼再放到AppStore中), 得到ipa文件 可以分析APP 里包含的一些資源,如:圖片、plist文件、靜態wap頁、.bundle 等。 所以不要 在plis ...


 

 iOS應用的安全性 常常被大家忽視。

1、首先,我們可以通過軟體 下載 AppStore的ipa文件(蘋果 把開發者上傳的ipa進行了加殼再放到AppStore中),

得到ipa文件 可以分析APP 里包含的一些資源,如:圖片、plist文件、靜態wap頁、.bundle 等。

所以不要 在plist文件、項目中的靜態文件中 存儲關鍵的信息,如果要保存,記得加密(這樣可以增加破解的難度)。

 

2、我們可以用軟體 查看 APP的沙盒,查看裡面存儲的 文件(sqlite、plist(NSUserdefault也會存起來)、圖片等),NSUserdefault 中不要保存關鍵信息,如果要保存,還是加密吧。。sqlite也是這樣子的。

 

3、 用 工具 對加殼的ipa 進行脫殼(越獄手機 直接用PP助手下載的就是 脫殼的ipa),再用IDA、Hopper 進行反編譯,進行分析 ,可以得到 近乎源代碼的 偽代碼。

所以 不要在 代碼的常量 中保存關鍵信息,比如介面通信中 AES加密的密鑰,可以通過介面獲取 這些常量。

如果要保存密鑰,記得加密,這樣可以增加破解的難度。並且密鑰要定期更換。

最好能 進行 代碼混淆,能增加反編譯的難度,當然只是增加了難度,還是能破解的。

 

4、用https也是可以被抓包並解析的,所以網路通信 一定要用自己的加密方式 進行加密。

介面返回的數據 最好也進行 加密。

 

可以這麼說:無論 你怎麼做,理論上都是可以破解的,但是 破解人員也要考慮成本。。

有的銀行的APP,只用了https,通信都不加密,很容易就拿到明文數據了。有的APP里的各種數據都 採用複雜的加密演算法,破解人員看到都煩,去破解這個APP的時間還不如去搞其他的幾個APP。

 

一、ipa文件

1、AppStore里的ipa包 可以通過 iTunes 下載到電腦。iOS8.3以下系統的非越獄的手機上,可以用MAC上的PP助手等軟體,直接把手機上的ipa文件(包含沙盒裡的存儲文件)拷貝到電腦。

如果是越獄手機,都可以用PP助手、itools直接把ipa導出到電腦,並且可以用PP助手、iExplorer、itools這些工具 查看 iOS的系統目錄。

 

MAC上安裝 iExplorer軟體,用iExplorer 可以看到 手機(非越獄也可以) 在 iTunes上備份的內容。

如果你在幫測試美女的手機 調試問題的時候, 在 iTunes上設置 “連接次iPhone時自動同步”(或者點擊 備份到本地電腦),預設該手機上的照片、簡訊等內容都會備份到你的電腦上,用 iExplorer 就可以看到 這位 美女的隱私。

曾經有次不小心看到同事的隱私信息,所以現在都比較註意這塊,避免引發誤會。

 

2、拿到ipa文件後,解壓縮,得到.app文件,右鍵顯示包內容,可以看到裡面的app中的圖片、js、plist、靜態H5頁 等資源。

比如 你要 用微信里的預設表情包,解壓微信的ipa包就可以獲取到。

 

3、iOS的系統目錄和MAC上的都類似(類unix系統)。iOS系統的目錄圖:

 

 

二、沙盒 中的數據

iPhone上 計算器的沙盒:

.app文件:應用程式本身的數據,打包時候的一些資源文件(如:圖片、plist等文件)、可執行文件。這個目錄不會被iTunes同步。

Documents :存儲不可再生 的關鍵數據。不會被iTunes同步

Library:保存配置文件和其他一些文件。NSUserDefault 會存儲到 Library下的Preferences中 的 plist文件中。可以直接打開,所以 也不要在 NSUserDefault 中存一些 關鍵數據,或者 存儲的時候 進行 AES等方式的加密。

Library/Caches可以用來保存可再生的數據,比如網路請求,用戶需要負責刪除對應文件。 

這個目錄(除了Library/Caches外)會被iTunes同步

tmp:臨時文件。不需要的時候,手動將其內文件刪除。(當應用不再運行的時候,系統可能會將此目錄清空。) 
這個目錄不會被iTunes同步

存到沙盒的數據都是不安全的,關鍵數據一定 要做加密存儲。

 

三、Reveal 工具:查看 任意APP 的UI結構

1、不越獄的手機 可以用 Reveal 來查看自己APP的UI結構。不能查看其他APP的UI結構。這裡就不再描述了。

 

 2、越獄手機 上可以查看 任何APP的UI結構。

在越獄的手機上,在 Cydia 搜索並安裝 Reveal Loader,如果搜索不到。就 點下麵的“軟體源”,選擇“BigBoss”,選擇“全部軟體包”,點右邊R的字母,去一個個找到 Reveal Loader,放心吧,你一定能找到的,我用的iOS7.1的系統測試的,沒問題。

安裝完成後,打開“設置”頁面,下拉到最底部,點擊“Reveal”

 

3、點擊 Enabled Applictions 。然後選中 你想分析的APP。

4、確保iOS和OSX在同一個IP網段內。打開想分析的 APP,如果該APP已經啟動,則關閉後再次啟動

5、打開MAC上的 Reveal,選中 左上方列表裡的 APP,比如QQ:

 

6、如果 Reveal 左上方 一直顯示:No Connection。說明iPhone上的 Reveal Loader 沒安裝成功,需要配置一下。

首先從MAC上 用PP助手或 iTools 查看“文件系統(系統)”--》Library文件夾,看 Library文件夾下麵有沒有 RHRevealLoader 文件夾,如果沒有,就 右鍵 新建文件夾,並修改名字為:RHRevealLoader。

在Mac 下打開已經安裝的Reveal,選擇標題欄Help下的Show Reveal Library in Finder  下的 iOS library  選項,將會顯示如下界面:

libReveal.dylib 文件通過PP助手拷貝到剛纔創建的RHRevealLoader文件夾下,就可以了。

 

然後 從手機上打開APP, 再 打開 MAC上的 Reveal 軟體,左上方 就會出來 相關APP的選項。

再發個 淘寶中的天貓模塊吧:

 

 

三、反編譯工具:IDA

從AppStore下載的ipa都是加殼的(蘋果 把開發者上傳的ipa進行了加殼再放到AppStore中),加殼的ipa要先去殼,可以用clutch、dumpdecrypted、使用gdb調試 等解密去殼工具,這個我們後面再說。

如果你有越獄手機,可以直接 從 PP助手上下載ipa包,這個就是 脫殼後的。。

現在 我們先反編譯 自己的APP,通過Xcode打包的APP 都是沒加殼的,可以直接用來反編譯。

 

新建一個項目,在 ViewController 的 viewDidLoad 方法里 加 幾句代碼。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 70, 200, 100)];
    label.text = @"CeShiLabel007";
    label.backgroundColor = [UIColor redColor];
    [self.view addSubview:label];
}

將項目 打包,生成 ipa文件,下麵我們就用IDA分析一下 ipa。

將ipa文件 解壓後 得到.app文件:

 

下載IDA,並打開:

點擊“New”按鈕,選擇剛纔 解壓的 .app文件。一路 點擊“OK”或者“YES” 就可以了。

打開界面後,雙擊左側的 viewDidLoad:

可以看出:代碼中的  "CeShiLabel007" 字元串 完全可以反編譯出來。所以儘量不要在代碼里放一些 關鍵 的數據。可以通過介面來獲取。或者 把 數據進行加密。

從上面的界面中 ,按下鍵盤的F5,可以 把彙編轉成C語言代碼。可讀性很高。。

你如果試了 就發現你的F5不管用啊,那是因為 F5是一個插件Hex-Rays.Decompiler 的快捷鍵,這個插件是收費的、收費的。

 

四、反編譯工具:Hopper Disassembler

下載 Hopper Disassembler軟體。打開ipa解壓的.app。 或者直接 把.app拖進去。

雙擊“viewDidLoad”: 可以看到 彙編代碼, "CeShiLabel007" 字元串、setText方法 等。

 

點擊右上角的 if(a) f(x)圖標:

會彈出 類似源代碼的 偽編碼:

 

 

代碼中可以清楚的看到 處理的邏輯。簡單易懂,和看源代碼沒太大區別。。

下麵 是我從越獄手機的PP助手上下載的 微信 的ipa  進行反編譯,看下裡面的 QQContactInfoViewController 頁面 的 viewDidLoad方法里的代碼 怎麼寫的,

截圖:

 

如果 你把從 AppStore下載的 ipa包直接拖到 IDA或Hopper里,看到的就是亂碼,剛纔已經說過了。AppStore的ipa是加過殼的 。如圖:

 

 

五、抓包-https

Charles 老版本和 新版本 抓取https 的配置 不一樣。。

先看HTTP抓包:

  1. 打開Charles程式
  2. 查看Mac電腦的IP地址,如192.168.1.7
  3. 打開iOS設置,進入當前wifi連接,設置HTTP代理Group,將伺服器填為上一步中獲得的IP,即192.168.1.7,埠填8888
  4. iOS設備打開你要抓包的app進行網路操作
  5. Charles彈出確認框,點擊Allow按鈕即可

HTTPS 老版本抓包:

  1. 下載Charles證書http://www.charlesproxy.com/ssl.zip,解壓後導入到iOS設備中(將crt文件作為郵件附件發給自己,再在iOS設備中點擊附件即可安裝;也可上傳至dropbox之類的網盤,通過safari下載安裝)
  2. 在Charles的工具欄上點擊設置按鈕,選擇Proxy Settings…
  3. 切換到SSL選項卡,選中Enable SSL Proxying
  4. 這一步跟Fiddler不同,Fiddler安裝證書後就可以抓HTTPS網址的包了,Charles 還 需要在上一步的SSL選項卡的Locations表單填寫要抓包的功能變數名稱和埠,點擊Add按鈕,在彈出的表單中Host填寫功能變數名稱,比如填api.instagram.com,Port填443

HTTPS 新版本抓包:

  Charles新版本 的 Proxy Settings 選項里是沒有 SSL選項卡的。在左側的功能變數名稱上點右鍵:Enable SSL Proxying,就可以用了。

 

然後 點擊APP,會看到HTTPS解密的json數據。如果介面返回的數據 本身進行了加密,那你看到的還是亂碼。

 

六、https - iOS 的代碼如何寫

2015年4月末,網爆流行IOS網路通信庫AFNetworking SSL漏洞,影響銀聯、中國銀行、交通銀行在內的2.5萬個IOS應用,我來看下 各種網路寫法對應的問題。

1、信任任何證書。在 AFNetworking 中 定義 allowInvalidCertificates 為true,表示 忽略所有證書。

AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];

manager.securityPolicy.allowInvalidCertificates = YES;

 

這種情況下 用我們上面講的方法,用Charles很容易 破解HTTPS加密的數據。

這種情況,一般是 因為 測試環境 用的不是 CA發的證書,需要忽略掉證書,所以把 allowInvalidCertificates 設為了 true。這個可以用 #ifdef DEBUG 來進行設置。

    #ifdef DEBUG
    manager.securityPolicy.allowInvalidCertificates = YES;
    #endif

 

2、信任證書管理機構(CA)頒發的證書。

CA頒發的證書,據說這類的證書只需50美元就能買到。此類問題出在AFNetworking 2.5.2及之前的版本,是AF的漏洞(詳見新聞)。如果某IOS APP使用了此版本的開源通信庫,在不安全Wifi網路中的,黑客 只要使用CA頒發的證書就可以對該APP的HTTPS加密數據進行監聽或者篡改。

這個需要升級到 AFNetworking 最新版本,正好最新版本也聲明相容IPv6。

 

3、信任合法的證書、伺服器和客戶端雙向認證。

這兩種也都有辦法破解,詳見:Bypassing OpenSSL Certificate Pinning in iOS Appshttp://drops.wooyun.org/tips/7838

 

總結:不要完全信任HTTPS的安全性。任何 的 協議、代碼都是會有漏洞的。。關鍵的數據一定要自己進行加密。

黑客不會 去一個手機一個手機的 把沙盒數據 拿出來 來看每個用戶的數據(黑客也不可能拿到你的手機)。

黑客 最主要的還是通過網路來獲取 他們想要的數據(網路的安全級別是最高的)。如果恰好 你的APP 加密密鑰 明文 保存到了沙盒裡 或者 你的 數據通信 還沒有進行加密,恭喜你,你的數據和裸奔沒啥區別。。

 


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

-Advertisement-
Play Games
更多相關文章
  • AJAX 在現代瀏覽器上寫AJAX主要依靠XMLHttpRequest對象: function success(text) { var textarea = document.getElementById('test-response-text'); textarea.value = text; } ...
  • window window對象不但充當全局作用域,而且表示瀏覽器視窗。 window對象有innerWidth和innerHeight屬性,可以獲取瀏覽器視窗的內部寬度和高度。內部寬高是指除去菜單欄、工具欄、邊框等占位元素後,用於顯示網頁的凈寬高。還有一個outerWidth和outerHeight ...
  • 昨天的《移動 Web 開發技巧》的這篇文章,大家反響不錯,因為這些問題在大家日常寫移動端的頁面時經常遇到的。所以那個文章還是超級實用的,那麼我們今天繼續來分享一下移動端的web開發技巧吧,希望對大家有所幫助。 PS:不要讓小伙伴第一次寫移動端像下麵這位一臉的蒙逼哈哈… … 第一、啟用 WebApp ...
  • 迭代器(iterator)是一個可以順序存取數據集合的對象。其一個典型的API是next方法。該方法獲得序列中的下一個值。 迭代器示例 測試代碼好下: 初步編碼 用上面的測試代碼進行測試 錯誤分析 代碼運行結果並不正確,下麵就對初始的編碼程式進行分析。 這裡的指代錯誤,很像是另一個讓人頭痛的對象th ...
  • 什麼,你現在還在看knockoutjs?這貨都已經落後主流一千年了!趕緊去學Angular、React啊,再不趕緊的話,他們也要變out了哦。身旁的90後小伙伴,嘴裡還塞著山東的狗不理大蒜包,卻依然振振有詞地喋喋不休,一臉真誠。是啊,前端發展太快,那邊前幾年出的框架已是無人問津的半老徐娘,而這邊各種... ...
  • 目錄: TweenMax動畫庫學習(一) TweenMax動畫庫學習(二) 之前在做HTML5移動端開發的時候,用的都是Animate.css,這個插件封裝的的確很好,但是在做一些緩動方面的動畫,它也有一定的不足之處,比如手要寫一個連續的動畫,需要不停的去重覆寫函數,使得代碼嚴重的冗餘,再比如要獲取 ...
  • 完全定製UITabBarViewController 效果 源碼 https://github.com/YouXianMing/iOS-Project-Examples 中的 TotalCustomTabBarController 說明 詳細細節請參考演示項目,定製按鈕需要繼承控制器,在重載buil ...
  • 1.xml activity_main.xml fargment_main.xml list_item_main.xml 2.java MainActivity.java ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...