iOS 代碼混淆

前情

因爲等保2.0中對未作代碼混淆的危險評定爲中級(愛加密自己提供代碼混淆業務),而第三方的加固方案每每是須要收費的。sql

360免費版本須要enable bitcode設置爲YES,有可能和一些第三方庫衝突,所以決定本身來作代碼混淆的事情。
代碼混淆即對app進行代碼混淆加固,提升逆向難度。數據庫

須要注意:蘋果如今不容許進行代碼混淆,過多的混淆會沒法過審bash

原理

代碼編譯階段,將符號(方法名、屬性名等)替換成隨機字符串。
個人作法是利用 #define methodName randomString 來實現方法名替換,由於在編譯階段,randomString 會被直接替換進methodName。markdown

自定義腳本進行混淆

  1. 咱們須要增長三個文件

  • func.list用於存放咱們要替換的方法名
  • codeObfuscation.h中存放着宏定義
  • confuse.sh是關鍵,存放着程序編譯時執行的腳本
  1. 在Build Phases中增長Run Script
$PROJECT_DIR/confuse.sh
複製代碼
  1. 在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
複製代碼
  1. func.list中存放着將要混淆的方法名
funcA
funcB
funcC
複製代碼
  1. codeobfuscation.h自己是一個空的頭文件,當咱們編譯完成後,這個文件中就有了各類宏定義,例如:

獲取符號名

有不少種方法能夠獲取符號名,這裏提供一種思路:
經過 hook UIViewController 的 viewDidLoad: 方法,並增長以下代碼:app

NSLog(@"%@",[NSArray getPropertiesFromClass:[self class]]);
NSLog(@"%@",[NSArray getMethodsFromClass:[self class]]);
複製代碼

注意點

  1. 去重
  2. 混淆後不要上架app store
  3. 沒法對靜態庫進行混淆
  4. 不能對系統方法,屬性等進行混淆

自動代碼混淆

若是咱們所有手動進行混淆,也是一種方法,可是會比較麻煩。dom

自動方法混淆須要提早將咱們要混淆的方法,屬性等增長前綴,例如"kx",而後對.sh腳本進行一些修改,便可完成自動代碼混淆。ui

上文 .sh 文件中,將 grep 的那行註釋放開,便可進行自動混淆。加密

其中spa

sed -n "/^kx_/p"
複製代碼

這行是對以「zd」開頭的方法或屬性進行混淆。code

缺點

若是咱們寫代碼的時候沒有提早給方法或屬性增長前綴,則沒法進行自動方法混淆。

這個時候咱們能夠經過半自動的方式,對一系列的方法進行自動混淆後,再手動增長一些方法或屬性來達到咱們的目的。

寫在後面

代碼混淆如今作的人已經比較少了,其中還有部分公司作這個是爲了提升等保2.0的評分,因此這裏提供一些方案,具體的操做要根據實際狀況來看。

文中若有錯誤,歡迎指出。

相關文章
相關標籤/搜索