這張圖是反編譯后的代碼微峰,圖上可以看到類名和方法名清楚的很,這會(huì)為破解者提供很清晰的流程和思路抒钱,找到相應(yīng)的代碼做些什么蜓肆。
代碼混淆的好處:
1、增加安全性谋币,防破解仗扬,防泄漏,通過(guò)反編譯工具不再能看到代碼裸奔
2蕾额、審核,降低代碼的一致性早芭,遇到的的自然懂
這是兩個(gè)最基本的實(shí)用點(diǎn),本文將從類名混淆這一個(gè)維度講述一些心得凡简,并提供相應(yīng)的混淆工具逼友,混淆中需要做的事情還很多,希望起到拋磚引玉秤涩。
注:1帜乞、本文混淆使用的工具是python腳本,依賴python3環(huán)境筐眷,python環(huán)境為3.7.1黎烈。
2、如果不想了解其中邏輯匀谣,可直接下載腳本照棋,依次執(zhí)行完成后,重新運(yùn)行項(xiàng)目檢查是否順利編譯和運(yùn)行武翎。安裝完python環(huán)境后再命令行輸入python 空格 腳本文件路徑即可執(zhí)行烈炭,例:
python3 /Users/mac/pythonscript.py
3、腳本倉(cāng)庫(kù):https://github.com/360fengdai/obscure_oc.git
4宝恶、腳本實(shí)現(xiàn)語(yǔ)言是Python符隙,混淆測(cè)試代碼是Object-C的類名趴捅,其他語(yǔ)言也是如法炮制,無(wú)有不能用
歡迎提出建議霹疫,共同進(jìn)步拱绑。
核心思路:
第一步:搜索目標(biāo)字符串:
1、最好的方式就是正則表達(dá)式丽蝎,匹配類名生成的地方猎拨,因?yàn)榇藭r(shí)特征比較明顯,例如oc中聲明類@interface ClassA屠阻,@interface在類名前邊就是它的特征红省,由此生成正則表達(dá)式即可,暫時(shí)也沒(méi)有找到更好的方式栏笆。遍歷工程目錄下文件.h和.m文件类腮,指定一些過(guò)濾文件,例如靜態(tài)庫(kù)對(duì)應(yīng)的頭文件蛉加,這種頭文件中聲明的類在.a文件中使用到了,.a文件已不能更改缸逃,所有需要過(guò)濾针饥,再例如framework中的.h中聲明的類,通過(guò)正則表達(dá)式提取出類名需频,生成需要混淆的類名列表
2丁眼、遍歷系統(tǒng)方法庫(kù),掃描系統(tǒng)類名列表昭殉,系統(tǒng)framework默認(rèn)路徑為/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks苞七,遍歷framework下的.h文件執(zhí)行第1步邏輯,提取類名挪丢,生成系統(tǒng)系統(tǒng)類名列表蹂风,生成后可存文件緩存,避免每次都遍歷系統(tǒng)方法庫(kù)乾蓬,腳本庫(kù)中也提供了遍歷系統(tǒng)類名的腳本供參考惠啄。
3、第1步中生成的類名列表任内,刪除其中的系統(tǒng)類名撵渡,注意不能遍歷到就立即刪除,for循環(huán)是迭代器死嗦,立即刪除后可能會(huì)導(dǎo)致內(nèi)存地址變更趋距,之后的for循環(huán)出錯(cuò)或者crash,先用緩存數(shù)組存儲(chǔ)待刪除的索引越除,再按索引大小從大到小排序逆向刪除节腐。
到此即得到了待混淆的目標(biāo)字符串?dāng)?shù)組
第二步:
生成混淆映射表:
待混淆的字符串為key外盯,生成一個(gè)隨機(jī)字符串為value,即混淆后的值铜跑,由此生成映射表即可
{'ClassA':'abcdefg'门怪,'ClassB':'ABCDEFG'...}
第三步 :
使用第二步生成的映射表,遍歷所有目標(biāo)類型文件锅纺,替換所有key為混淆后的value掷空,例如之前的所有使用到類名為ClassA的地方都替換成abcdefg
此步還是不太好做的,需要精確匹配確實(shí)是類名的地方囤锉,還要不匹配例如xxClassAxx這種帶ClassA的字符串坦弟,目前我的做法是匹配類名前后一個(gè)或者多個(gè)字符,因?yàn)轭惷昂蟮淖址厥翘囟ǖ哪承┕俚兀鏾c使用類名生成對(duì)象時(shí)酿傍,
[[ClassA alloc] init]
ClassA前邊需要是[,后邊需要是空格驱入。這就精準(zhǔn)匹配了此種情況的所有類名赤炒,還有其他一些有限的引用方式,如法即可亏较。
腳本做混淆莺褒,沒(méi)有完美的腳本,不同語(yǔ)言的項(xiàng)目需要匹配的規(guī)則都不大一致雪情,但核心思路都一致遵岩,能做出適用自己項(xiàng)目的就可以了。