因爲等保2.0中對未作代碼混淆的危險評定爲中級(愛加密自己提供代碼混淆業務),而第三方的加固方案每每是須要收費的。sql
360免費版本須要enable bitcode設置爲YES,有可能和一些第三方庫衝突,所以決定本身來作代碼混淆的事情。
代碼混淆即對app進行代碼混淆加固,提升逆向難度。數據庫
須要注意:蘋果如今不容許進行代碼混淆,過多的混淆會沒法過審bash
代碼編譯階段,將符號(方法名、屬性名等)替換成隨機字符串。
個人作法是利用 #define methodName randomString 來實現方法名替換,由於在編譯階段,randomString 會被直接替換進methodName。markdown
$PROJECT_DIR/confuse.sh
複製代碼
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/func.list"
HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
####這裏是全局混淆要查找的內容路徑,不須要全局混淆的時候要註釋掉
CONFUSE_FILE="$PROJECT_DIR/ProjectName"
export LC_CTYPE=C
####這裏是全局混淆要查找的條件,不須要全局混淆的時候要註釋掉
#取以.m或.h結尾的文件以+號或-號開頭的行 |去掉全部+號或-號|用空格代替符號|n個空格跟着<號 替換成 <號|開頭不能是IBAction|用空格split字串取第二部分|排序|去重複|刪除空行|刪掉以init開頭的行>寫進func.list
## |sed -n "/^sk_/p" 是特定問方法名的開頭,不須要的話能夠刪掉
#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 "/^IS_/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 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
複製代碼
funcA
funcB
funcC
複製代碼
有不少種方法能夠獲取符號名,這裏提供一種思路:
經過 hook UIViewController 的 viewDidLoad: 方法,並增長以下代碼:app
NSLog(@"%@",[NSArray getPropertiesFromClass:[self class]]);
NSLog(@"%@",[NSArray getMethodsFromClass:[self class]]);
複製代碼
若是咱們所有手動進行混淆,也是一種方法,可是會比較麻煩。dom
自動方法混淆須要提早將咱們要混淆的方法,屬性等增長前綴,例如"kx",而後對.sh腳本進行一些修改,便可完成自動代碼混淆。ui
上文 .sh 文件中,將 grep 的那行註釋放開,便可進行自動混淆。加密
其中spa
sed -n "/^kx_/p"
複製代碼
這行是對以「zd」開頭的方法或屬性進行混淆。code
若是咱們寫代碼的時候沒有提早給方法或屬性增長前綴,則沒法進行自動方法混淆。
這個時候咱們能夠經過半自動的方式,對一系列的方法進行自動混淆後,再手動增長一些方法或屬性來達到咱們的目的。
代碼混淆如今作的人已經比較少了,其中還有部分公司作這個是爲了提升等保2.0的評分,因此這裏提供一些方案,具體的操做要根據實際狀況來看。
文中若有錯誤,歡迎指出。