你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS應用安全(二)代碼混淆基礎

iOS應用安全(二)代碼混淆基礎

編輯:IOS開發綜合

代碼混淆

使用class-dump可以很輕松的獲取程序的所有頭文件,而且如果頭文件沒有加密dump出來,會暴漏程序的很多信息,因為程序的頭文件都是容易讀的,為了使用class-dump 導出的頭文件的可讀性變差,可以對代碼進行混淆

混淆的意思就是將可讀的代碼變成不可讀的,例如:@property(copy, nonatomic) NSString *password; 混淆成 @property(copy, nonatomic) NSString *nRgLSvKPjbgkipPb; password大家都知道是密碼的意思,但是 “nRgLSvKPjbgkipPb”這個東西是個隨機字符串,大家都不知道是什麼意思,這樣做會更加安全一點。


具體操作步驟:

1、在項目的根目錄下新建2個文件,分別為 confuse.sh、func.list,並修改confuse.sh文件的權限

這裡寫圖片描述

2、 新建.pch 文件
注意.pch文件的位置最好要放在 AppName 名字的文件夾下,.pch文件的位置會在confuse.sh中會使用到,如果.pch文件的位置放在其它地方那麼需要修改confuse.sh文件中的某個變量的值

注意.pch文件的路徑需要在Build Settings中配置一下

這裡寫圖片描述

3、 編寫confuse.sh

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C

#維護數據庫方便日後作排重
createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}

insertValue()
{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}

query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}

ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}

rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable

touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE


sqlite3 $SYMBOL_DB_FILE .dump

confuse.sh 文件中定義了三個文件,注意func.list是在項目根目錄下,而HEAD_FILE是在項目根目錄下的項目名稱下的路徑,也就是.pch文件所在的路徑,最好保持 codeObfuscation.h文件的路徑和.pch文件的路徑一致,如果路徑一致,這個shell腳本不用做任何修改

SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"

4、 配置confuse.sh
選中Target—》Build Phases—> + —->New Run Script Phase
然後配置一下confuse.sh的路徑
這裡寫圖片描述

5、 在func.list中配置需要混淆哪些單詞,只有配置了該單詞才會混淆,可以配置多個,一行一個,可以把一些敏感的單詞配置進去

這裡寫圖片描述

6、Command + B 編譯項目,如果正常的話,項目中會多出兩個文件:symbols和 codeObfuscation.h,然後將codeObfuscation.h文件導入的.pch中
這裡寫圖片描述

這裡寫圖片描述

7、然後Command + B 編譯項目,可以在Report navigator中看到一下內容,可以看到腳本中為func.list中的每個單詞生成一個隨機字符串

這裡寫圖片描述

8、 項目混淆好了,可以使用class-dump來測試一下
剛以開始使用class-dump -H ClassDumpTest.app/ -o 文件輸出路徑 這個命名看到沒有混淆成功,後來找到ClassDumpTest.app文件所在目錄手動刪掉該文件,重新編譯一下,使用了這個命令: class-dump -S -s -H ClassDumpTest.app/ -o /Users/macmini/Desktop/ClassDumpTest333 結果混淆成功了,後來又試了一下第一個命令,結果也能混淆成功
這裡寫圖片描述

這裡寫圖片描述


該示例混淆的原理是:編譯時執行confuse.sh腳本,為func.list中的每個單詞生產一個宏並寫入到codeObfuscation.h 這個頭文件中,然後將func.list中的每個單詞都用對應的宏替換

這裡寫圖片描述


經過測試,使用class-dump 並不會導出codeObfuscation.h頭文件

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved