美文网首页
一个用于代码混淆和字符串加密的Mac小Demo

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

作者: 德惟 | 来源:发表于2021-12-17 15:30 被阅读0次

    MJCodeObfuscation

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

    • 主要是利用libclang解析扫描源代码的语法树,搜索出所有的类名、方法名、字符串
    • 语法树解析的核心代码是:MJCodeObfuscation/Classes/Tool/MJClangTool.m,比较简单,不复杂
    • 这仅仅是个小Demo,大家可以根据自己需要去调整代码,比如混淆协议、属性等等,可以自行添加实现
    • 更多混淆相关,可以参考开源项目

    代码混淆

    将需要混淆的类名、方法名生成随机字符串的宏定义

    • 假设要对MJPerson的类名、方法名进行混淆
    @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.开始混淆】
      • 会扫描所选择的目录以及子目录下的所有代码文件
      • 根据前缀(下图实例用的前缀是MJmj_)搜索出需要混淆的类名、方法名
    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文件中导入刚才的头文件
    #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];
    
    // 打印结果
    -[egnjoOFDrFiQVRgr OmWJoTZfCqoPshvr]
    -[egnjoOFDrFiQVRgr HrZLzcgSoPhwMBwW:mHEQViTuoOvRtMuB:reXYcdSKKEUSMalJ:] - jack 20 21
    

    字符串加密(方式1)

    仅仅是将字符串进行了一个简单的异或处理(开发者可以自行制定加密算法)

    • 假设想对以下的C、OC字符串进行加密
    NSString *str1 = @"小码哥mj123go";
    const char *str2 = "小码哥mj123go";
    NSLog(@"%@ %s", str1, str2);
    
    • 点击【字符串加密】
      • 弹出字符串加密窗口
    • 输入需要加密的字符串,点击【加密】
    3.gif
    • 加密后的内容如下所示,添加到项目中去(根据需要,声明和定义可以分别放.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结构,所以需要将MJEncryptString目录的内容加入到项目中
    4.png
    • 在项目中的使用
    #import "MJEncryptString.h"
    
    NSString *str1 = mj_OCString(_761622619);
    const char *str2 = mj_CString(_761622619);
    NSLog(@"%@ %s", str1, str2);
    
    // 打印结果如下
    小码哥mj123go 小码哥mj123go
    

    字符串加密(方式2)

    • 点击【1.选择目录】
      • 选择需要扫描的代码目录
    • 点击【2.开始加密】
      • 将开始自动扫描目录以及子目录下的所有字符串(C、OC字符串)
    5.gif 6.gif
    • 加密完毕后,会自动生成一个MJEncryptString目录
      • 将这个目录添加到项目中
      • 并在PCH文件中导入头文件MJEncryptStringData.h(便于整个项目中共享使用加密的字符串)
    #ifndef PrefixHeader_pch
    #define PrefixHeader_pch
    
    #import "MJEncryptStringData.h"
    
    #endif /* PrefixHeader_pch */
    
    • MJEncryptStringData.h文件内容如下所示
      • 它将项目里的"%@ %s""小码哥mj123go"字符串都进行了加密
    #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);
    
    // 打印结果如下
    小码哥mj123go 小码哥mj123go
    

    相关文章

      网友评论

          本文标题:一个用于代码混淆和字符串加密的Mac小Demo

          本文链接:https://www.haomeiwen.com/subject/rrcpfrtx.html