IOS馬甲包混淆
轉載註明出處:https://blog.csdn.net/lyzz0612/article/details/80390362
本文只適用於機審 4.3,區分機審和人審請找你們後端或運維看看稽核期間有沒有IP登陸。
1. 機審原理
我們雖然無法得知蘋果實際的機審原理,但從程式設計師的角度還是能分析出一些東西的。
1.1 首先OC和C++程式碼編譯出的二進位制檔案,有點經驗和反編譯過的應該都知道:
刪註釋神馬的是沒用的,因為註釋是不會被編譯進包裡
改類名是靠譜的,因為反編譯出來能看到類名,改掉它顯然是會造成包不一樣
增改函式也是靠譜的,同樣是因為反編譯能看到
改資料夾或者檔名應該是不太靠譜的,編譯的時候會根據路徑來引用查詢,編譯之後應該是根據在包裡的相對記憶體地址來查詢類和函式,跟你編譯時的檔名稱和路徑關係應該不大。不過為了方便和程式碼的統一,更換時可以順便換了。
1.2 然後是一些資原始檔如圖片、音效
路徑和檔名相當可能或者絕對是有用的,可惜修改代價有點高
檔案的md5值以程式設計師的角度來看才是真正區分檔案是否一致的標準,我們有理由相信我們的蘋果同行也用了這個來判斷是否重複。所以一些修改md5值的操作如新增空行、註釋、額外位元組,應該也被考慮加上。
1.3 最後是相似的判定,應該是相似率高於某個值才認為你跟其他的重複了,針對像改資原始檔名這種代價太高的可能暫不考慮的操作,我們只能新增垃圾檔案提高總值來降低重複率了。
2. 混淆方法
2.1 修改類名檔名
先說下手動操作,無非是在xcode上修改檔名類名,然後在可能引用的地方替換類名和檔名(header),要注意的地方是替換的時候要選中匹配大小寫;然後是資料夾名稱跟檔名一樣的時候,可能資料夾名稱也要跟著改名,否則替換之後路徑引用可能找不到。
如果是要指令碼批量操作,那最好先對工程整理下,確保以下幾點能讓指令碼寫的更簡單更可靠:
要修改的類和檔案最好都放到一個資料夾下,萬一搞出事不用東找西找,備份和回滾也簡單一點
類名和檔名儘量帶上字首,這樣修改只替換字首即可,也不太會跟函式名、變數名什麼的重複
最好過一遍把不能修改類名的列出來,比如外面太多地方呼叫的、第三方的類庫。在寫指令碼的時候把他們排除在外
指令碼的話就是遍歷檔案,判斷字首、是否排除在外,修改檔名類名,在其他檔案中查詢替換。用python的話應該不是什麼大問題。一個小技巧是改完後可以替換一下xxx.xcodeproj/project.pbxproj裡的相應字串,這樣xcode開啟工程的時候就不用手動再新增進來。
2.2 新增垃圾函式
OC標頭檔案的宣告必然是在@interface @end之間,實現是在@implementation @end之間,C++的大部分應該是以}結尾,直接在相應的地方插入垃圾函式,模板可以直接寫個HelloWorld輸出個隨機字串。在這一步隨機名稱是個坑,可以去網上找下常見英文單詞,格式化後把太短的、太長的、看著不爽的,最重要的是語言的關鍵字如break,false,if之類的刪掉
2.3新增垃圾類
根據我們猜測的路徑應該是不影響打包的,所以我們可以簡單的把垃圾類檔案都放到同一個資料夾下方便管理,寫好2.2後這一步應該就是順手的事情了 。我不太確定的是如果外部不引用這些垃圾類,編譯之後它們會不會因為太獨立而被檢測認為是垃圾程式碼。所以保險起見,我實現的時候寫了一個單獨的標頭檔案include了所有這些生成的垃圾類,然後在外部include了這個單獨的標頭檔案
2.4修改資源md5值
資原始檔有很多型別,通常來說文字檔案新增隨機數量的空格或空行應該就可以了。圖片的話常見的png和jpg都是有固定的結尾位元組塊的,png是00 00 00 00 49 45 4E 44 AE 42 60 82,jpg是ffd9,用16進位制檢視工具開啟圖片應該能注意到這個規律,也可以參考下常見圖片檔案格式簡析。在結尾位元組塊新增的內容是不會影響圖片本身顯示的,我們可以利用這個來改變圖片的md5值。音效應該也有相應的格式,期待大佬科普下!
2.5建立資源垃圾檔案
跟2.3類似,不過這個最好也隨機下建立資料夾顯得真實點,一些文字檔案是什麼格式都有各自定義,png和jpg的話就隨機寫任意長度的任意字元,最好結尾加上相應的結尾位元組塊,防止2.5後又執行2.4導致出錯。
3. 其他事項
上面的基本都能指令碼自動化執行,完了後工程名最好也在xcode改下;info.plist會被打包進ipa,最好也多加幾個欄位上去;target能改也改下方便識別;scheme關聯到匯出的ipa檔名,不是特別麻煩也順手改掉;包名、啟動頁、圖示應該都是基本的東西不會被忽略。
這些改完之後,希望你自己也不認識它了!
相關工具會慢慢整理到iosMixTools,歡迎大家討論和提Issues。