#ifndef _PS #define _PS #import "iOSVersions.h" #import "Misc.h" #define PS_DONATE_URL @"https://poomsmart.github.io/repo/" #define PS_TWITTER_URL @"https://twitter.com/PoomSmart" #ifdef CHECK_TARGET #import typedef NS_ENUM(NSUInteger, TargetType) { TargetTypeApps = 1 << 0, TargetTypeGenericExtensions = 1 << 1, TargetTypeKeyboardExtensions = 1 << 2 }; FOUNDATION_EXPORT char ***_NSGetArgv(); static BOOL _isTarget(NSUInteger type, NSArray *whitelist, NSArray *blacklist) { char *executablePathC = **_NSGetArgv(); NSString *executablePath = [NSString stringWithUTF8String:executablePathC]; if (executablePath) { #ifdef __DEBUG__ HBLogDebug(@"Executable path: %@", executablePath); #endif BOOL isExtension = [executablePath rangeOfString:@"appex"].location != NSNotFound; if (type & TargetTypeGenericExtensions && isExtension) { HBLogDebug(@"Injected: extension"); return YES; } NSString *processName = [executablePath lastPathComponent]; #ifdef CHECK_BLACKLIST if (blacklist.count) { BOOL disallow = [blacklist containsObject:processName]; NSString *bundleIdentifier = NSBundle.mainBundle.bundleIdentifier; if (!disallow && bundleIdentifier) disallow = [blacklist containsObject:bundleIdentifier]; if (disallow) return NO; } #endif #ifdef CHECK_WHITELIST if (whitelist.count) { BOOL allow = [whitelist containsObject:processName]; NSString *bundleIdentifier = NSBundle.mainBundle.bundleIdentifier; if (!allow && bundleIdentifier) allow = [whitelist containsObject:bundleIdentifier]; if (allow) { HBLogDebug(@"Injected: whitelist"); return YES; } } #endif BOOL isSpringBoard = NSStringEqual(processName, @"SpringBoard"); BOOL isExtensionOrApp = [executablePath rangeOfString:@"/Application"].location != NSNotFound; BOOL isUILike = isSpringBoard || isExtensionOrApp; if (type & TargetTypeApps && isUILike && !isExtension) { HBLogDebug(@"Injected: app"); return YES; } if (type & TargetTypeKeyboardExtensions && isExtension) { id val = NSBundle.mainBundle.infoDictionary[@"NSExtension"][@"NSExtensionPointIdentifier"]; BOOL isKeyboardExtension = val ? NSStringEqual(val, @"com.apple.keyboard-service") : NO; if (isKeyboardExtension) HBLogDebug(@"Injected: keyboard extension"); return isKeyboardExtension; } } return NO; } #define isTarget(type) _isTarget(type, nil, nil) #ifdef CHECK_TARGET_GUI static void *observer = NULL; static void lateLoad(void); static void appLoaded(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { lateLoad(); } static void appLoadedCallback() { CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), &observer, appLoaded, (CFStringRef)UIApplicationDidFinishLaunchingNotification, NULL, CFNotificationSuspensionBehaviorCoalesce); } #endif #endif #ifdef KILL_PROCESS #include void killProcess(const char *name) { pid_t pid; int status; const char *args[] = { "killall", "-9", name, NULL }; posix_spawn(&pid, "/usr/bin/killall", NULL, NULL, (char *const *)args, NULL); waitpid(pid, &status, WEXITED); } #endif #endif