-
Notifications
You must be signed in to change notification settings - Fork 110
功能介绍
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、静态变量、静态常量 都可以被差异化
支持设置不需要差异化的
调用的位置会同步差异化
图片文件名会差异化,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.支持设置不需要差异化的属性
从编译原理来看,心理作用大于实际
配置的敏感词都会被混淆处理,也就是说,项目中如果存在"敏感词.txt"中的词,混淆后就没了
默认的"敏感词.txt"可能会存在覆盖不完全的情况,建议根据项目手动添加一些
"敏感词.txt"在User/UserConfig文件夹下面
例如:@"hello" hello被拆分的所有情况排列组合,每一段至少一个字母
效果如下:
修改为:
[NSString stringWithFormat:@"%@%@",@"he",@"llo"]
或者
[NSString stringWithFormat:@"%@%@%@",@"he",@"l",@"lo"]
或者
...
- 文件夹内文件创建时间晚于文件夹的创建时间
- 类头文件(.h)、类实现文件(.m.mm)创建时间一致
- 所有文件的创建时间、访问时间在正常的工作时间范围内(9-21点)