出于對(duì)自己生產(chǎn)出代碼的尊重,要對(duì)其負(fù)責(zé),保護(hù)她的隱私,不被別人發(fā)現(xiàn)。我們希望在開發(fā)時(shí)一直保留清晰可讀的程序代碼,方便自己。同時(shí),希望編譯出來(lái)的二進(jìn)制包含亂七八糟的混淆后的程序代碼,惡心他人。
不講了,發(fā)現(xiàn)完全控制不住自己,直接上問題。
iOS源碼混淆
- 強(qiáng)項(xiàng)目安全性
使用classdump對(duì)原程序進(jìn)行dump,可以dump出所有源程序的函數(shù)所有信息:源程序所有函數(shù)類型,變量全部泄露。(下期在分享一下如何對(duì)源程序進(jìn)行dump)在安全性的角度來(lái)講,該項(xiàng)目已經(jīng)處于高風(fēng)險(xiǎn)階段了。比如:銀行的客戶端,交易平臺(tái)等等。
首先需要得到兩個(gè)文件 confuse.sh 和 func.list,
1)打開終端:cd -> 你工程的路徑
2)創(chuàng)建兩文件:touch -> confuse.sh and fund.list
-
打開工程加入剛創(chuàng)建好的兩個(gè)文件
addfile.png
- 當(dāng)打開confuse.sh文件,里面并沒有內(nèi)容,里面是一個(gè)腳本文件,在最下面
- 在.pch中添加代碼
#ifdef __OBJC__
#import//添加混淆作用的頭文件
#import"codeObfuscation.h"
#endif
6.添加Run Script
$PROJECT_DIR/confuse.sh

- 添加腳本權(quán)限,confuse.sh這個(gè)腳本默認(rèn)的權(quán)限是關(guān)閉的,打開終端到當(dāng)前文件路徑下,添加命令行$:
chmod 755 confuse.sh
-
現(xiàn)在開始源碼的混淆,打開func.list
func.png
如上圖所示,現(xiàn)在要混淆ViewDragController的方法,將這些方法名稱粘出來(lái)貼到func.list中。如下圖:

OK,這個(gè)時(shí)候已經(jīng)大功告成了,咱們驗(yàn)證一下結(jié)果。

ps:這里有點(diǎn)局限性,大型項(xiàng)目只能對(duì)相對(duì)重要的方法、屬性進(jìn)行混淆,全部混淆工作量很大,當(dāng)然這也是一個(gè)優(yōu)點(diǎn)。
感謝閱讀!?。?/p>
confuse.sh腳本內(nèi)容
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C
#維護(hù)數(shù)據(jù)庫(kù)方便日后作排重
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 "http://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

