Skip to content

功能介绍

Rollin edited this page Jul 24, 2022 · 18 revisions

目录


代码部分

为方便直观的介绍功能,假设有一个名为HelloClass的类,并且具有一个分类HelloClass+Demo

HelloClass.h代码如下

@protocol HelloProtocol <NSObject>
- (void)helloProtocolMethod;
@end

@interface HelloClass : NSObject
@property(nonatomic,strong) id<HelloProtocol> delegate;
@property(nonatomic,strong) NSString *username;
+ (void)testMethod;
@end

HelloClass.m代码如下

#import "HelloClass.h"
@implementation HelloClass
+ (void)testMethod {
}
@end

支持类名差异化-支持分类

假设当次混淆:

HelloClass 被差异化成 World(真实情况差异化结果未知,而且每次都不同)
Demo 被差异化成 Test(真实情况差异化结果未知,而且每次都不同)

类有没有分类都可以差异化,这里只是为了方便说明

下面这些会同步差异化:

类文件:

HelloClass.h -> World.h
HelloClass.m -> World.m

类声明:

@interface HelloClass : NSObject 
-> 
@interface World : NSObject

分类声明:

@interface HelloClass (Demo) 
-> 
@interface World (Test)

类实现:

@implementation HelloClass 
-> 
@implementation World

分类实现:

@implementation HelloClass (Demo) 
-> 
@implementation World (Test)

类引用:

#import "HelloClass.h" 
-> 
#import "World.h"

分类引用:

#import "HelloClass+Demo.h" 
->
#import "World+Test.h"

类调用:

[HelloClass testMethod]; 
-> 
[World testMethod]; //方法差异化下面说明

支持方法名差异化

假设当次混淆:

testMethod 被差异化成 oneHelp(真实情况差异化结果未知,而且每次都不同)

方法名差异化不限定(+开头)类方法和(-开头)实例方法,这里只是为了方便说明

方法声明:

+ (void)testMethod; 
 ->  
+ (void)oneHelp;

方法实现:

+ (void)testMethod { 
 ->  
+ (void)oneHelp {

方法调用1:

[HelloClass testMethod]; 
 -> 
[World oneHelp];

方法调用2:

[HelloClass performSelector:@selector(testMethod) withObject:nil]; 
-> 
[World performSelector:@selector(oneHelp) withObject:nil];

注意:

系统方法不会被差异化
项目中自定义的所有的方法都可以被差异化,支持设置不需要差异化的方法
调用到的位置会同步差异化
xib\storyboard中的方法会同步差异化

支持属性差异化

假设当次混淆:

username 被差异化成 account(真实情况差异化结果未知,而且每次都不同)

声明:

@property(nonatomic,strong) NSString *username; 
 -> 
@property(nonatomic,strong) NSString *account;

内部调用:

_username = @"name"; 
 -> 
_account = @"name";

self.username = @"name"; 
 -> 
self.account = @"name";

[self setUsername:@"name"]; 
 -> 
[self setAccount:@"name"];

[self getUsername:@"name"]; 
 -> 
[self getAccount:@"name"];

外部调用:

[HelloClass new].username = @"name"; -> [World new].account = @"name";

[[HelloClass new] setUsername:@"name"];  -> [[World new] setAccount:@"name"];

[[HelloClass new] getUsername:@"name"];  -> [[World new] getAccount:@"name"];

注意:

系统属性不会被差异化
项目中自定义的所有的属性都可以被差异化,支持设置不需要差异化的属性
支持设置不需要差异化属性的类(该类的所有属性不会差异化,方法等其他会被差异化)
调用到的位置会同步差异化
xib\storyboard中的方法会同步差异化

支持-协议-宏-枚举-block-静态变量-静态常量差异化

系统 协议、宏、枚举、block、静态变量、静态常量 不会被差异化
项目中自定义的所有的 协议、宏、枚举、block、静态变量、静态常量 都可以被差异化
支持设置不需要差异化的
调用的位置会同步差异化

资源部分

支持资源类型:

图片类型:

图片文件名会差异化,md5会被差异化,不会修改文件尺寸

  • bmp
  • jpg
  • png
  • gif
  • webp

音频类型:

音频文件名会差异化,md5会被差异化

  • mp3
  • aiff
  • wav

视频类型:

视频文件名会差异化,md5会被差异化

  • avi
  • mov
  • mp4
  • rmvb

布局类型:

布局文件名、其中关联的类名、方法名、属性名、资源名 会同步差异化

  • xib
  • storyboard
  • xml

文件夹类型:

文件夹名会差异化,文件夹中的文件 会被差异化

  • imageset
  • colorset
  • xcassets
  • bundle
  • 普通文件夹

其他类型:

文件名会差异化

  • nib
  • strings
  • pch
  • plist

补充

如需支持更多类型,请联系开发者

不支持的类型:

不支持的文件夹类型:

这些类型的文件夹不会差异化

  • framework
  • appiconset
  • lproj
  • xcodeproj
  • xcworkspace
  • jsbundle

不支持的文件类型:

这些类型的文件不会差异化

  • a
  • html
  • json
  • txt

白名单部分

1.支持设置文件夹白名单

被设定的文件夹中的类、方法、属性、协议等一切不会被修改
Pods文件夹默认设置在文件夹白名单

2.支持设置类白名单

1.自动不差异化系统类
2.支持设置不需要差异化的类 例如:AppDelegate类
3.支持设置不差异化某些类的属性(适用于model类)

3.支持设置符号白名单

1.自动不差异化系统方法
2.支持设置不需要差异化的方法、属性、协议等一切符号

4.支持设置属性白名单

1.自动不差异化系统属性
2.支持设置不需要差异化的属性

移除代码注释

从编译原理来看,心理作用大于实际

注释代码NSLog输出

项目敏感词检查

配置的敏感词都会被混淆处理,也就是说,项目中如果存在"敏感词.txt"中的词,混淆后就没了
默认的"敏感词.txt"可能会存在覆盖不完全的情况,建议根据项目手动添加一些
"敏感词.txt"在User/UserConfig文件夹下面

字符串差异化

例如:@"hello" hello被拆分的所有情况排列组合,每一段至少一个字母

效果如下:

修改为:
[NSString stringWithFormat:@"%@%@",@"he",@"llo"]
或者
[NSString stringWithFormat:@"%@%@%@",@"he",@"l",@"lo"]
或者
...

文件创建时间-修改时间差异化

  1. 文件夹内文件创建时间晚于文件夹的创建时间
  2. 类头文件(.h)、类实现文件(.m.mm)创建时间一致
  3. 所有文件的创建时间、访问时间在正常的工作时间范围内(9-21点)

差异化结果记录文件