開發與維運

iOS混淆工具探索

1593768128247-016fe60b-8853-48fb-8b76-f9f702b83db5.png

中文 | English

前言

機緣巧合偶遇iOS馬甲包業務,前期也使用過目前市面上其他得工具,實際效果不太理想。經過大量實踐,開發出一款功能齊全的混淆工具。工具的主要功能OC、C++、Swift已封裝成Mac應用,其他功能還在封裝中,敬請期待。

提示

為了讓大家快速上手及對比混淆效果,新建了測試工程confuse_test,大家在實際使用過程中如果遇到問題,歡迎擴展測試工程,請在工程中請註明bug細節,有獎勵。

1.2.0之前的老版本說明:
簡介:不涉及語法及編譯要求,但是混淆後可能出現局部漏改或者改錯,請自行添加至黑名單過濾。
適用項目:RN等還未適配的混合項目。
使用條件:暫時沒法使用,後期重新開放

自述

馬甲包的本質:

  1. 階段一減低重複率 ,本人開發初期的版本和目前市面上的其它工具基本相似,主要是‘名稱’全局替換這一個基本的功能
  2. 階段二減少相似度(相同元素的正態分佈),目前該工具經過優化及不斷重構已經有了很大的改善,目前基本符合這方面要求,詳情見以下功能介紹。事物都有兩面性,功能越強大混淆耗時越長,如果你的項目很大,混淆幾個小時也是有可能的,請不要見怪,後續持續優化中。

區分工具優劣

其實識別一個工具的優劣,只需看看以下幾點:

  1. 能否修改所有的屬性、方法,及方法的所有參數名
  2. 修改成員(屬性、方法)名稱,能否按類區分,還是簡單的全局替換
  3. 帶block的參數的方法,典型的網絡請求

例如:+ (BOOL)post:(NSString )url parameters:(NSDictionary )parameters success:(HttpRequestResponse)success error:(HttpRequestResponse)error;

  1. 方法名和屬性名改後的名字的長短(本工具能夠保證60~80%的改後名稱是常見的一個單詞,例如:name、title等且保證不與系統衝突,完全摒棄簡單的靠大量單詞庫堆砌以保證命名的唯一性的做法,真正模擬人工開發)
  2. 修改佈局(Frame、Masonry、SDAutoLayout)
  3. 插入的是代碼還是‘垃圾’(本工具通過封裝網絡請求,創建自定義控件,文件之間使用MVC模式關聯,徹底告別‘垃圾’,實現以假亂真)。
  4. 更別說“還有誰...”能識別宏、區分繼承鏈等上下文關聯內容,智能識別不可修改部分

例如:+ (void)init;- (void)reloadData;基本能改,做到的有幾個呢?”

  1. 正常項目(或者第三方庫)混淆完基本不報錯(除了一些個別語法不嚴謹造成混淆後報錯)

也歡迎大家使用不同工具混淆測試工程confuse_test或者第三方開源庫項目,對比效果。

功能

confuse是一款混淆工具,儘可能模擬人工開發,仿照Xcode部分功能,避免機核4.3、2.1、2.3.1、賬號調查等。
目標:模擬人工修改一切能改的地方,這也是為什麼本工具只有黑名單沒有白名單的原因
詳細功能如下(基本功能不做描述,詳見其他工具):

已完成

以下功能均支持:

  1. 黑名單(二級)過濾,自由控制每個功能的混淆內容,幾乎適應所有項目。
  2. 混淆百分比控制,可以結合自己項目的實際需求,自由調整
  3. 智能名詞替換:

    1. 重命名時使用關聯類型已有信息+相近語義+類型+部分舊詞彙等組合,並且過濾敏感詞彙,同時用戶也可以自定義敏感詞,棄用‘隨機單詞無腦組合’
    2. 異類同名成員->異類異名成員,異類異名成員->異類同名成員,模擬正常開發。成員指的是方法、屬性、函數
  4. 智能識別不可修改部分:通過類型及繼承鏈方式識別系統、第三方、Pod方法,並不是‘簡單’的相等判斷,例如:

    1. 類方法:+ (void)init;原則上任何地方都能改
    2. 對象方法:- (void)reloadData;不是UITableView的子類是可以改的
    3. 屬性:@property (readonly) NSUInteger length;如果不是NSString的子類也是可以改的

