一评甜、基本概念
1.1、什么是加固仔涩?
加固是為了增加應(yīng)用的安全性忍坷,防止應(yīng)用被破解、盜版熔脂、二次打包佩研、注入、反編譯等-
1.2霞揉、常見(jiàn)的加固方式有
- 數(shù)據(jù)加密(字符串旬薯、網(wǎng)絡(luò)數(shù)據(jù)、敏感數(shù)據(jù)等)
- 應(yīng)用加殼(二進(jìn)制加密)
- 代碼混淆(類(lèi)名适秩、方法名绊序、代碼邏輯等)
......(不同平臺(tái)還有不同的做法)
1.3、iOS程序可以通過(guò)
class-dump
秽荞、Hopper
骤公、IDA
等獲取類(lèi)名、方法名扬跋、以及分析程序的執(zhí)行邏輯
如果進(jìn)行代碼混淆阶捆,可以加大別人的分析難度
二、代碼混淆的實(shí)戰(zhàn)
-
2.1、iOS的代碼混淆方案
- 第一種:源碼的混淆趁猴,混淆項(xiàng)目中下面的方面
- 類(lèi)名
- 方法名
- 協(xié)議名
- 第二種:LLVM中間代碼IR的混淆(容易產(chǎn)生BUG)
自己編寫(xiě)Pass
ollvm:https://github.com/obfuscator-llvm/obfuscator
- 第一種:源碼的混淆趁猴,混淆項(xiàng)目中下面的方面
-
2.2刊咳、源碼的混淆 - 通過(guò)宏定義混淆方法名、類(lèi)名
- 我們主要是針對(duì)儡司,類(lèi)名,方法名余指,屬性名來(lái)進(jìn)行混淆捕犬,混淆太多上架會(huì)被拒絕
- 我們使用宏定義
-
.h 文件
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface JKPerson : NSObject - (void)run; - (void)setName:(NSString *)name age:(int)age; @end NS_ASSUME_NONNULL_END
-
.m文件
#import "JKPerson.h" @interface JKPerson () @end @implementation JKPerson - (void)run { NSLog(@"----%s----",__func__); } - (void)setName:(NSString *)name age:(int)age { NSLog(@"----%s----%@----%d",__func__, name, age); } @end
-
pch文件
#ifndef Obfuscation_pch #define Obfuscation_pch // 針對(duì)類(lèi)名進(jìn)行混淆 #define JKPerson rererme // 針對(duì)方法名混淆 #define run xsdfd // 針對(duì)方法名進(jìn)行混淆 #define setName ahshshb // 針對(duì)方法中的參數(shù)進(jìn)行混淆 #define age kkjjjo
-
-
2.3、源碼混淆注意點(diǎn)
-
注意點(diǎn)
- 不能混淆系統(tǒng)方法
- 不能混淆init開(kāi)頭的等初始化方法
- 混淆屬性時(shí)需要額外注意set方法
- 如果xib酵镜、storyboard中用到了混淆的內(nèi)容碉碉,需要手動(dòng)修正
- 可以考慮把需要混淆的符號(hào)都加上前綴,跟系統(tǒng)自帶的符號(hào)進(jìn)行區(qū)分
- 混淆過(guò)多可能會(huì)被AppStore拒絕上架淮韭,需要說(shuō)明用途
建議
給需要混淆的符號(hào)加上了一個(gè)特定的前綴小工具參考
MJ老師的 MJCodeObfuscation垢粮,使用方法MJ老師的 github 有說(shuō)明,掃描源碼
-
-
2.4靠粪、代碼混淆工具:ios-class-guard
-
第三方工具 ios-class-guard 蜡吧,多年不更新了,不建議使用占键,如果有能力修改源碼昔善,可以使用
- 它是基于class-dump的擴(kuò)展,
掃描可執(zhí)行文件
畔乙,所有的東西都進(jìn)行混淆 - 用class-dump掃描出可執(zhí)行文件中的類(lèi)名君仆、方法名、屬性名等并做替換牲距,會(huì)更新xib和storyboard的名字等等
- 它是基于class-dump的擴(kuò)展,
-
用法
// 安裝 ios-class-guard brew install ios-class-guard // 具體的使用 ios-class-guard [options] <mach-o-file>
具體的使用如下
ios-class-guard --sdk-root /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk -X /Users/wangchong/Desktop/代碼混淆/MJ老師的工具混淆/TestObfuscation/TestObfuscation/Base.lproj -O 生成文件的.h文件 symbols.json TestObfuscation
- ios-class-guard --sdk-root 模擬器路徑 -X xib的路徑 -O 生成文件的.h文件 symbols.json 可執(zhí)行文件的路徑
提示:
symbols.json
是映射文件
- ios-class-guard --sdk-root 模擬器路徑 -X xib的路徑 -O 生成文件的.h文件 symbols.json 可執(zhí)行文件的路徑
-
常用參數(shù)
- --sdk-root <path>:用于指定SDK路徑返咱,如果是模擬器SDK,一般路徑就是:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
- --sdk-ios:相當(dāng)于指定SDK路徑為真機(jī)設(shè)備SDK
- -X <path>:用于指定xib牍鞠、storyboard所在目錄咖摹,它會(huì)遞歸搜索
- -O <path>:生成的混淆頭文件路徑
- -m <path>:符號(hào)映射表(默認(rèn)是symbols.json)
- --sdk-root <path>:用于指定SDK路徑返咱,如果是模擬器SDK,一般路徑就是:
-
三、字符串加密
-
3.1皮服、字符串加密的簡(jiǎn)單介紹
- 很多時(shí)候楞艾,可執(zhí)行文件中的字符串信息,對(duì)破解者來(lái)說(shuō)龄广,非常關(guān)鍵硫眯,是破解的捷徑之一
- 為了加大破解、逆向難度择同,可以考慮對(duì)字符串進(jìn)行加密
- 字符串的加密技術(shù)有很多種两入,可以根據(jù)自己的需要自行制定算法
- 這里舉一個(gè)簡(jiǎn)單的例子
- 對(duì)每個(gè)字符進(jìn)行異或(^)處理
- 需要使用字符串時(shí),對(duì)異或()過(guò)的字符再進(jìn)行一次異或()敲才,就可以獲得原字符
-
3裹纳、第三方庫(kù) MJCodeObfuscation 對(duì)字符串進(jìn)行加密
-
1>择葡、我們以下面的字符串為例: NSString *str1 = @"dcfg342";,使用工具加密如下
/* dcfg342 */ extern const MJEncryptStringData * const _2309389973; /* dcfg342 */ const MJEncryptStringData * const _2309389973 = &(MJEncryptStringData){ .factor = (char)116, .value = (char []){16,23,18,19,71,64,70,0}, .length = 7 };
導(dǎo)入
#import "MJEncryptString.h"
剃氧,使用如下NSString *str1 = mj_OCString(_2309389973); NSLog(@"str1 = %@", str1); // 打印如下 2020-07-15 07:53:41.851045+0800 TestObfuscation[44303:841930] str1 = dcfg342
-
2>敏储、全部掃描項(xiàng)目文件
使用方式也是 1 中的
-