{"id":13540307,"url":"https://github.com/codermjlee/mjcodeobfuscation","last_synced_at":"2025-04-05T09:09:13.825Z","repository":{"id":81330477,"uuid":"145374879","full_name":"CoderMJLee/MJCodeObfuscation","owner":"CoderMJLee","description":"一个用于代码混淆和字符串加密的Mac小Demo","archived":false,"fork":false,"pushed_at":"2020-01-04T10:03:47.000Z","size":87,"stargazers_count":592,"open_issues_count":8,"forks_count":147,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-03-29T08:09:04.185Z","etag":null,"topics":["obfuscation","obfuscator","objective-c"],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CoderMJLee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-08-20T06:22:13.000Z","updated_at":"2025-01-13T07:03:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"db4e3e38-484c-4340-8eb1-567c7bf289cc","html_url":"https://github.com/CoderMJLee/MJCodeObfuscation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderMJLee%2FMJCodeObfuscation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderMJLee%2FMJCodeObfuscation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderMJLee%2FMJCodeObfuscation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderMJLee%2FMJCodeObfuscation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CoderMJLee","download_url":"https://codeload.github.com/CoderMJLee/MJCodeObfuscation/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247312082,"owners_count":20918344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["obfuscation","obfuscator","objective-c"],"created_at":"2024-08-01T09:01:46.201Z","updated_at":"2025-04-05T09:09:13.785Z","avatar_url":"https://github.com/CoderMJLee.png","language":"C","readme":"# MJCodeObfuscation\n\u003e 一个用于代码混淆和字符串加密的Mac小Demo\n\n- 主要是利用`libclang`解析扫描源代码的语法树，搜索出所有的类名、方法名、字符串\n- 语法树解析的核心代码是：`MJCodeObfuscation/Classes/Tool/MJClangTool.m`，比较简单，不复杂\n- 这仅仅是个小Demo，大家可以根据自己需要去调整代码，比如混淆协议、属性等等，可以自行添加实现\n- 更多混淆相关，可以参考开源项目\n  - [ios-class-guard](https://github.com/Polidea/ios-class-guard)\n  - [ollvm](https://github.com/obfuscator-llvm/obfuscator)\n\n\n\n## 代码混淆\n\n\u003e 将需要混淆的类名、方法名生成随机字符串的宏定义\n\n- 假设要对MJPerson的类名、方法名进行混淆\n\n```objective-c\n@interface MJPerson : NSObject\n- (void)mj_run;\n- (void)mj_setupName:(NSString *)name mj_no:(int)no mj_age:(int)age;\n@end\n    \n@implementation MJPerson\n- (void)mj_run {\n    NSLog(@\"%s\", __func__);\n}\n\n- (void)mj_setupName:(NSString *)name mj_no:(int)no mj_age:(int)age {\n    NSLog(@\"%s - %@ %d %d\", __func__, name, no, age);\n}\n@end\n```\n\n- 点击【1.选择目录】\n  - 选择需要扫描的代码目录\n- 点击【2.开始混淆】\n  - 会扫描所选择的目录以及子目录下的所有代码文件\n  - 根据前缀（下图实例用的前缀是`MJ`、`mj_`）搜索出需要混淆的类名、方法名\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820152207867-1084045147.gif)\n\n- 最后会生成一个宏定义头文件MJCodeObfuscation.h\n\n```objective-c\n#define mj_run OmWJoTZfCqoPshvr\n#define MJPerson egnjoOFDrFiQVRgr\n#define mj_setupName HrZLzcgSoPhwMBwW\n#define mj_age reXYcdSKKEUSMalJ\n#define mj_no mHEQViTuoOvRtMuB\n```\n\n- 点击【打开目录】\n  - 可以打开刚才所生成的宏定义头文件的所在目录\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820152219450-1074617550.gif)\n\n- 在项目的PCH文件中导入刚才的头文件\n\n```objective-c\n#ifndef PrefixHeader_pch\n#define PrefixHeader_pch\n\n#import \"MJCodeObfuscation.h\"\n\n#endif /* PrefixHeader_pch */\n```\n\n- 最后的效果\n\n```objective-c\nMJPerson *person = [[MJPerson alloc] init];\n[person mj_run];\n[person mj_setupName:@\"jack\" mj_no:20 mj_age:21];\n\n// 打印结果\n-[egnjoOFDrFiQVRgr OmWJoTZfCqoPshvr]\n-[egnjoOFDrFiQVRgr HrZLzcgSoPhwMBwW:mHEQViTuoOvRtMuB:reXYcdSKKEUSMalJ:] - jack 20 21\n```\n\n\n\n## 字符串加密（方式1）\n\n\u003e 仅仅是将字符串进行了一个简单的异或处理（开发者可以自行制定加密算法）\n\n- 假设想对以下的C、OC字符串进行加密\n\n```objective-c\nNSString *str1 = @\"小码哥mj123go\";\nconst char *str2 = \"小码哥mj123go\";\nNSLog(@\"%@ %s\", str1, str2);\n```\n\n- 点击【字符串加密】\n  - 弹出字符串加密窗口\n- 输入需要加密的字符串，点击【加密】\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820162041646-620382237.gif)\n\n- 加密后的内容如下所示，添加到项目中去（根据需要，声明和定义可以分别放.h和.m）\n\n```objective-c\n/* 小码哥mj123go */\nextern const MJEncryptStringData * const _761622619;\n\n/* 小码哥mj123go */\nconst MJEncryptStringData * const _761622619 = \u0026(MJEncryptStringData){\n    .factor = (char)-100,\n    .value = (char []){121,44,19,123,60,29,121,15,57,-15,-10,-83,-82,-81,-5,-13,0},\n    .length = 16\n};\n```\n\n- 由于上面代码依赖`MJEncryptStringData`结构，所以需要将`MJEncryptString`目录的内容加入到项目中\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820162253160-783805417.png)\n\n- 在项目中的使用\n\n```objective-c\n#import \"MJEncryptString.h\"\n\nNSString *str1 = mj_OCString(_761622619);\nconst char *str2 = mj_CString(_761622619);\nNSLog(@\"%@ %s\", str1, str2);\n\n// 打印结果如下\n小码哥mj123go 小码哥mj123go\n```\n\n\n\n## 字符串加密（方式2）\n\n- 点击【1.选择目录】\n  - 选择需要扫描的代码目录\n- 点击【2.开始加密】\n  - 将开始自动扫描目录以及子目录下的所有字符串（C、OC字符串）\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820162442278-1556544160.gif)\n\n![](https://images2018.cnblogs.com/blog/497279/201808/497279-20180820162448921-927018764.gif)\n\n- 加密完毕后，会自动生成一个`MJEncryptString`目录\n  - 将这个目录添加到项目中\n  - 并在PCH文件中导入头文件`MJEncryptStringData.h`（便于整个项目中共享使用加密的字符串）\n\n```objective-c\n#ifndef PrefixHeader_pch\n#define PrefixHeader_pch\n\n#import \"MJEncryptStringData.h\"\n\n#endif /* PrefixHeader_pch */\n```\n\n- `MJEncryptStringData.h`文件内容如下所示\n  - 它将项目里的`\"%@ %s\"`、`\"小码哥mj123go\"`字符串都进行了加密\n\n```objective-c\n#ifndef MJEncryptStringData_h\n#define MJEncryptStringData_h\n#include \"MJEncryptString.h\"\n/* %@ %s */\nextern const MJEncryptStringData * const _1302706645;\n/* 小码哥mj123go */\nextern const MJEncryptStringData * const _761622619;\n#endif\n```\n\n- 在项目中的使用\n\n```objective-c\nNSString *str1 = mj_OCString(_761622619);\nconst char *str2 = mj_CString(_761622619);\nNSLog(@\"%@ %s\", str1, str2);\n\n// 打印结果如下\n小码哥mj123go 小码哥mj123go\n```","funding_links":[],"categories":["\u003ca id=\"783f861b9f822127dba99acb55687cbb\"\u003e\u003c/a\u003e工具"],"sub_categories":["\u003ca id=\"85bb0c28850ffa2b4fd44f70816db306\"\u003e\u003c/a\u003e混淆器\u0026\u0026Obfuscate"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodermjlee%2Fmjcodeobfuscation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodermjlee%2Fmjcodeobfuscation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodermjlee%2Fmjcodeobfuscation/lists"}