通用部分

  1. [項目配置],只要選擇項目路徑,自動完成其他默認配置

    1. 全局設置‘忽略路徑’,支持正則,配合黑名單使用更佳
    2. ‘xcodeproj’設置,針對多xcodeproj項目和xx.xcodeproj不在項目根目錄的情況
    3. ‘Scheme’混淆,與Xcode保持一致
    4. ‘Debug模式’,可在源文件中查看修改前後對比,避免文件名修改後或者大的改動導致git對比困難
    5. ‘參考項目根路徑’設置,讀取參考項目的單詞、UUID
    6. ‘敏感詞’過濾
    7. 版本迭代混淆’,過審後迭代更新,沿用上一次(也可以任意選擇版本)混淆記錄增量混淆,保持版本連續性,模擬正常開發。優勢:做到開發和混淆同步且各自獨立。目前主要功能均支持更新混淆
  2. [殺病毒],Xcode中毒,XCSSET Malware

    1. ‘UUID後綴’,病毒會隨機插入UUID,會帶有固定後綴,正則掃描
    2. ‘腳本路徑特徵’,病毒編譯前會執行一個可疑腳本,支持正則掃描
    3. ‘運行腳本代碼標誌’,病毒編譯前會執行一個可疑腳本代碼,支持正則掃描
  3. [資源替換],混淆前指定需要替換的資源文件夾,自動進行同名文件替換,方便快捷
  4. [修改圖片],質量修改、大小偏移、局部像素微調、RGBA偏移、模式修改(支持熱更新)
  5. [修改文件屬性],如創建時間、訪問時間、修改時間
  6. [修改項目],無需刪除Cocoapods

    1. 可設置‘修改uuid’,徹底翻新
    2. 自定義‘修改target’名稱,相關聯信息同步更新
  7. 自動備份源碼

