代碼易讀字符串混淆
混淆分許多思路曹体,比如:
1)花代碼花指令,即隨意往程序中加入迷惑人的代碼指令
2)易讀字符替換
防止class-dump出可讀信息的有效辦法是易讀字符替換
1.首先切換到我們的項(xiàng)目目錄下,我這里是統(tǒng)一放在了Resource文件夾中响牛,創(chuàng)建兩個(gè)文件(圖1):
confuse.sh: 存放混淆的腳本
func.list:? ? ? 需要混淆的方法、變量名
此時(shí)在Resource文件夾中生成了以上兩個(gè)文件,將其導(dǎo)入項(xiàng)目中:
然后打開confuse.sh文件妆兑,添加以下腳本(圖2):
#!/usr/bin/env bash
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
#LSJDemo切換為自己的項(xiàng)目名稱
STRING_SYMBOL_FILE="$PROJECT_DIR/Demo/Resource/func.list"
CONFUSE_FILE="$PROJECT_DIR/Demo"
HEAD_FILE="$PROJECT_DIR/Demo/Resource/codeObfuscation.h"
exportLC_CTYPE=C
#取以.m或.h結(jié)尾的文件以+號(hào)或-號(hào)開頭的行 |去掉所有+號(hào)或-號(hào)|用空格代替符號(hào)|n個(gè)空格跟著<號(hào) 替換成 <號(hào)|開頭不能是IBAction|用空格split字串取第二部分|排序|去重復(fù)|刪除空行|刪掉以init開頭的行>寫進(jìn)func.list
#grep -h -r -I? "^[-+]" $CONFUSE_FILE? --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*$STRING_SYMBOL_FILE
#維護(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 -base6464| tr -cd'a-zA-Z'|head -c16
}
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
2.配置Phases
? ? TARGETS ---> Build Phases ---> Run Script,如(圖3):
在里面添加 $PROJECT_DIR/Demo/Resource/confuse.sh 毛仪,這句命令的意思的應(yīng)用每次啟動(dòng)的時(shí)候搁嗓,都會(huì)先去跑我們confuse.sh 腳本
然后編譯,發(fā)現(xiàn)報(bào)錯(cuò)箱靴,如(圖4):
解決方法:切換到工程目錄下腺逛,輸入命令行 chmod 755 confuse.sh 給我們的腳本本間授權(quán),如(圖5):
此時(shí)衡怀,我們?cè)倬幾g一下項(xiàng)目棍矛,然后在工程目錄下,我們會(huì)多出一個(gè)codeObfuscation.h文件抛杨,如(圖6):
這里面是用來裝混淆前 —> 混淆后的代碼對(duì)比
同樣把這個(gè)文件拉到項(xiàng)目中够委,我們?cè)俳ㄒ粋€(gè)PCH文件來引入這個(gè)文件,那么整個(gè)項(xiàng)目都可以實(shí)現(xiàn)怖现,宏的替換了慨绳。如(圖7):
然后打開PCH文件,導(dǎo)入頭文件真竖,如(圖8):
3.混淆的變量脐雪、方法名:
我想混淆以下變量、方法名恢共,這里我想測(cè)試變量战秋,把腳本文件中的必須是方法的限制去掉了,如(圖9):
那么打開 func.list 文件讨韭,一一把名稱打進(jìn)去脂信,如(圖10):
然后點(diǎn)擊編譯癣蟋,這樣子我們需要混淆的代碼就已經(jīng)混淆成功了。但是也不會(huì)影響到我們的閱讀狰闪。這里是通過宏定義來修改的疯搅,左側(cè)是混淆前,右側(cè)是混淆后埋泵,如(圖11):
注意:
1幔欧、 系統(tǒng)的方法
2、XIB中拖線的控件名
這些都不能用這個(gè)方法混淆丽声,因?yàn)闀?huì)導(dǎo)致運(yùn)行的時(shí)候出錯(cuò)礁蔗。
參考
念茜女神http://blog.csdn.net/yiyaaixuexi/article/details/29201699
附反編譯:
1.1 Class-Dunp 簡(jiǎn)介
Class-Dump是一款可以導(dǎo)出頭文件的命令行工具,改程序用于檢查objective - c運(yùn)行時(shí)信息存儲(chǔ)在Mach-O文件雁社,它生成類的聲明,類別和協(xié)議浴井。
1.2 Class-Dump 下載地址
http://stevenygard.com/projects/class-dump/
1.3 安裝
雙擊.dmg 文件打開,把里面的文件拖到? ? /usr/local/bin? 目錄下霉撵,因?yàn)槭切薷牧讼到y(tǒng)的路徑磺浙,所以需要輸入本機(jī)的密碼,這樣就可以在終端使用 class-dump 命令了徒坡。
1.4 使用
注意這里dump的是應(yīng)用后綴是.app而不是.ipa:
然后打開終端屠缭,輸入命令
class-dump -H XXX.app -o XXX
-H 后面的內(nèi)容為需要dump的 .app 文件路徑
-o 后面的內(nèi)容為輸出的頭文件保存路徑
因?yàn)槲沂潜4娴阶烂娴模缘让顖?zhí)行完成之后崭参,我就可以在桌面上找到Dump這個(gè)名字的文件夾了呵曹,并且里面已經(jīng)裝滿了我們想要的頭文件了:
打開ViewController.h,已經(jīng)是混淆過的代碼了
2.1 什么是Hopper
Hopper Disassembler是Mac上的一款二進(jìn)制反匯編器何暮,基本上滿足了工作上的反匯編的需要奄喂,包括偽代碼以及控制流圖(Control Flow Graph),支持ARM指令集并針對(duì)Objective-C的做了優(yōu)化海洼。
2.2 下載地址
官網(wǎng)地址:https://www.hopperapp.com
2.3 使用
這個(gè)工具的強(qiáng)大之處跨新,在于二進(jìn)制文件在它面前,基本是毫無遮掩的坏逢,所有函數(shù)名域帐,方法名,代碼邏輯結(jié)構(gòu)是整,你都可以一覽無遺肖揣。
鏈接:2.1 什么是Hopper
Hopper Disassembler是Mac上的一款二進(jìn)制反匯編器,基本上滿足了工作上的反匯編的需要浮入,包括偽代碼以及控制流圖(Control Flow Graph)龙优,支持ARM指令集并針對(duì)Objective-C的做了優(yōu)化。
2.2 下載地址
官網(wǎng)地址:https://www.hopperapp.com
2.3 使用
這個(gè)工具的強(qiáng)大之處事秀,在于二進(jìn)制文件在它面前彤断,基本是毫無遮掩的野舶,所有函數(shù)名,方法名宰衙,代碼邏輯結(jié)構(gòu)平道,你都可以一覽無遺。