當前位置:
首頁 > 最新 > iOS開發系列-代碼混淆

iOS開發系列-代碼混淆

由於iOS系統的封閉性,相對於安卓來說,iOS開發過程中代碼混淆可能就顯得並不是得非有不可了。但是在安全性(可通過class-dump反編譯暴露出類的方法名)和特殊需求上(例如馬甲包的混淆過審)還是有一定需求的!

此腳本借鑒於kaich/codeobscure。在使用原作者腳本的過程中,發現了一些BUG和不足,比如正則表達式的判斷不準確,生成過多無用的替換宏,需要花費過多時間去人工排錯...

由於本人對python並不是很熟,所以只是在原作者的基礎上作了一些完善修改。

優化內容:

修改正則表達式,更精準地找出關鍵詞。

替換規則更改:隨機字元串==>隨機生成2個單詞拼接。防止蘋果審核過程被誤認加入混淆亂碼。

增加-k選項,通過ignoreKey.txt文件添加需要過濾的關鍵詞,可避免每次生成都要手動刪除部分關鍵詞的麻煩。

增加property關鍵詞、懶載入方法名過濾,減少無用宏的生成。

增加IBAction方法關鍵詞的二次過濾(原腳本存在自定義方法跟IBAction方法重名,無法排除的情況)。


其實插件的實現方式十分簡單,提取用戶編寫的文件中的方法名,使用宏定義將其更換為任意的無規則字元串。但這種方式有一些需要注意的點:

對於系統庫產生的方法名,不可替換;對於系統使用到的關鍵字,也不可以替換;否則會報錯;

Swift混編的項目,Swift中的代碼不可替換;同時Swift調用Objective-C的特定方法名也不可以輕易替換;

第三方庫暴露的頭文件的方法名,不可替換;

根據上面的規則(可能有遺漏),該腳本採用了相對簡單的方法來避免:

只掃描.h和.m文件,只掃描方法名。(對於屬性名,嘗試過掃描,但由於屬性的訪問方式多樣,並不建議做混淆,會產生額外的工作量);

對於系統庫,讓用戶手動指定,這個是可以提取的,直接拿到系統庫的頭文件即可,腳本會自動掃描到所有的系統關鍵字,直接做排除處理。(以iOS11的SDK為例,系統關鍵字約6萬個);

對於Swift代碼,可以直接排除在掃描目錄外;

對於第三方庫,用戶可以手動指定目錄,腳本會自動掃描提取關鍵字,在混淆時避免這些關鍵字。

依據上述原理,基本可以避免多數情況下產生的混淆錯誤;當然,由於各種項目的複雜性,有一些複雜的混淆錯誤無法避免,需要後續手動調整代碼。


clone本倉庫;

你需要安裝python3的運行環境,這個可以使用brew進行安裝,這裡不再贅述。

你首先需要確定以下幾項:

提取一份你當前項目編譯環境的SDK庫頭文件目錄;(Demo中提取了iOS11的SDK頭文件目錄)

你需要混淆的代碼的目錄;

你不需要混淆的代碼的目錄;

你需要提取關鍵字做排除混淆的目錄;(例如Pod倉庫、第三方頭文件)

Swift代碼目錄;(理論上不會掃描替換,可以用於排除橋接文件)

輸出文件目錄;腳本運行後會產生多個log文件,以及最終需要使用到的混淆頭文件;

註:建議目錄使用絕對路徑,相對路徑容易出問題。

確定以上幾項後,找到倉庫根目錄的Confuse.py文件,使用以下命令行模板運行:

註:各參數的意義如下:

(input_dirs):必須,項目需要處理的主要文件所在的目錄

(system_dirs):可選,配置系統Framework文件的目錄,一般用於做排除字典,避免替換系統關鍵字

(exclusive_dirs):可選,用於存放不掃描處理的文件的目錄,比如Swift文件目錄

(clean_dirs):可選,用於存放排除關鍵字的文件的目錄,例如Pods下的目錄,或者靜態庫(頭文件修改後會出錯)

(ignore_key_dir):可選,用於存放需要過濾的key(增加內容)

(output_dir):必須,輸出文件的目錄,用於輸出關鍵字、日誌以及最後生成的混淆頭文件的目錄

運行後會在你指定的輸出目錄下產生一份Confuse.h文件,內容一般如下:

這份文件包含了一堆的宏定義,將需要替換的方法名都替換為了一些隨機的字元串,因為宏定義是全局替換,我們只需要將該文件引入到自己的項目中,並在PCH文件中進行引入即可。

引入該文件後,Command+B測試編譯,如果無法避免而產生編譯錯誤則需要手動調整;由於將所有的替換歸集到了頭文件中了,所以遇到有錯誤的地方嘗試刪除對應宏定義替換信息重新編輯即可。

另外附上一個系統系統庫路徑:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks


了解完原理,接下來用圖文來詳細介紹使用方法:

首先去我的Github上獲取下源代碼資源文件。

註:關鍵文件如下:

最終生成的替換文件就是這個了,該文件里記錄了所有需要混淆的方法名和與之對應的替換字元串

該文件是腳本內容所在,所有實現方法都在這。

該文件下記錄需要過濾的特殊key,每個key換行讀取

開始執行腳本 ,在此腳本內更改路徑


首先需要一個pch文件,至於pch的用法自行百度吧.。

根據自行需求添加特殊到文件內

通過腳本快速執行

終端執行內容大概如下:

生成的混淆文件:

編譯結果:對無參數、無返回值、多參數等方法名完成識別替換。

接下來我們用來反編譯一下:

class-dump -H /Users/wuaming/Library/Developer/Xcode/DerivedData/TMConfuse-becmpkjuhzbzfldtqwaiznqcmmxq/Build/Products/Debug-iphonesimulator/TMConfuse.app -o /Users/wuaming/Desktop/heads

對比結果:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Cocoa開發者社區 的精彩文章:

李笑來:區塊鏈技術終將改變世界,長期樂觀,短期保守
又要跳票!蘋果跨平台應用推遲到2019年問世

TAG:Cocoa開發者社區 |