MJCodeObfuscation
一個用于代碼混淆和字符串加密的Mac小Demo
- 主要是利用
libclang解析掃描源代碼的語法樹,搜索出所有的類名、方法名、字符串 - 語法樹解析的核心代碼是:
MJCodeObfuscation/Classes/Tool/MJClangTool.m,比較簡單,不復(fù)雜 - 這僅僅是個小Demo,大家可以根據(jù)自己需要去調(diào)整代碼,比如混淆協(xié)議、屬性等等,可以自行添加實現(xiàn)
- 更多混淆相關(guān),可以參考開源項目
代碼混淆
將需要混淆的類名、方法名生成隨機字符串的宏定義
- 假設(shè)要對MJPerson的類名、方法名進(jìn)行混淆
@interface MJPerson : NSObject
- (void)mj_run;
- (void)mj_setupName:(NSString *)name mj_no:(int)no mj_age:(int)age;
@end
@implementation MJPerson
- (void)mj_run {
NSLog(@"%s", __func__);
}
- (void)mj_setupName:(NSString *)name mj_no:(int)no mj_age:(int)age {
NSLog(@"%s - %@ %d %d", __func__, name, no, age);
}
@end
- 點擊【1.選擇目錄】
- 選擇需要掃描的代碼目錄
- 點擊【2.開始混淆】
- 會掃描所選擇的目錄以及子目錄下的所有代碼文件
- 根據(jù)前綴(下圖實例用的前綴是
MJ、mj_)搜索出需要混淆的類名、方法名

68747470733a2f2f696d61676573323031382e636e626c6f67732e636f6d2f626c6f672f3439373237392f3230313830382f3439373237392d32303138303832303135323230373836372d313038343034353134372e676966.gif
- 最后會生成一個宏定義頭文件MJCodeObfuscation.h
#define mj_run OmWJoTZfCqoPshvr
#define MJPerson egnjoOFDrFiQVRgr
#define mj_setupName HrZLzcgSoPhwMBwW
#define mj_age reXYcdSKKEUSMalJ
#define mj_no mHEQViTuoOvRtMuB
- 點擊【打開目錄】
- 可以打開剛才所生成的宏定義頭文件的所在目錄

68747470733a2f2f696d61676573323031382e636e626c6f67732e636f6d2f626c6f672f3439373237392f3230313830382f3439373237392d32303138303832303135323231393435302d313037343631373535302e676966.gif
- 在項目的PCH文件中導(dǎo)入剛才的頭文件
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import "MJCodeObfuscation.h"
#endif /* PrefixHeader_pch */
- 最后的效果
MJPerson *person = [[MJPerson alloc] init];
[person mj_run];
[person mj_setupName:@"jack" mj_no:20 mj_age:21];
// 打印結(jié)果
-[egnjoOFDrFiQVRgr OmWJoTZfCqoPshvr]
-[egnjoOFDrFiQVRgr HrZLzcgSoPhwMBwW:mHEQViTuoOvRtMuB:reXYcdSKKEUSMalJ:] - jack 20 21
字符串加密(方式1)
僅僅是將字符串進(jìn)行了一個簡單的異或處理(開發(fā)者可以自行制定加密算法)
- 假設(shè)想對以下的C、OC字符串進(jìn)行加密
NSString *str1 = @"小碼哥mj123go";
const char *str2 = "小碼哥mj123go";
NSLog(@"%@ %s", str1, str2);
- 點擊【字符串加密】
- 彈出字符串加密窗口
- 輸入需要加密的字符串,點擊【加密】

3.gif
- 加密后的內(nèi)容如下所示,添加到項目中去(根據(jù)需要,聲明和定義可以分別放.h和.m)
/* 小碼哥mj123go */
extern const MJEncryptStringData * const _761622619;
/* 小碼哥mj123go */
const MJEncryptStringData * const _761622619 = &(MJEncryptStringData){
.factor = (char)-100,
.value = (char []){121,44,19,123,60,29,121,15,57,-15,-10,-83,-82,-81,-5,-13,0},
.length = 16
};
- 由于上面代碼依賴
MJEncryptStringData結(jié)構(gòu),所以需要將MJEncryptString目錄的內(nèi)容加入到項目中

4.png
- 在項目中的使用
#import "MJEncryptString.h"
NSString *str1 = mj_OCString(_761622619);
const char *str2 = mj_CString(_761622619);
NSLog(@"%@ %s", str1, str2);
// 打印結(jié)果如下
小碼哥mj123go 小碼哥mj123go
字符串加密(方式2)
- 點擊【1.選擇目錄】
- 選擇需要掃描的代碼目錄
- 點擊【2.開始加密】
- 將開始自動掃描目錄以及子目錄下的所有字符串(C、OC字符串)

5.gif

6.gif
- 加密完畢后,會自動生成一個
MJEncryptString目錄- 將這個目錄添加到項目中
- 并在PCH文件中導(dǎo)入頭文件
MJEncryptStringData.h(便于整個項目中共享使用加密的字符串)
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import "MJEncryptStringData.h"
#endif /* PrefixHeader_pch */
-
MJEncryptStringData.h文件內(nèi)容如下所示- 它將項目里的
"%@ %s"、"小碼哥mj123go"字符串都進(jìn)行了加密
- 它將項目里的
#ifndef MJEncryptStringData_h
#define MJEncryptStringData_h
#include "MJEncryptString.h"
/* %@ %s */
extern const MJEncryptStringData * const _1302706645;
/* 小碼哥mj123go */
extern const MJEncryptStringData * const _761622619;
#endif
- 在項目中的使用
NSString *str1 = mj_OCString(_761622619);
const char *str2 = mj_CString(_761622619);
NSLog(@"%@ %s", str1, str2);
// 打印結(jié)果如下
小碼哥mj123go 小碼哥mj123go