-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathCore.m
145 lines (113 loc) · 4.38 KB
/
Core.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#import <HookKit/Core.h>
#import <Modulous/Loader.h>
#import <RootBridge.h>
@implementation HookKitCore {
ModulousLoader* loader;
NSMutableDictionary<NSString *, __kindof HookKitModule *>* registeredModules;
}
+ (instancetype)sharedInstance {
static HookKitCore* sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [self new];
});
return sharedInstance;
}
- (__kindof HookKitModule *)defaultModule {
static __kindof HookKitModule* defaultModule = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
// load the highest priority module
NSArray<NSDictionary *>* modulous_infos = [[loader getModuleInfo] sortedArrayUsingComparator:^NSComparisonResult(NSDictionary* a, NSDictionary* b) {
NSDictionary* info_a = [a objectForKey:@"ModuleInfo"];
NSDictionary* info_b = [b objectForKey:@"ModuleInfo"];
NSNumber* prio_a = [info_a objectForKey:@"Priority"];
NSNumber* prio_b = [info_b objectForKey:@"Priority"];
if(!prio_a) {
prio_a = @(100);
}
if(!prio_b) {
prio_b = @(100);
}
return [prio_a compare:prio_b];
}];
if(modulous_infos) {
for(NSDictionary* modulous_info in modulous_infos) {
NSString* modulous_identifier = [modulous_info objectForKey:@"CFBundleIdentifier"];
NSDictionary* info = [modulous_info objectForKey:@"ModuleInfo"];
if(info) {
NSString* module_identifier = [info objectForKey:@"Identifier"];
[loader loadModulesWithIdentifiers:@[modulous_identifier]];
defaultModule = [self getModuleWithIdentifier:module_identifier];
}
if(defaultModule) {
break;
}
}
}
});
return defaultModule;
}
- (NSArray<NSDictionary *> *)getModuleInfo {
NSMutableArray<NSDictionary *>* infos = [NSMutableArray new];
NSArray<NSDictionary *>* modulous_infos = [loader getModuleInfo];
if(modulous_infos) {
for(NSDictionary* modulous_info in modulous_infos) {
NSDictionary* info = [modulous_info objectForKey:@"ModuleInfo"];
if(info) {
[infos addObject:info];
}
}
}
return [infos copy];
}
- (NSDictionary *)getModuleInfoWithIdentifier:(NSString *)identifier {
NSArray<NSDictionary *>* modulous_infos = [loader getModuleInfo];
if(modulous_infos) {
for(NSDictionary* modulous_info in modulous_infos) {
NSDictionary* info = [modulous_info objectForKey:@"ModuleInfo"];
if(info && [[info objectForKey:@"Identifier"] isEqualToString:identifier]) {
return info;
}
}
}
return nil;
}
- (__kindof HookKitModule *)getModuleWithIdentifier:(NSString *)identifier {
__kindof HookKitModule* result = nil;
@synchronized(registeredModules) {
result = [registeredModules objectForKey:identifier];
}
if(!result) {
NSArray<NSDictionary *>* modulous_infos = [loader getModuleInfo];
if(modulous_infos) {
for(NSDictionary* modulous_info in modulous_infos) {
NSString* modulous_identifier = [modulous_info objectForKey:@"CFBundleIdentifier"];
NSDictionary* info = [modulous_info objectForKey:@"ModuleInfo"];
if(info && [[info objectForKey:@"Identifier"] isEqualToString:identifier]) {
// load module with modulous
[loader loadModulesWithIdentifiers:@[modulous_identifier]];
}
}
}
@synchronized(registeredModules) {
result = [registeredModules objectForKey:identifier];
}
}
return result;
}
- (void)registerModule:(__kindof HookKitModule *)module withIdentifier:(NSString *)identifier {
if(module && identifier) {
@synchronized(registeredModules) {
[registeredModules setObject:module forKey:identifier];
}
}
}
- (instancetype)init {
if((self = [super init])) {
loader = [ModulousLoader loaderWithPath:[RootBridge getJBPath:@"/Library/Modulous/HookKit"]];
registeredModules = [NSMutableDictionary new];
}
return self;
}
@end