iOS代碼混淆
本次更新V1.3.5(2019年11月30日)
1.新增忽略有相同前綴或后綴類名的功能中鼠;
2.新增緩存忽略配置信息功能胯究;
3.新增類名、屬性泼舱、方法混淆只加前綴不改原名功能等缀;
4.優(yōu)化方法混淆、屬性混淆娇昙;
5.刪除獲取開發(fā)語言失敗不能混淆邏輯尺迂;
--------------------------------------分割線--------------------------------------
前言
今天主要想說的是iOS的代碼混淆,為什么想做代碼混淆冒掌?為了APP的安全噪裕,為了防止別人破殼輕易破解我們代碼;還有就是做馬甲包了股毫,我們知道的市場需求很大州疾,但是不能花費過多的精力在開發(fā)上,畢竟只是個馬甲皇拣,沒必要花費太多的成本!
混淆工具
網(wǎng)上搜了一下,開源免費的混淆都在轉(zhuǎn)載的
的混淆方法氧急,或者在念茜的腳本基礎(chǔ)上二次開發(fā)颗胡,大家去看過就知道念茜的這篇博客是在14年寫的,那時我剛做iOS沒多久??吩坝,而且那時候中國區(qū)審核還沒有那么嚴(yán)格毒姨,若果你現(xiàn)在還使用那種方法進(jìn)行混淆,你肯定會收到蘋果的
??钉寝,所以我們還是探索別的混淆方法吧弧呐,不要再挖墳了!
軟件詳情
ZFJObsLib混淆工具全面支持OC與Swift語言開發(fā)的項目!1谴怯伊!
下載地址:
Git地址:https://gitee.com/zfj1128/ZFJObsLib_dmg
教學(xué)視頻:
鏈接:https://pan.baidu.com/s/1pqUkgU8YxSzjqTzpHlAD6g??????? 密碼:9sll
ZFJObsLib軟件的主要界面如下:
混淆日志
混淆的部分日志,混淆的時候回通過import logging自動生成混淆日志《混淆腳本日志.log》判沟,便于開發(fā)者修改部分報錯:
忽略路徑
我們在混淆的時候耿芹,沒必要全部進(jìn)行混淆,特別是第三方庫挪哄,或者Pods管理的第三方庫吧秕;畢竟混淆的越多問題也就越多,所以我添加了混淆忽略文件迹炼,如下圖:
特別說明:多級目錄混淆情況砸彬,如果想忽略的目錄在多個文件夾中有重名的颠毙,比如你想忽略Home下面的Models文件夾,但是在Home文件夾和Mine文件夾都有個Models文件夾,你可以這樣設(shè)置'Home/Models'就OK了砂碉!So Easy!??????
如果想過濾擁有相同前綴的類蛀蜜,比如ZFJ_TouchClass.h/ZFJ_TouchClass.m/ZFJ_MyButton.h/ZFJ_MyButton.m,可以設(shè)置‘ZFJ_+’就可以對以‘ZFJ_’開頭的類進(jìn)行過濾忽略;
如果想過濾擁有相同后綴的類增蹭,比如ZFJName.h/ZFJName.m/ABCName.h/ABCName.h,可以設(shè)置‘+Name’就可以對以‘Name’結(jié)尾的類進(jìn)行過濾忽略滴某。
特別說明
混淆以后肯定會有或多或少的報錯,所以要求使用者必須會iOS開發(fā)技能滋迈,一般報錯都是因為一下幾點:
1.忽略的文件夾中包含了已被混淆的類或者方法霎奢;
2.圖片如果不顯示,可能原因是代碼中圖片名采用的是拼接的饼灿,手動替換一下就可以了幕侠;
3.如果出現(xiàn)項目路徑修改了,但是本地實體路徑?jīng)]有修改赔退,自己手動把本地路徑修改一下橙依;
4.如果項目名含有空格或者其他特殊字符(比如’-‘),一定要先用修改工程名功能把空格或者特殊字符去掉硕旗,再進(jìn)行其他操作4捌铩!漆枚!
以上錯誤都可以在日志文件中找到對應(yīng)的混淆字段创译,然后手動替換上去就行!
-如果是混淆馬甲包墙基,加密字符串可以不要選擇软族,如果項目是自己手動創(chuàng)建,那么修改工程名也可以不需要要2兄啤A⒃摇!
??????下面一定要看??????
a.有很多第一次使用的同學(xué)再問初茶,我設(shè)置了忽略目錄或者忽略文件颗祝,為什么軟件右邊的日志輸出還會有混淆記錄?
b.這是ZFJObsLib自動修改被混淆的東西恼布,比如你混淆了A類螺戳,忽略了B類,但是B類有對A類的引用折汞,所以軟件自動會去B類中修改A類的相關(guān)信息倔幼;但是有的小伙伴認(rèn)為導(dǎo)入的第三方庫修改意義不大,去遍歷查找浪費時間爽待,這樣你可以先把第三方庫刪除了再混淆损同,等混淆結(jié)束以后再導(dǎo)入t娓!揖庄!這個在1.2.6的時候加了一個功能就是讓用戶自己去選擇是否去忽略文件夾或者文件中修改栗菜,具體見軟件功能《自動修改忽略文件夾(Pods必過濾)》!
軟件功能
??????ZFJObsLib有很多功能蹄梢,大家可以根據(jù)自己的實際使用情況自行選擇!??????
在此附上一些過包大佬常用的功能截圖富俄,僅供參考禁炒,這些大佬最牛逼的一周過了五六個:
1.方法混淆
如果混淆了系統(tǒng)的方法,可以在方法過濾里面手動添加需要過濾的方法霍比,本人也統(tǒng)計了上百個常見的系統(tǒng)方法幕袱,但是肯定不能統(tǒng)計全面覆蓋,所以如果遇到?jīng)]有覆蓋的用戶可以手動添加設(shè)置悠瞬!方法過濾功能在主菜單首頁们豌!
2.屬性混淆
如果你的命名和系統(tǒng)屬性相同,導(dǎo)致系統(tǒng)屬性被混淆浅妆,比如屬性字段title和系統(tǒng)的一些控件的title一直望迎,所以在混淆的過程中會把系統(tǒng)的屬性給混淆了,導(dǎo)致報錯凌外,同樣你可以再屬性過濾中添加屬性字段title(我已經(jīng)添加好title這個字段了??)辩尊,所以你遇到其他的情況你可以自己添加!
3.類名混淆
類名混淆也會導(dǎo)致一些和系統(tǒng)重復(fù)康辑,比如你的類名命名為‘TabBarController’摄欲,但是在系統(tǒng)中有一個UITabBarController,所以在類名混淆的時候就會導(dǎo)致混淆出錯,通樣你可以使用類名過濾的功能疮薇,當(dāng)然一般類名混淆基本上是沒錯的胸墙!??????
4.添加垃圾代碼
垃圾代碼的調(diào)用與實現(xiàn)
5.創(chuàng)建垃圾類
詳細(xì)請看:《Python-ZFJObsLib完美生成iOS垃圾代碼》https://zfj1128.blog.csdn.net/article/details/99086206
6.去除注釋
7.敏感詞過濾
過濾博彩類敏感詞
8.修改Hash值
針對項目中的資源文件,我們可以通過修改Hash的方式來進(jìn)行混淆按咒,運行如下:
Tips:已忽略的路徑 === ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/MainWeb_Back_Icon.imageset/fanhui-4.png
Infor:[UPdHash Meg] Old:dd03889c2e8647b9377d08775333557ff11425dd<->New:4a72c7b640882ae436b18868aa021331169db3fa
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/60.png
Infor:[UPdHash Meg] Old:2d73347848d7168c09c48efe28a7ac5a9ec7411b<->New:551483123b5cc2c4c5ff2f5bf876db0d075261a1
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/58.png
Infor:[UPdHash Meg] Old:c0c671fe3707bca8c5accdcadd8aa9f4f1f2726c<->New:d022db1c1f99c263b69bc09c09bc52dd1fa97fb5
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120-1.png
Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:8bbddfbbbed9023e4537e9e6caeed79c88ef8955
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120.png
Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:dcc4b47092bca1d6a6bb6d7bd671a0ef7ce2f4da
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/180.png
Infor:[UPdHash Meg] Old:fee9220dbba52040517a0f77ffe8335e9300a64b<->New:d28a9118e1cf4a2ce9fc2805184ad42e20500c95
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/GUEG_ICON.png
Infor:[UPdHash Meg] Old:07ed6c66ec7d5550bfa1e32b4848687417027c90<->New:fb780d87591cc86dd0fd24cdfa41e76a091ad657
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/80.png
Infor:[UPdHash Meg] Old:ca3b3f61fc4c391515fe895d81360d15ec598049<->New:769ebf182fbb3a3fd69c46c3a595c1669c505f63
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/40.png
Infor:[UPdHash Meg] Old:1bb7908a2ba1295fa69ad476a81003f2f413a3a8<->New:10793e67b27cdf5ad1ee4b9d37aecc62074b8ffc
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/87.png
......等等......
9.加密字符串
編譯前的代碼如下:
- (void)uiConfig{
ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:@"ZFJ1128"];
zfjView.backgroundColor = [UIColor yellowColor];
zfjView.frame = CGRectMake(100, 100, 150, 150);
[zfjView setZFJViewTitleLab];
[zfjView setZFJViewTitleLab:@"aaaaaa"];
[zfjView setZFJViewTitleLab:@"aaa" efg:@"dscvdscsd"];
[zfjView setZFJViewTitleLab:@"ddscvsdv" efg:@"cdsvdfbdf" hijk:@"cdvsvbdsbdfgnfdhnhdg"];
[self.view addSubview:zfjView];
[ZFJView svdsvfdsvfdvbzdfb];
}
編譯后的代碼如下:
- (void)uiConfig{
ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:ZFJ_NSSTRING(((char []) {240, 236, 224, 155, 155, 152, 146, 0}))];
zfjView.backgroundColor = [UIColor yellowColor];
zfjView.frame = CGRectMake(100, 100, 150, 150);
[zfjView setZFJViewTitleLab];
[zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 203, 203, 203, 0}))];
[zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 0})) efg:ZFJ_NSSTRING(((char []) {206, 217, 201, 220, 206, 217, 201, 217, 206, 0}))];
[zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {206, 206, 217, 201, 220, 217, 206, 220, 0})) efg:ZFJ_NSSTRING(((char []) {201, 206, 217, 220, 206, 204, 200, 206, 204, 0})) hijk:ZFJ_NSSTRING(((char []) {201, 206, 220, 217, 220, 200, 206, 217, 200, 206, 204, 205, 196, 204, 206, 194, 196, 194, 206, 205, 0}))];
[self.view addSubview:zfjView];
[ZFJView svdsvfdsvfdvbzdfb];
}
加密混淆反編譯前后Hopper對比如下:
我們可以看到再通過Hopper看不到硬編碼了迟隅!
10.翻新資源名
找到工程中的圖片資源并翻新,然后自動替換代碼中的引用胖齐。
這里如果有圖片加載不出來的情況玻淑,很大可能是你在代碼中引用圖片名是采用字符串拼接的方式,導(dǎo)致資源文件被修改了呀伙,但是代碼中找不到無法修改的情況补履!??
11.混淆工程目錄
??為了保證目錄混淆的準(zhǔn)確性,建議把項目中空的目錄都給刪了剿另;還有一種情況就是沒有引用的文件夾也要刪了箫锤,比如本地有這個目錄但是項目沒有引用贬蛙!??
12.設(shè)置混淆前綴
說明:設(shè)置混淆前綴,一定要點擊保存哦Q柙堋Q糇肌!??????還有就是可以設(shè)置方法混淆的后綴馏臭,如果不設(shè)置默認(rèn)是Fun!
屬性混淆野蝇、類名混淆和方法混淆支持只加前綴不修改原來名字的功能,只需要在設(shè)置的前綴后面加上‘#’就OK了括儒,如下圖:
13.混淆詞庫
ZFJObsLib自帶二十多萬的字典詞庫绕沈,所以不用擔(dān)心代碼重復(fù)問題;如果你覺得取得詞庫單詞目標(biāo)性不強或者無意思帮寻,你可以自定義詞庫乍狐,自定義詞庫解學(xué)視頻如下:
鏈接:https://pan.baidu.com/s/1iBc1U-riqNEgVqbvCx8O7g 密碼:wadz
14.讀取UUID功能 / 翻新項目UUID功能
因為不知道Xcode的UUID詳細(xì)生成規(guī)則,此項功能旨在從其他項目中讀取UUID固逗,方便創(chuàng)建垃圾類和修改UUID使用浅蚪;在混淆的過程中如果使用了創(chuàng)建垃圾類和修改UUID的功能,建議最好使用此功能讀取一個其他項目的UUID烫罩,以達(dá)到更真實的目的惜傲;最好的使用方法是用Xcode新建一個iOS項目,然后自己隨便創(chuàng)建幾個類或者試圖嗡髓,接著再此功能讀取該新建項目的Xcodeproj來獲取UUID操漠;如果在混淆過程中使用到的UUID數(shù)量大于讀取的UUID數(shù)量,則會先緊著讀取的UUID使用饿这,當(dāng)讀取的UUID使用完以后浊伙,ZFJObsLib會自動按照自己的規(guī)則創(chuàng)建UUID(不推薦)!
建議自己用Xcode創(chuàng)建一個項目长捧,多創(chuàng)建幾個類或者試圖進(jìn)行讀认伞!
翻新UUID效果對比圖
15.自定義添加屬性/方法/類名過濾字段
就拿屬性混淆為例串结,在混淆過程成哑子,如果你的屬性命名和系統(tǒng)的一些屬性命名重復(fù)了,導(dǎo)致在混淆的過程中把系統(tǒng)的屬性也給混淆了肌割,導(dǎo)致報錯不能運行卧蜓,所以需要把這樣的屬性給過濾掉,ZFJObsLib也有添加好的一些系統(tǒng)過濾字段把敞,但是考慮的項目的多變性和不可能全部添加弥奸,所以除了軟件自帶的一些過濾字段,用戶也可以自己添加過濾字段奋早,你也可以設(shè)置添加第三庫的屬性字段等等盛霎;方法和類目意義相同赠橙,這里就不做過多贅述了!7哒ā期揪!
16.魔改界面控件(字體)顏色
在審核過程中會審核你界面的UI,如果UI大面積相同肯定也是不行的规个,這里有個黑科技凤薛,是一鍵修改UI控件的背景顏色或者添加背景顏色,也可以修改字體的顏色诞仓!
效果對比如下:
工具箱
ZFJObsLib集成了幾個工具枉侧,這些工具對混淆作用不大,僅供大家方便使用狂芋!
1.爬蟲工具
教學(xué)視頻
資源爬取:鏈接:https://pan.baidu.com/s/1xa9ruF_hMcN49716BJUx2w 密碼:1zpg
節(jié)點爬群┰浴:鏈接:https://pan.baidu.com/s/1ebWWYtjoKkiH9mqakR6EMQ 密碼:cosa
使用截圖
2.圖片壓縮工具
ZFJObsLib集成圖片壓縮工具帜矾,支持一鍵生成iOS開發(fā)三套圖標(biāo),也支持自定義壓縮尺寸屑柔,還可以移除Alpha通道屡萤,轉(zhuǎn)成RGB圖片模式;實現(xiàn)邏輯可參考:https://zfj1128.blog.csdn.net/article/details/94625153
具體如下圖:
3.資源清理工具
在iOS項目開發(fā)的過程中掸宛,如果版本迭代開發(fā)的時間比較長死陆,那么在很多版本開發(fā)以后或者說有多人開發(fā)參與以后,工程中難免有一些垃圾資源唧瘾,未被使用卻占據(jù)著api包的大写胍搿!
這里我通過Python腳本來查找項目中未被使用的圖片饰序、音頻领虹、視頻資源,然后刪除掉求豫;以達(dá)到減小APP包大小的目的塌衰!
詳細(xì)請看:《Python-一鍵查找iOS項目中未使用的圖片、音頻蝠嘉、視頻資源》https://zfj1128.blog.csdn.net/article/details/99290441
混淆示例
這個項目是某位群友提供的swift項目最疆!