一個用于代碼混淆和字符串加密的Mac小Demo

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容