花了小半天的時間整了下代碼混淆以及反編譯...看了那么多帖子很多都是講的模糊兩可茫孔,基本都是要在自己去琢磨琢磨巩趁。默默的自己補一篇文章吧亦歉,新手少走點彎路哈须误。
代碼混淆主要就是不讓自己暴露在.h文件中的代碼讓別人隨便看,增加點安全性旭绒。當然鸟妙,還可以遮羞,嘿嘿~代碼風格寫的不好防止被看到挥吵。
1重父、安裝class-dump
先用終端檢測一下是否存在
class-dump
安裝的就不講了,推薦一篇帖子寫的很贊的哈忽匈,class-dump
在本文中主要是用來反編譯房午。
2、創(chuàng)建文件
隨意位置創(chuàng)建一個文件夾丹允,反正最后是需要將整個文件夾添加到工程進去的郭厌。
終端命令:
cd 文件夾路徑
touch confuse.sh //用于存放腳本
touch func.list //用于存放需要混淆的變量或者函數
將文件夾添加到工程,并新建.h文件: codeObfuscation.h
用于存放混淆前后的代碼(宏定義) 以及pch文件:PrefixHeader.pch
注意:有的人喜歡把codeObfuscation.h
雕蔽、PrefixHeader.pch
一次性用終端創(chuàng)建了折柠,但是對應的頭需要另外自己寫個人嫌麻煩,還是比較喜歡直接在工程里面直接創(chuàng)建哈批狐。
配置PrefixHeader.pch
文件:
導入#import "codeObfuscation.h"
扇售,以及設置pch文件的prefixHeader文件路徑
3、confuse.sh腳本
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
#修改成相應的文件路徑
STRING_SYMBOL_FILE="$PROJECT_DIR/Ninety/Confuse/func.list"
#修改成相應的文件路徑
CONFUSE_FILE="$PROJECT_DIR/Ninety"
HEAD_FILE="$PROJECT_DIR/Ninety/Confuse/codeObfuscation.h"
export LC_CTYPE=C
#取以.m或.h結尾的文件以+號或-號開頭的行 |去掉所有+號或-號|用空格代替符號|n個空格跟著<號 替換成 <號|開頭不能是IBAction|用空格split字串取第二部分|排序|去重復|刪除空行|刪掉以init開頭的行>寫進func.list
#注意:需要將zyg換成你自己的函數前綴
#注意:如果需要自動混淆的請加上對應的前綴,如果只是混淆部分的又沒有前綴承冰,請注釋此部分代碼嘱根,否則只會混淆帶有前綴的函數
# 也就是所謂的自動混淆了,如果不需要就請注釋掉巷懈,如果是自動混淆就沒法混淆變量该抒,只能混淆函數
#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 "/^zyg_/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 codeObfuscation_h
#define 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
請注意看腳本的內容,里面的路徑例如func.list
顶燕、codeObfuscation.h
的路徑需要修改成相應自己工程的文件路徑
以及腳本里面凑保,修改codeObfuscation.h
的代碼,也需要修改成相應的文件名
腳本中注意部分#grep請細看那邊的解釋涌攻,有詳細注明所謂的自動混淆欧引、以及混淆變量
注意:如果沒有修改成相應的文件路徑或者文件名的話 在編譯的時候會報錯:***/no such file or dictory
之類的錯誤,反正就是找不到func.list
恳谎、codeObfuscation.h
文件
5芝此、配置confuse.h路徑
配置路徑就看圖吧,如果沒有配置項目沒法編譯直接報錯哈因痛。
當然這邊也需要授權婚苹,下文會講到。
6鸵膏、配置需要混淆的函數或者變量
func.list將需要混淆的函數或者變量放進去膊升,如圖:
7、confuse.sh文件授權
完成以上操作后谭企,發(fā)現編譯或者運行后廓译,報錯(貼個網絡圖,別介意懶得再運行自己的工程):
confuse.sh沒有權限债查,那就給他授權哈非区,打開終端,進入confuse.sh文件夾:
cd 存放confuse.sh的文件夾路徑
ls -l confuse.sh //可以先查看下confuse.sh的權限
chmod a+x confuse.sh // 給權限盹廷,a是指所有人
//chmod 755 confuse.sh 用此命令給權限也是可行的
運行成功后的混淆
看圖征绸,不說話。
當然也可以查看codeObfuscation.h
文件速和,每次運行混淆后的方法名都不一樣
8歹垫、calss-dump反編譯
將需要反編譯的ipa文件解壓(歸檔),獲取到Payload文件夾颠放,顯示包內容找到項目名的文件,如圖:
打開終端:
class-dump -H /Users/zhouyonggui/Desktop/Ninety\ 2018-07-17\ 17-07-43/Payload/Ninety.app/Ninety -o /Users/zhouyonggui/Desktop/Confuse
注意-H
需要大寫 對應的后面是需要反編譯的文件路徑吭敢;-o
需要小寫哈碰凶,后面跟著反編譯后需要存放的文件路徑
總結
總的就講這些吧,demo暫時沒有后面會上次,因為我直接把代碼混淆直接做到項目上欲低,現在懶...就沒弄demo了哈哈辕宏。如果在做代碼混淆的時候有問題可以留言,互相學習哈砾莱。
順便附上參考的連接瑞筐,都寫的很不錯哈,也很類似只是有些沒有說明:
iOS 代碼混淆基本處理
iOS安全攻防(二十三):Objective-C代碼混淆
iOS代碼混淆----自動
iOS代碼混淆
iOS class-dump反編譯和代碼混淆
class-dump最新安裝方法