該方法只能針對(duì)有.m.h的類進(jìn)行混淆鹰霍,靜態(tài)庫(kù)等只有.h文件的沒法進(jìn)行混淆
代碼混淆豹休,剛剛看到是不是有點(diǎn)懵逼镜沽,反正我是最近才接觸到這么個(gè)東西敏晤,因?yàn)橹皩?duì)于代碼和APP,只需要實(shí)現(xiàn)功能就好了缅茉,根本沒有考慮什么安全問(wèn)題嘴脾。
而這一次應(yīng)用交付時(shí),客戶進(jìn)行安全評(píng)估提出一個(gè)問(wèn)題:
使用classdump對(duì)原程序進(jìn)行dump蔬墩,可以dump出所有源程序的函數(shù)所有信息:源程序所有函數(shù)類型译打,變量全部泄露。這樣的話拇颅,讓攻擊者奏司,也就是黑客們了解了程序結(jié)構(gòu)方便逆向。
因?yàn)樵诠こ讨姓敛澹覀冞@些變量或函數(shù)命名都是有一定可讀性的韵洋,例如跟用戶名相關(guān)的,那一般里面會(huì)有 userName黄锤,跟密碼相關(guān)的一般會(huì)有 passWord搪缨,這樣定義也是為了我們自己代碼可讀性更強(qiáng),我們修改的時(shí)候才更加的方便鸵熟。但是我們相信副编,這么個(gè)定義法,我們只是希望方便我們自己流强,我們可不希望方便黑客們?nèi)テ平馕覀兊腁PP齿桃。
那我們先來(lái)看看用這個(gè)所謂的 classdump 對(duì)原程序進(jìn)行 dump惑惶,究竟用 dump 出些什么東西來(lái):
所有的 .h 文件
.h 文件全暴露了,那點(diǎn)開的話短纵,你里面的函數(shù)名带污,屬性名也一樣清清楚楚:
屬性、函數(shù)
驚了個(gè)呆香到,那為了防止這樣全裸鱼冀,這時(shí)候我們就需要用到代碼混淆了。
大概什么個(gè)意思呢悠就?簡(jiǎn)單點(diǎn)講千绪,就是把你的這些個(gè)用戶名和函數(shù)名弄得沒有可讀性,比如你的用戶名的變量名定義為 userName梗脾,那你自己用肯定是正常的荸型,如果黑客們 dump 出來(lái)的這個(gè)變量名會(huì)變成 abcd 或 1234 ,這樣他也就不清楚你這是用來(lái)干嗎的了炸茧。
第一瑞妇、在工程項(xiàng)目路徑中建立一個(gè)confuse.sh、一個(gè)func.list文件
先打開終端梭冠,然后 cd 到你的項(xiàng)目工程路徑下:
cd 到項(xiàng)目工程路徑下
然后創(chuàng)建兩個(gè)文件辕狰,一個(gè) confuse.sh,一個(gè) func.list:
創(chuàng)建兩個(gè)文件
這時(shí)候我們打開這個(gè)工程文件夾控漠,可以看到蔓倍,這兩個(gè)文件已經(jīng)創(chuàng)建好了:
我們創(chuàng)建的兩個(gè)文件
打開工程,把剛才創(chuàng)建的兩個(gè)文件加進(jìn)去盐捷,右鍵你的項(xiàng)目藍(lán)色標(biāo)志偶翅,然后選擇 Add Files to...:
添加到工程中
添加進(jìn)去了:
成功添加
點(diǎn)擊 confuse.sh ,發(fā)現(xiàn)還是空白的碉渡,什么都沒有倒堕,現(xiàn)在要在這上面加上代碼了:
需要添加的代碼
原腳本代碼出自:http://blog.csdn.net/yiyaaixuexi/article/details/29201699
第二、在 .pch 文件中添加代碼
不要跟我說(shuō)你的工程沒有 .pch 文件爆价,如果真沒有,自行百度媳搪,這應(yīng)該算是標(biāo)配铭段,常識(shí)來(lái)的。
ifdef OBJC#import#import//添加混淆作用的頭文件(這個(gè)文件名是腳本confuse.sh中定義的)#import"codeObfuscation.h"#endif
寫到這里秦爆,編譯的時(shí)候是不是發(fā)現(xiàn)報(bào)錯(cuò)啦序愚?剛才的 .pch 文件里面的添加的代碼居然報(bào)錯(cuò)了:
報(bào)錯(cuò)了!
不要慌等限,先把那句報(bào)錯(cuò)的先給注釋掉:
先注釋掉報(bào)錯(cuò)的這一行代碼
然后我們繼續(xù)往下走爸吮!
第三芬膝、配置 Build Phase
1:添加 Run Script
添加 Run Script
2:配置好 Run Script
配置好 Run Script
然后再回到終端,同樣先 cd 到工程目錄下形娇,接著我們要打開剛才 .sh 這個(gè)腳本文件的運(yùn)行權(quán)限锰霜,因?yàn)槟J(rèn)是沒有這個(gè)權(quán)限的,在終端輸入以下指令:
打開運(yùn)行權(quán)限
回車桐早,搞定癣缅,回到我們的工程,先 command + b 編譯一下工程哄酝,然后再把我們剛剛注釋掉的那句代碼解開:
打開剛剛被我們注釋掉的代碼
再次 command + b 編譯友存,現(xiàn)在是不是編譯通過(guò)啦?剛剛報(bào)錯(cuò)的陶衅,現(xiàn)在解決了屡立!
基本上就搞定了,剩下的就是添加上我們想要混淆的變量名或函數(shù)名
第四搀军、在 func.list 文件里膨俐,寫入待混淆的函數(shù)名
如果像下面這幾個(gè)屬性跟函數(shù):
需要混淆的屬性跟函數(shù)名
那么就這在 fun.list 就這么列出來(lái)就好了:
列出需要混淆的
大功告成!現(xiàn)在 command + b 運(yùn)行一下奕巍,然后在哪里看結(jié)果呢吟策,請(qǐng)看這里:
運(yùn)行結(jié)果
可能這么看有點(diǎn)麻煩,那來(lái)個(gè)簡(jiǎn)單一點(diǎn)的:
查看
哈哈的止,你會(huì)發(fā)現(xiàn)檩坚,多了好多宏定義,其實(shí)就是我們剛才的字段來(lái)的:
結(jié)果
當(dāng)然诅福,這也只是最簡(jiǎn)單的代碼混淆而已匾委,APP安全還是有很多需要注意的。一步一步來(lái)吧氓润!