MJCodeObfuscation
一個(gè)用于代碼混淆和字符串加密的Mac小Demo
- 主要是利用
libclang
解析掃描源代碼的語(yǔ)法樹详囤,搜索出所有的類名、方法名藏姐、字符串 - 語(yǔ)法樹解析的核心代碼是:
MJCodeObfuscation/Classes/Tool/MJClangTool.m
羔杨,比較簡(jiǎn)單,不復(fù)雜 - 這僅僅是個(gè)小Demo理澎,大家可以根據(jù)自己需要去調(diào)整代碼曙寡,比如混淆協(xié)議、屬性等等执隧,可以自行添加實(shí)現(xiàn)
- 更多混淆相關(guān)户侥,可以參考開源項(xiàng)目
代碼混淆
將需要混淆的類名、方法名生成隨機(jī)字符串的宏定義
- 假設(shè)要對(duì)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
- 點(diǎn)擊【1.選擇目錄】
- 選擇需要掃描的代碼目錄
- 點(diǎn)擊【2.開始混淆】
- 會(huì)掃描所選擇的目錄以及子目錄下的所有代碼文件
- 根據(jù)前綴(下圖實(shí)例用的前綴是
MJ
刃泌、mj_
)搜索出需要混淆的類名署尤、方法名
68747470733a2f2f696d61676573323031382e636e626c6f67732e636f6d2f626c6f672f3439373237392f3230313830382f3439373237392d32303138303832303135323230373836372d313038343034353134372e676966.gif
- 最后會(huì)生成一個(gè)宏定義頭文件MJCodeObfuscation.h
#define mj_run OmWJoTZfCqoPshvr
#define MJPerson egnjoOFDrFiQVRgr
#define mj_setupName HrZLzcgSoPhwMBwW
#define mj_age reXYcdSKKEUSMalJ
#define mj_no mHEQViTuoOvRtMuB
- 點(diǎn)擊【打開目錄】
- 可以打開剛才所生成的宏定義頭文件的所在目錄
68747470733a2f2f696d61676573323031382e636e626c6f67732e636f6d2f626c6f672f3439373237392f3230313830382f3439373237392d32303138303832303135323231393435302d313037343631373535302e676966.gif
- 在項(xiàng)目的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)行了一個(gè)簡(jiǎn)單的異或處理(開發(fā)者可以自行制定加密算法)
- 假設(shè)想對(duì)以下的C蔑歌、OC字符串進(jìn)行加密
NSString *str1 = @"小碼哥mj123go";
const char *str2 = "小碼哥mj123go";
NSLog(@"%@ %s", str1, str2);
- 點(diǎn)擊【字符串加密】
- 彈出字符串加密窗口
- 輸入需要加密的字符串,點(diǎn)擊【加密】
3.gif
- 加密后的內(nèi)容如下所示,添加到項(xiàng)目中去(根據(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)容加入到項(xiàng)目中
4.png
- 在項(xiàng)目中的使用
#import "MJEncryptString.h"
NSString *str1 = mj_OCString(_761622619);
const char *str2 = mj_CString(_761622619);
NSLog(@"%@ %s", str1, str2);
// 打印結(jié)果如下
小碼哥mj123go 小碼哥mj123go
字符串加密(方式2)
- 點(diǎn)擊【1.選擇目錄】
- 選擇需要掃描的代碼目錄
- 點(diǎn)擊【2.開始加密】
- 將開始自動(dòng)掃描目錄以及子目錄下的所有字符串(C橄教、OC字符串)
5.gif
6.gif
- 加密完畢后护蝶,會(huì)自動(dòng)生成一個(gè)
MJEncryptString
目錄- 將這個(gè)目錄添加到項(xiàng)目中
- 并在PCH文件中導(dǎo)入頭文件
MJEncryptStringData.h
(便于整個(gè)項(xiàng)目中共享使用加密的字符串)
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import "MJEncryptStringData.h"
#endif /* PrefixHeader_pch */
-
MJEncryptStringData.h
文件內(nèi)容如下所示- 它將項(xiàng)目里的
"%@ %s"
、"小碼哥mj123go"
字符串都進(jìn)行了加密
- 它將項(xiàng)目里的
#ifndef MJEncryptStringData_h
#define MJEncryptStringData_h
#include "MJEncryptString.h"
/* %@ %s */
extern const MJEncryptStringData * const _1302706645;
/* 小碼哥mj123go */
extern const MJEncryptStringData * const _761622619;
#endif
- 在項(xiàng)目中的使用
NSString *str1 = mj_OCString(_761622619);
const char *str2 = mj_CString(_761622619);
NSLog(@"%@ %s", str1, str2);
// 打印結(jié)果如下
小碼哥mj123go 小碼哥mj123go