Objective-C

  1. [刪除註釋],可‘保留空格’‘保留pragma’設置,利於測試階段查看
  2. [重命名圖片],智能名詞替換,自動糾正圖片名和xcassets文件夾名不對應的情況

    1. 可設置‘運行拼接名稱’,用於運行時通過字符串拼接生成的圖片名
    2. 可設置‘重命名關聯字符串,用於修改字符串與圖片名相等的情況
    3. 可設置‘忽略危險名稱’開關
  3. [插入圖片],自動插入圖片,同時根據上下文及類型模擬人工調用,可指定插入個數
  4. [重命名屬性],支持@property的所有類型,優勢:

    1. 識別語法,識別類型、繼承關係,屬性名混淆和類名(包含繼承鏈)關聯,自動識別系統屬性
    2. 可設置文件名Model後綴過濾
  5. [插入屬性],創建、賦值、修改都關聯已有類型,智能名詞替換

    1. ‘百分比控制’
    2. ‘Model後綴’開關,目的:避免Model歸檔或者數據轉模型失敗
    3. 可多次執行,指數x2遞增
  6. [重命名方法],近似Xcode的Rename功能,優勢:

    1. 語法相關,識別類型、繼承關係,支持多參修改,方法名混淆和類名(包含繼承鏈)及類型關聯,自動識別系統方法
  7. [插入方法],插入並調用上下文關聯方法,告別“垃圾代碼”,優勢:

    1. 根據方法的返回值類型,在分類中創建相應的方法。同時封裝原方法的返回值並利用(局部變量、屬性、形參)調用。
    2. 可多次執行,指數x2遞增
  8. [修改方法],模擬人工封裝調用,優勢:

    1. 對原方法進行拆分調用並根據參數類型(支持繼承)局部調整,詳情見支持參數類型彙總表
    2. 可多次執行,指數x2遞增
  9. [重命名全局變量],智能名詞替換
  10. [修改全局變量],替換全局變量名、全局變量轉化為全局函數、混淆字符串變量值
  11. [插入局部變量],單行復合調用變為簡單多行調用,改變執行順序
  12. [修改局部變量],模擬人工封裝調用,變量名關聯類型,優勢:

    1. 局部變量值運行時保持不變,詳情見支持類型彙總表
    2. 可多次執行,指數x2遞增
  13. [重命名多語言],對直接或間接使用系統方法NSLocalizedStringNSLocalizedStringFromTable的多語言進行修改
  14. [修改字符串],支持任意字符串,加密處理(硬編碼->內存),原始字符串保留在註釋中方便檢查

    1. 設置‘最少長度’過濾
    2. 也可設置‘有效個數’搭配使用
  15. [修改xib、storyboard],自動插入視圖,並修改內部結構屬性
  16. [修改字體],對項目中使用的字體隨機微調,識別宏
  17. [修改顏色],對項目中UI控件顏色隨機偏移,識別宏
  18. [UI佈局偏移],支持Frame、Mansonry、SDAutoLayout常見佈局微調
  19. [插入文件],生成其它文件(封裝網絡請求,創建自定義控件,模擬正常開發),項目中自動調用;注意:(在項目根路徑下,會生成"other_xxx_file"的文件夾,子選項Target控制導入方式,若為空,則需要手動導入,將生成的文件夾拖入工程即可;反之,自動導入)
  20. [插入文本],生成json、txt、doc、plist等文本文件,項目中自動調用;注意:(在項目根路徑下,會生成"other_xxx_text"的文件夾,生成的文件會自動導入
  21. [重命名類],類名不限制(例如:my、My),可指定添加前綴,優勢:

    1. 智能名詞替換
    2. 可設置‘重命名同名文件’
    3. 可設置‘重命名相似字符串’,(忽略|相等|包含)三種設置
    4. 新增‘糾正非標準點語法’,針對非標準的點語法調用(方法當做屬性調用)

C++

  1. [重命名屬性],支持所有類型屬性,識別語法,識別類型、繼承
  2. [插入屬性],插入屬性(成員變量)並相互調用修改,自動初始化、銷燬、並在其他方法中賦值修改等類似人工操作,支持‘百分比控制’
  3. [重命名方法],近似Xcode的Rename功能,識別類型、模板、重載、重寫、繼承等關係
  4. [修改方法],利用重載技術修改函數原型並調用修改形參
  5. [修改字符串],支持任意字符串,加密處理(硬編碼->內存),原始字符串保留在註釋中方便檢查

    1. 設置‘最少長度’過濾
    2. 也可設置‘有效個數’搭配使用
  6. [重命名類],支持模板等類型

    1. 可切換舊模式
    2. 前綴設置
    3. 可設置‘重命名同名文件’

Cocos2d-x

該部分功能整合至C++中,支持cocos2dx自動過濾

Swift

適配Swift5.3,SPM包管理項目暫未測試

  1. 新增Swift[重命名圖片],智能名詞替換,自動糾正圖片名和xcassets文件夾名不對應的情況

    1. 可設置‘運行拼接名稱’,用於運行時通過字符串拼接生成的圖片名
    2. 可設置‘忽略危險名稱’開關
  2. [重命名屬性],基本功能,不做過多描述,優勢:

    1. 類似OC[重命名屬性],識別繼承鏈及嵌套類型,支持存儲和計算屬性、觀察器、包裝器、類屬性
    2. 可設置文件名Model後綴過濾
  3. [重命名方法],基本功能改名字類似其他工具,不做過多描述,優勢:識別繼承鏈嵌套類型,支持(class、struct、enum)的靜態方法和實例方法,及可選鏈等
  4. [修改方法],利用重載技術修改函數原型並調用修改形參
  5. [修改字符串],識別單行、多行、字符串插值、及擴展字符串,改後由加密和拆分字符組等多種方式自由組合,並保留原有字符的註釋,方便檢查

    1. 設置‘最少長度’過濾
    2. 也可設置‘有效個數’搭配使用
  6. [重命名類],類名不限制(例如:my、My),識別嵌套類型及typealias,支持class、struct,enum、protocol

    1. 可設置‘重命名同名文件’
    2. 可設置‘前綴’

注意:目前Swift和OC混合項目,OC和Swift相互調用的部分需要手動加入黑名單,後續將優化。

規劃中

更新迭代將按照以下順序依次進行

  1. Objective-C(95%),主要提高工具的通用性和穩定性,及強化功能

    1. 音頻、視頻文件使用少,後續添加
  2. Swift(50%),開發中...

    1. 重命名圖片
    2. 插入屬性
    3. 修改方法
    4. 插入文件
  3. C++(65%),開發中...

    1. 方法:插入
    2. 屬性:修改
    3. 全局變量:修改
    4. 局部變量:修改
  4. Lua(10%)的針對性太強了,暫時不開放,暫時不打算重構有需要在說吧
  5. C#(0%),本人實際項目使用不多,故排在最後,看用戶需求再決定
  6. 其他功能:

    1. 快速混淆模式

圖文介紹

運行APP效果圖,使用前請詳細閱讀工具使用教程
image.png

更新日誌

v5.0.0(2021.08.17)

  1. 新增Swift[修改方法],利用重載技術修改函數原型並調用修改形參
  2. 新增OC[插入局部變量],單行復合調用變為簡單多行調用,改變執行順序
  3. 優化OC[插入文件],字典可能為空的異常和以及線程調用方式不合理情況
  4. 優化[Debug]模式無法關閉問題
  5. 修復其他小概率概率性bug

查看更多歷史更新記錄

感謝反饋

shizu2014myhoniorimbahongtabier008

鏈接導航

  1. 工具使用教程
  2. 軟件使用問答(Q&A)
  3. [修改方法]參數類型彙總表
  4. [修改局部變量]修改局部變量-支持類型彙總表

Leave a Reply

Your email address will not be published. Required fields are marked *