iOS應用加固--程式碼混淆

Null__發表於2018-08-07
  • 前兩天公司給了一份應用安全的測評報告,報告顯示iOS這邊安全測評得分是60(滿分100),報告出的蠻詳細,列出了危險等級,危害及 建議解決的方法。經評估我暫做了程式碼混淆和動態調式攻擊風險。

程式碼混淆

一、危害

  • 針對 iOS 應用開發使用的 Object-c 及 C,C++程式碼目前較缺乏有效的防護手段, 蘋果的 app 自身並沒有比 android 更安全的防範措施,也無法通過常規的二 次加固保護應用不被反編譯和篡改,應用程式碼編寫過程中出現的安全漏洞、 編碼隱患、甚至業務邏輯上的缺陷很容易被分析暴露,造成程式業務邏輯洩 露、加解密演算法失效、通訊加密失效,攻擊者可以利用這些資訊竊取客戶端 的敏感資料,包括賬號、密碼;繞過業務安全認證流程,直接篡改使用者賬號 資訊;對伺服器介面發起攻擊等。iOS 的程式碼混淆,是通過將 Object- C、C/C++程式碼中的方法名、變數名、類名、包名等這些元素名稱改成毫無關 聯且無意義的名字,對原始碼實現邏輯分支混淆和控制流平坦化,隱藏關鍵邏 輯,提高黑客破解難度,增加破解時間成本。

二、建議解決方案

  • 開發者使用標頭檔案對映的方式定義 pch 檔案,並在定義的 pch 檔案中引入頭 檔案,在標頭檔案中定義方法混淆的隱射,防止程式碼語義化的定義暴露程式意 圖,同時編譯生成新的釋出包

三、實際解決方案

1、cd 專案路徑

2.touch confuse.sh(此檔案中新增混淆指令碼,指令碼在這裡)

3、touch func.list (此檔案中手動新增想要混淆的方法,也可參考這篇文章裡的指令碼進行全域性混淆)

4、分別 mv confuse.sh 和 func.list 到自己的專案目錄下 如:mv confuse.sh 專案路徑

5、設定run script 如下圖

iOS應用加固--程式碼混淆

6、在PCH檔案中新增 #import "codeObfuscation.h"

7、編譯

8、如果需要demo的話,這裡有一個不是我寫的demo

四、以上操作流程各位開發者總結了很多,我在這裡主要說一下自己遇到的坑:

  • 最深的坑就是路徑問題,在念茜的部落格裡看到的是用 mv 命令來移動,在其他部落格中大都記錄的是Add Files...來移動到專案目錄下,我用Add Files...之後就出現了報錯,提示找不到路徑,嘗試了各種相對路徑和絕對路徑後無果,而後用終端mv命令後就一路暢通了,如果你有同樣的問題,建議用mv命令試試。

  • 如果沒有自動生成 codeObfuscation.h 檔案可手動建立,但是注意#ifndef Demo_codeObfuscation_h #define Demo_codeObfuscation_h和指令碼中的echo '#ifndef Demo_codeObfuscation_h相對應。

  • 編譯後報錯 Shell Script Invocation Error 錯誤,可在終端執行 chmod -R 777 XXX 命令, XXX是路徑,表示給XXX路徑下的所有資料夾和檔案都授予讀寫和可執行許可權。

  • func.list檔案中新增方法後如果在codeObfuscation.h 沒有生成相對應的混淆後的程式碼,建議關注一下confuse.sh中HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"此處的路徑。

五、逆向檢視程式碼是否混淆成功

1、下載class-dump 下載地址

2、將dmg檔案裡的class-dump複製到“/usr/local/bin/”下,其他的目錄好像都沒有寫入許可權了。

3、在終端輸入 class-dump檢視是否可正確顯示版本,如下圖

iOS應用加固--程式碼混淆

4、將ipa字尾改成zip並解壓

5、執行命令 class-dump -H Payload路徑/appName.app -o 寫入檔案路徑

6、到這裡程式碼混淆基本上就完成了,可在剛寫入的檔案中找到混淆方法檢視是否是一串亂七八糟的字元。

動態調式攻擊風險

一、危害

  • 在未加入反除錯術的 iOS App 中,攻擊者使可用 GDB、IDA、Ptrace 等除錯 器跟蹤執行的目標程式,檢視記憶體中執行的程式狀態,獲取記憶體程式中的運 行程式碼和實時資料,甚至分析篡改程式的業務邏輯,對客戶關鍵資料或者服 務器進行惡意攻擊,例如檢視客戶端業務操作的資料,比如登入賬號、密碼 等,竊取使用者資訊;或者通過分析程式執行邏輯,挖掘應用漏洞。

二、建議解決方案

  • 在程式碼中的 main.m類中增加如下程式碼,gdb 方式或其他除錯工具注入到當前 程式程式,程式碼如下:

    void anti_gdb_debug() { void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW); ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace"); ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0); dlclose(handle); }

三、實際解決方案

  • 剛好在念茜大佬的部落格看到這篇阻止GDB依附的文章,基本上我也就這樣了,不得不說大佬就是大佬,一系列安全防攻擊總結的全面到位,膜拜。

以上是我在專案中遇到的一些問題,如果能幫到你我很開心,如果沒能幫到你,建議多查一點相關的文件,畢竟實際出現的問題也是千奇百怪。

OVER

相關文章