代碼混淆,項目安全

常見的項目安全實踐一:代碼混淆


一、在項目根目錄下新建confuse.sh 和 gbFunc.list 文件


說明:


confuse.sh 文件在編譯過程中會執行gbFunc.list 用於自動混淆代碼時,存放過濾出來需要混淆的方法名


touch confuse.sh

touch gbFunc.list



二、新建GBConfuse.h


說明:


GBConfuse.h 是在自動混淆代碼時,將會把自動生成的字符串定義成宏,存放在此文件,也便於查看。



注意:需要把.h文件移到項目文件外,因爲放項目文件中,到時被反編譯過來,還是能得到GBConfuse.h裏面的東西的,就能通過比對,得到方法。(後面用class-dump反編譯過來就明白了...)



三、在confuse.sh中添加如下代碼


#!/usr/bin/env bash


TABLENAME=symbols


SYMBOL_DB_FILE="symbols"


#func.list路徑

STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"


#項目文件路徑

CONFUSE_FILE="$PROJECT_DIR/Safedemo"


#Confuse.h路徑

HEAD_FILE="$PROJECT_DIR/GBConfuse.h"


export LC_CTYPE=C


#取以.m或.h結尾的文件以+號或-號開頭的行 |去掉所有+號或-號|用空格代替符號|n個空格跟着<號 替換成 <號|開頭不能是IBAction|用空格split字串取第二部分|排序|去重複|刪除空行|刪掉以init開頭的行>寫進func.list

grep -h -r -I  "^[-+]" $CONFUSE_FILE  --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *^/{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^GBSAFE_/p" >$STRING_SYMBOL_FILE



#維護數據庫方便日後作排重,以下代碼來自念茜的微博

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 GBConfuse_h

#define CodeConfuse' >> $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


需要修改的代碼在於文件路徑:




四、添加 Run Script




五、添加 PCH 文件





六、在ViewController中添加以"GBSAFE_"爲前綴的測試方法



七、測試


運行報錯如下:


原因是.sh文件沒有權限,所以需要去開啓權限。



在confuse.sh文件目錄下,執行命令:


chmod 755 confuse.sh



運行成功!


先打包一個.ipa安裝包進行測試!


先不進行代碼混淆:



把.ipa文件類型改成.zip,解壓得到.app文件



新建Hear文件夾用於保存反編譯後得到的文件:



用class-dump進行反編譯


class-dump -H 要破解的可執行文件路徑 -o 破解後的頭文件存放路徑



得到沒有進行代碼混淆的文件:


可以看到都是項目中一些.h文件,打開可以看到完整的方法名....


然後客戶說測試公司說不安全...


需要進行代碼混淆...



在PCH文件中,引用GBConfuse.h:



重新打包..就可以得到混淆後的.ipa..


下面就是混淆後的結果。





























參考http://www.jianshu.com/p/3a9952aa9ed2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章