1+ #pragma clang diagnostic ignored "-Wunused-function"
2+ #pragma clang diagnostic ignored "-Wframe-address"
3+
14#import " hooks.h"
25
36static NSMutableArray <NSDictionary *>* _shdw_dyld_collection = nil ;
@@ -9,6 +12,52 @@ static BOOL _shdw_dyld_error = NO;
912
1013// todo: maybe hook this private symbol
1114// extern void call_funcs_for_add_image(struct mach_header *mh, unsigned long vmaddr_slide);
15+ #include < os/log.h>
16+ #undef isCallerTweak
17+ bool isCallerTweak () {
18+ // NSLog(@"%@", NSThread.callStackSymbols);
19+ // os_log(OS_LOG_DEFAULT, "%{public}@", NSThread.callStackSymbols);
20+ // return true;
21+ NSArray * _dyld_collection = [_shdw_dyld_collection copy ];
22+ void *retaddrs[] = {
23+ __builtin_return_address (0 ),
24+ __builtin_return_address (1 ),
25+ __builtin_return_address (2 ),
26+ __builtin_return_address (3 ),
27+ __builtin_return_address (4 ),
28+ __builtin_return_address (5 ),
29+ __builtin_return_address (6 ),
30+ __builtin_return_address (7 ),
31+ };
32+ for (int i = 0 ; i < 8 ; i++) {
33+ void *addr = __builtin_extract_return_addr (retaddrs[i]);
34+ if (![_shadow isAddrExternal: addr]) { // address is belong to app
35+ return false ;
36+ }
37+
38+ const char * image_path = dyld_image_path_containing_address (addr);
39+
40+ for (NSDictionary *img in _dyld_collection) {
41+ if (!strcmp ([img[@" name" ] UTF8String ], image_path)) {
42+ return false ; // is in safe module list
43+ }
44+ }
45+ // if (![_shadow isAddrRestricted:addr]) { // address is belong to tweak
46+ // return true;
47+ // }
48+ }
49+ return true ;
50+ // for (NSString *sym in NSThread.callStackSymbols) {
51+ // // do something with object
52+ // if ([sym containsString:@"libinjector.dylib"]) { // RootHide's injector
53+ // return true;
54+ // }
55+ // if ([sym containsString:@"tweaks_iterate"] || [sym containsString:@"injection_init"]) { // RootHide's injector
56+ // return true;
57+ // }
58+ // }
59+ // return false;
60+ }
1261
1362static uint32_t (*original_dyld_image_count)();
1463static uint32_t replaced_dyld_image_count () {
@@ -42,12 +91,15 @@ static intptr_t replaced_dyld_get_image_vmaddr_slide(uint32_t image_index) {
4291
4392static const char * (*original_dyld_get_image_name)(uint32_t image_index);
4493static const char * replaced_dyld_get_image_name (uint32_t image_index) {
94+ // NSLog(@"_dyld_get_image_name from %p (%d): %@", __builtin_extract_return_addr(__builtin_return_address(0)), isCallerTweak(), NSThread.callStackSymbols);
4595 if (isCallerTweak ()) {
4696 return original_dyld_get_image_name (image_index);
4797 }
4898
4999 NSArray * _dyld_collection = [_shdw_dyld_collection copy ];
50- return image_index < [_dyld_collection count ] ? [_dyld_collection[image_index][@" name" ] fileSystemRepresentation ] : NULL ;
100+ const char *ret = image_index < [_dyld_collection count ] ? [_dyld_collection[image_index][@" name" ] UTF8String ] : NULL ;
101+ // NSLog(@"_dyld_get_image_name -> %s", ret ? ret: "");
102+ return ret;
51103}
52104
53105static void * (*original_dlopen)(const char * path, int mode);
@@ -177,6 +229,7 @@ void shadowhook_dyld_updatelibs(const struct mach_header* mh, intptr_t vmaddr_sl
177229 if (image_path) {
178230 NSString * path = [NSString stringWithUTF8String: image_path];
179231
232+ NSLog (@" %@ : %@ : %@ " , @" dyld" , @" checking lib" , path);
180233 if ([path hasPrefix: @" /System" ] || ![_shadow isPathRestricted: path options: @{kShadowRestrictionEnableResolve : @(NO )}]) {
181234 NSLog (@" %@ : %@ : %@ " , @" dyld" , @" adding lib" , path);
182235
@@ -304,14 +357,20 @@ void shadowhook_dyld(HKSubstitutor* hooks) {
304357 _dyld_register_func_for_remove_image (shadowhook_dyld_updatelibs_r);
305358
306359 MSHookFunction (_dyld_get_image_name, replaced_dyld_get_image_name, (void **) &original_dyld_get_image_name);
360+
361+ // !! err in ellekit's substrate, because _dyld_image_count uses x16, conflicts with ellekit
307362 MSHookFunction (_dyld_image_count, replaced_dyld_image_count, (void **) &original_dyld_image_count);
363+
308364 MSHookFunction (_dyld_get_image_header, replaced_dyld_get_image_header, (void **) &original_dyld_get_image_header);
309365 MSHookFunction (_dyld_get_image_vmaddr_slide, replaced_dyld_get_image_vmaddr_slide, (void **) &original_dyld_get_image_vmaddr_slide);
310366 MSHookFunction (_dyld_register_func_for_add_image, replaced_dyld_register_func_for_add_image, (void **) &original_dyld_register_func_for_add_image);
311367 MSHookFunction (_dyld_register_func_for_remove_image, replaced_dyld_register_func_for_remove_image, (void **) &original_dyld_register_func_for_remove_image);
312368
313369 MSHookFunction (task_info, replaced_task_info, (void **) &original_task_info);
314- MSHookFunction (dlopen_preflight, replaced_dlopen_preflight, (void **) &original_dlopen_preflight);
370+
371+ // !! will cause err in Dobby if directly hook using import address, must use findSymbol
372+ void *p_dlopen_preflight = MSFindSymbol (MSGetImageByName (" /usr/lib/system/libdyld.dylib" ), " _dlopen_preflight" );
373+ MSHookFunction (p_dlopen_preflight, replaced_dlopen_preflight, (void **) &original_dlopen_preflight);
315374
316375 MSHookFunction (dlerror, replaced_dlerror, (void **) &original_dlerror);
317376}
0 commit comments