├── README.md ├── RootHide ├── VarCleanRules.h ├── Assets.xcassets │ ├── Contents.json │ ├── AppIcon.appiconset │ │ ├── icon-29.png │ │ ├── icon-40.png │ │ ├── icon-76.png │ │ ├── icon-1024.png │ │ ├── icon-20-ipad.png │ │ ├── icon-20@2x.png │ │ ├── icon-20@3x.png │ │ ├── icon-29-ipad.png │ │ ├── icon-29@2x.png │ │ ├── icon-29@3x.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-76@2x.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-20@2x-ipad.png │ │ ├── icon-29@2x-ipad.png │ │ └── Contents.json │ └── AccentColor.colorset │ │ └── Contents.json ├── roothide │ ├── module.modulemap │ ├── libroothide.tbd │ ├── roothide.h │ └── stub.h ├── VarCleanController.h ├── SettingViewController.h ├── BlacklistViewController.h ├── roothide.h ├── Info.plist ├── AppDelegate.h ├── UIComponent │ ├── ZFCheckbox.h │ └── ZFCheckbox.m ├── AppDataCleaner │ └── AppDataCleaner.m ├── NSJSONSerialization+Comments.h ├── zh_CN.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── AppInfo.h ├── ar.lproj │ └── Localizable.strings ├── en.lproj │ └── Localizable.strings ├── vi.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── de.lproj │ └── Localizable.strings ├── fr.lproj │ └── Localizable.strings ├── AppInfo.m ├── SettingViewController.m ├── main.m ├── NSJSONSerialization+Comments.m ├── BlacklistViewController.m ├── AppDelegate.m ├── VarCleanController.m └── VarCleanRules.json ├── .gitattributes ├── .gitignore ├── layout └── DEBIAN │ └── postinst ├── RootHide.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ ├── shadow.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ ├── huynguyen.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ └── 123456qwerty.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ ├── shadow.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── 123456qwerty.xcuserdatad │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ └── admin.xcuserdatad │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist ├── xcshareddata │ └── xcschemes │ │ └── RootHide.xcscheme └── project.pbxproj ├── control ├── entitlements.plist ├── LICENSE ├── Makefile └── nickchan.entitlements /README.md: -------------------------------------------------------------------------------- 1 | # RootHideManagerApp 2 | RootHideManagerApp 3 | -------------------------------------------------------------------------------- /RootHide/VarCleanRules.h: -------------------------------------------------------------------------------- 1 | #define VARCLEANRULESHASH 63501245 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | **/.DS_Store 3 | .theos/ 4 | packages/ 5 | **/*.xcuserstate 6 | 7 | -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /RootHide/roothide/module.modulemap: -------------------------------------------------------------------------------- 1 | module roothide { 2 | header "roothide.h" 3 | 4 | link "roothide" 5 | 6 | export * 7 | } 8 | -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-29.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-76.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-1024.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-20-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-20-ipad.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-29-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-29-ipad.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png -------------------------------------------------------------------------------- /layout/DEBIAN/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | uicache -p /Applications/RootHide.app 4 | chown 0:0 /Applications/RootHide.app/RootHide 5 | chmod +s /Applications/RootHide.app/RootHide 6 | -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@2x-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-20@2x-ipad.png -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@2x-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide/Assets.xcassets/AppIcon.appiconset/icon-29@2x-ipad.png -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/xcuserdata/shadow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /RootHide/VarCleanController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface varCleanController : UITableViewController 6 | 7 | + (instancetype)sharedInstance; 8 | 9 | @end 10 | 11 | NS_ASSUME_NONNULL_END 12 | -------------------------------------------------------------------------------- /RootHide/SettingViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface SettingViewController : UITableViewController 6 | 7 | + (instancetype)sharedInstance; 8 | 9 | @end 10 | 11 | NS_ASSUME_NONNULL_END 12 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.xcworkspace/xcuserdata/shadow.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide.xcodeproj/project.xcworkspace/xcuserdata/shadow.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.xcworkspace/xcuserdata/huynguyen.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide.xcodeproj/project.xcworkspace/xcuserdata/huynguyen.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.xcworkspace/xcuserdata/123456qwerty.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roothide/RootHideManagerApp/HEAD/RootHide.xcodeproj/project.xcworkspace/xcuserdata/123456qwerty.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /RootHide/BlacklistViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface BlacklistViewController : UITableViewController 6 | 7 | + (instancetype)sharedInstance; 8 | 9 | @end 10 | 11 | NS_ASSUME_NONNULL_END 12 | -------------------------------------------------------------------------------- /RootHide/roothide.h: -------------------------------------------------------------------------------- 1 | #if defined(ROOTHIDE_USE_STUB) && defined(THEOS_PACKAGE_SCHEME_ROOTHIDE) 2 | #error "ROOTHIDE_USE_STUB defined, but THEOS_PACKAGE_SCHEME=roothide" 3 | #elif defined(ROOTHIDE_USE_STUB) && !defined(THEOS_PACKAGE_SCHEME_ROOTHIDE) 4 | #include "roothide/stub.h" 5 | #else 6 | #include "roothide/roothide.h" 7 | #endif 8 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RootHide/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSAppTransportSecurity 6 | 7 | NSAllowsArbitraryLoads 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /control: -------------------------------------------------------------------------------- 1 | Package: com.roothide.manager 2 | Name: RootHide Manager 3 | Version: 1.3.6 4 | Architecture: iphoneos-arm64e 5 | Depends: firmware (>= 15.0) 6 | Description: Configuare RootHide's Features 7 | Maintainer: roothide 8 | Author: roothide 9 | Section: System 10 | Icon: 11 | Depiction: https://github.com/roothide/RootHideManagerApp 12 | Support: https://github.com/roothide/RootHideManagerApp 13 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/xcuserdata/123456qwerty.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | abcd.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /RootHide/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #include "roothide.h" 3 | 4 | @interface AppDelegate : UIResponder 5 | 6 | @property (strong, nonatomic) UIWindow *window; 7 | 8 | + (id)getDefaultsForKey:(NSString*)value; 9 | + (void)setDefaults:(NSObject*)value forKey:(NSString*)key; 10 | 11 | + (void)showAlert:(UIAlertController*)alert; 12 | + (void)showMessage:(NSString*)msg title:(NSString*)title; 13 | 14 | @end 15 | 16 | #define Localized(x) NSLocalizedString(x,nil) 17 | 18 | -------------------------------------------------------------------------------- /RootHide/UIComponent/ZFCheckbox.h: -------------------------------------------------------------------------------- 1 | // 2 | // ZFCheckbox.h 3 | // ZFCheckbox 4 | // 5 | // Created by Amornchai Kanokpullwad on 30/03/2015. 6 | // 7 | // 8 | 9 | #import 10 | 11 | IB_DESIGNABLE 12 | @interface ZFCheckbox : UIControl 13 | 14 | @property (nonatomic) CGFloat lineWidth; 15 | @property (nonatomic, strong) UIColor *lineColor; 16 | @property (nonatomic, strong) UIColor *lineBackgroundColor; 17 | @property (nonatomic) CGFloat animateDuration; 18 | 19 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/xcuserdata/shadow.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RootHide.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | abcd.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | A672ABAE27F748DE00878787 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RootHide/roothide/libroothide.tbd: -------------------------------------------------------------------------------- 1 | --- !tapi-tbd 2 | tbd-version: 4 3 | targets: [ arm64-ios, arm64e-ios ] 4 | uuids: 5 | - target: arm64-ios 6 | value: F3D9D859-0E30-37E9-9DE5-2EA9B478A187 7 | - target: arm64e-ios 8 | value: F7D1DA7D-02AA-3442-A68C-7F7B4EA02D22 9 | flags: [ not_app_extension_safe ] 10 | install-name: '@loader_path/.jbroot/usr/lib/libroothide.dylib' 11 | current-version: 0 12 | compatibility-version: 0 13 | exports: 14 | - targets: [ arm64-ios, arm64e-ios ] 15 | symbols: [ __Z6jbrootNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE, 16 | __Z6jbrootP8NSString, __Z6rootfsNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE, 17 | __Z6rootfsP8NSString, _jbrand, _jbroot, _jbroot_alloc, _jbrootat_alloc, 18 | _rootfs, _rootfs_alloc ] 19 | ... 20 | -------------------------------------------------------------------------------- /RootHide/AppDataCleaner/AppDataCleaner.m: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #import "AppDelegate.h" 4 | #import "AppInfo.h" 5 | 6 | #ifndef DEBUG 7 | #define NSLog(...) 8 | #endif 9 | 10 | BOOL isUUIDPathOf(NSString* path, NSString* parent); 11 | 12 | NSString* clearAppData(AppInfo* app) 13 | { 14 | NSString* error = nil; 15 | NSLog(@"app.containerURL=%@", app.containerURL); 16 | 17 | if(app.containerURL 18 | && isUUIDPathOf(app.containerURL.path, @"/private/var/mobile/Containers/Data/Application/") 19 | && [NSFileManager.defaultManager fileExistsAtPath:app.containerURL.path]) 20 | { 21 | if([NSFileManager.defaultManager removeItemAtURL:app.containerURL error:&error]) { 22 | NSLog(@"removed %@", app.containerURL); 23 | } else { 24 | error = [NSString stringWithFormat:Localized(@"Failed to remove app data container:\n%@"),error]; 25 | } 26 | } 27 | return error; 28 | } 29 | -------------------------------------------------------------------------------- /entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | platform-application 6 | 7 | com.apple.private.security.no-sandbox 8 | 9 | com.apple.security.get-task-allow 10 | 11 | get-task-allow 12 | 13 | task_for_pid-allow 14 | 15 | run-unsigned-code 16 | 17 | proc_info-allow 18 | 19 | com.apple.private.security.storage.AppBundles 20 | 21 | com.apple.private.security.storage.AppDataContainers 22 | 23 | com.apple.private.persona-mgmt 24 | 25 | 26 | com.apple.security.iokit-user-client-class 27 | 28 | AGXDeviceUserClient 29 | IOHDIXControllerUserClient 30 | IOSurfaceRootUserClient 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 RootHide 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ARCHS = arm64 arm64e 2 | TARGET = iphone:latest:15.0 3 | DEB_ARCH = iphoneos-arm64e 4 | IPHONEOS_DEPLOYMENT_TARGET = 15.0 5 | 6 | INSTALL_TARGET_PROCESSES = RootHide 7 | 8 | THEOS_PACKAGE_SCHEME = roothide 9 | 10 | FINALPACKAGE ?= 1 11 | DEBUG ?= 0 12 | 13 | include $(THEOS)/makefiles/common.mk 14 | 15 | XCODE_SCHEME = RootHide 16 | 17 | XCODEPROJ_NAME = RootHide 18 | 19 | RootHide_XCODEFLAGS = MARKETING_VERSION=$(THEOS_PACKAGE_BASE_VERSION) \ 20 | IPHONEOS_DEPLOYMENT_TARGET="$(IPHONEOS_DEPLOYMENT_TARGET)" \ 21 | CODE_SIGN_IDENTITY="" \ 22 | AD_HOC_CODE_SIGNING_ALLOWED=YES 23 | RootHide_XCODE_SCHEME = $(XCODE_SCHEME) 24 | RootHide_CODESIGN_FLAGS = -Sentitlements.plist 25 | RootHide_INSTALL_PATH = /Applications 26 | 27 | include $(THEOS_MAKE_PATH)/xcodeproj.mk 28 | 29 | before-all:: 30 | echo "#define VARCLEANRULESHASH" $$(cksum -o 3 RootHide/VarCleanRules.json | awk '{print $$1}') > RootHide/VarCleanRules.h 31 | 32 | clean:: 33 | rm -rf ./packages/* 34 | 35 | before-package:: 36 | ldid -M -S./nickchan.entitlements ./.theos/_/Applications/RootHide.app/RootHide 37 | 38 | after-install:: 39 | install.exec 'uiopen -b com.roothide.manager' 40 | -------------------------------------------------------------------------------- /RootHide/roothide/roothide.h: -------------------------------------------------------------------------------- 1 | #ifndef ROOTHIDE_H 2 | #define ROOTHIDE_H 3 | 4 | #pragma GCC diagnostic push 5 | #pragma GCC diagnostic ignored "-Wnullability-completeness" 6 | 7 | #include 8 | 9 | #ifdef __cplusplus 10 | #include 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #endif 16 | 17 | #ifdef __cplusplus 18 | extern "C" { 19 | #endif 20 | 21 | const char* rootfs_alloc(const char* path); /* free after use */ 22 | const char* jbroot_alloc(const char* path); /* free after use */ 23 | const char* jbrootat_alloc(int fd, const char* path); /* free after use */ 24 | 25 | // 26 | 27 | /* get the system-wide random value of current jailbreak state */ 28 | unsigned long long jbrand(); 29 | 30 | /* convert jbroot-based path to rootfs-based path (auto cache) */ 31 | const char* jbroot(const char* path); 32 | 33 | /* convert rootfs-based path to jbroot-based path (auto cache) */ 34 | const char* rootfs(const char* path); 35 | 36 | #ifdef __OBJC__ 37 | NSString* _Nonnull __attribute__((overloadable)) jbroot(NSString* _Nonnull path); 38 | NSString* _Nonnull __attribute__((overloadable)) rootfs(NSString* _Nonnull path); 39 | #endif 40 | 41 | #ifdef __cplusplus 42 | } 43 | #endif 44 | 45 | #ifdef __cplusplus 46 | std::string jbroot(std::string path); 47 | std::string rootfs(std::string path); 48 | #endif 49 | 50 | #pragma GCC diagnostic pop 51 | 52 | #endif /* ROOTHIDE_H */ 53 | -------------------------------------------------------------------------------- /RootHide/roothide/stub.h: -------------------------------------------------------------------------------- 1 | #ifndef ROOTHIDE_H 2 | #define ROOTHIDE_H 3 | 4 | #pragma message("roothide disabled, using stub functions...") 5 | 6 | #pragma GCC diagnostic push 7 | #pragma GCC diagnostic ignored "-Wunused-function" 8 | #pragma GCC diagnostic ignored "-Wnullability-completeness" 9 | 10 | #include 11 | 12 | #ifdef __cplusplus 13 | #include 14 | #endif 15 | 16 | #ifdef __OBJC__ 17 | #import 18 | #endif 19 | 20 | //stub functions 21 | 22 | #ifdef __cplusplus 23 | extern "C" { 24 | #endif 25 | 26 | static const char* rootfs_alloc(const char* path) { return path ? strdup(path) : path; } 27 | static const char* jbroot_alloc(const char* path) { return path ? strdup(path) : path; } 28 | static const char* jbrootat_alloc(int fd, const char* path) { return path ? strdup(path) : path; } 29 | 30 | static unsigned long long jbrand() { return 0; } 31 | static const char* jbroot(const char* path) { return path; } 32 | static const char* rootfs(const char* path) { return path; } 33 | 34 | #ifdef __OBJC__ 35 | static NSString* _Nonnull __attribute__((overloadable)) jbroot(NSString* _Nonnull path) { return path; } 36 | static NSString* _Nonnull __attribute__((overloadable)) rootfs(NSString* _Nonnull path) { return path; } 37 | #endif 38 | 39 | #ifdef __cplusplus 40 | } 41 | #endif 42 | 43 | #ifdef __cplusplus 44 | static std::string jbroot(std::string path) { return path; } 45 | static std::string rootfs(std::string path) { return path; } 46 | #endif 47 | 48 | #pragma GCC diagnostic pop 49 | 50 | #endif /* ROOTHIDE_H */ 51 | -------------------------------------------------------------------------------- /RootHide/NSJSONSerialization+Comments.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSJSONSerialization+Comments.h 3 | // ABCodeEditor 4 | // 5 | // Created by Alexander Blach on 22.07.14. 6 | // Copyright (c) 2014 Alexander Blach. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NSJSONSerialization (Comments) 12 | 13 | + (NSData *)dataByStrippingJSONCommentsAndWhiteSpaceOfUTF8Data:(NSData *)data 14 | skipBytes:(NSUInteger)bytesToSkip; 15 | 16 | // preferred method, since it doesn't need to convert an NSString if the data is encoded with UTF-8 17 | + (id)JSONObjectWithCommentedData:(NSData *)data 18 | options:(NSJSONReadingOptions)opt 19 | error:(NSError **)error; 20 | 21 | + (id)JSONObjectWithCommentedContentsOfURL:(NSURL *)url 22 | options:(NSJSONReadingOptions)opt 23 | error:(NSError **)error; 24 | 25 | + (id)JSONObjectWithCommentedContentsOfFile:(NSString *)path 26 | options:(NSJSONReadingOptions)opt 27 | error:(NSError **)error; 28 | 29 | + (id)JSONObjectWithCommentedString:(NSString *)string 30 | options:(NSJSONReadingOptions)opt 31 | error:(NSError **)error; 32 | 33 | 34 | // convenience method if you need an NSString instead of NSData 35 | + (NSString *)stringWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error; 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /RootHide/zh_CN.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "黑名单"; 3 | "name or identifier" = "名字或者标识符"; 4 | 5 | "varClean" = "var清理"; 6 | "Clean" = "清理"; 7 | "SelectAll" = "选择全部"; 8 | 9 | "Setting" = "设置"; 10 | 11 | "General" = "通用"; 12 | "Whitelist Mode" = "白名单模式"; 13 | "auto blacklist newly installed apps" = "自动将新安装的应用列入黑名单"; 14 | 15 | "Advanced" = "高级"; 16 | "Edit varClean Rules" = "编辑清理var垃圾文件时的规则"; 17 | "view the rules file in Filza" = "查看Filza中的规则文件"; 18 | 19 | "Misc" = "其他"; 20 | "Hide xinaA15 Files" = "隐藏xinaA15文件"; 21 | "hide xinaA15 files without uninstall it" = "隐藏xinaA15文件而不卸载"; 22 | 23 | 24 | 25 | "Got It" = "明白了"; 26 | 27 | "SSH Detected" = "检测到SSH"; 28 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "SSH服务已经安装,您可以通过Sileo/Zebra卸载它."; 29 | 30 | "xinaA15 detected" = "检测到xinaA15"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "xinaA15越狱文件已安装,您可以通过xinaA1五应用程序卸载它,也可以将其隐藏在RootHide应用程序的设置中."; 33 | 34 | "Process xinaA15 Files" = "处理xinaA15文件"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "xinaA15文件已被隐藏,请重新启动您的设备.\n\n如果您想再次使用xina15,可以稍后恢复."; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "xinaA15文件已还原,您可以重新启动设备以切换到xinaA15."; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "有多个xinaA15越狱文件,您可以手动恢复:\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "还原失败:找不到xinaA15文件!"; 43 | "restore failed: %@" = "还原失败: %@"; 44 | "hide failed: %@" = "隐藏失败: %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "ブラックリスト"; 3 | "name or identifier" = "名前 または 識別子"; 4 | 5 | "varClean" = "varClean"; 6 | "Clean" = "クリーン"; 7 | "SelectAll" = "すべて選択"; 8 | 9 | "Setting" = "設定"; 10 | 11 | "General" = "一般"; 12 | "Whitelist Mode" = "ホワイトリストモード"; 13 | "auto blacklist newly installed apps" = "アプリがインストールされると自動で登録します"; 14 | 15 | "Advanced" = "詳細"; 16 | "Edit varClean Rules" = "varCleanの設定"; 17 | "view the rules file in Filza" = "Filzaを起動しルールを編集します"; 18 | 19 | "Misc" = "その他"; 20 | "Hide xinaA15 Files" = "xinaA15のファイルを非表示にする"; 21 | "hide xinaA15 files without uninstall it" = "アンインストールせずにxinaA15のファイルを非表示にします"; 22 | 23 | 24 | 25 | "Got It" = "了解"; 26 | 27 | "SSH Detected" = "SSHの検出"; 28 | "SSH Service has been installed, you can uninstall it via Sileo/Zebra." = "SSHがインストールされています SileoまたはZebraを使用してアンインストールできます"; 29 | 30 | "xinaA15 detected" = "xinaA15を検出"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "xinaA15をアンインストールするかRootHideを使用して非表示にできます"; 33 | 34 | "Process xinaA15 Files" = "xinaA15のファイルを処理しています"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "xinaA15を非表示にしました 端末を再起動してください\n再度使用したい場合あとで復元できます"; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "xinaA15のファイルを復元しました 端末を再起動してxinaA15に切り替えてください"; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "複数のxinaA15のファイルを検出しました 手動で復元可能です:\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "復元に失敗: xinaA15のファイルが見つかりません"; 43 | "restore failed: %@" = "復元に失敗: %@"; 44 | "hide failed: %@" = "非表示に失敗: %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 21 | 22 | 23 | 25 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /RootHide/AppInfo.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface LSPlugInKitProxy : NSObject 4 | - (NSString *)bundleIdentifier; 5 | @property (nonatomic,readonly) NSURL *dataContainerURL; 6 | @end 7 | 8 | @interface AppInfo : NSObject 9 | @property (nonatomic, strong) NSString *infoPlistPath; 10 | 11 | @property (nonatomic, readonly) NSString* bundleIdentifier; 12 | @property (nonatomic, readonly) NSString* bundleExecutable; 13 | @property (nonatomic, readonly) NSString* name; 14 | @property (nonatomic, readonly) UIImage* icon; 15 | @property (nonatomic, readonly) NSURL *bundleURL; 16 | @property (nonatomic, readonly) NSURL *containerURL; 17 | 18 | @property (nonatomic, readonly) NSString *applicationDSID; 19 | @property (nonatomic, readonly) NSString *applicationIdentifier; 20 | @property (nonatomic, readonly) NSString *applicationType; 21 | @property (nonatomic, readonly) NSNumber *dynamicDiskUsage; 22 | 23 | @property (nonatomic, readonly) NSArray *groupIdentifiers; 24 | @property (nonatomic, readonly) NSDictionary *groupContainerURLs; 25 | @property (nonatomic, readonly) NSNumber *itemID; 26 | @property (nonatomic, readonly) NSString *itemName; 27 | @property (nonatomic, readonly) NSString *minimumSystemVersion; 28 | @property (nonatomic, readonly) NSArray *requiredDeviceCapabilities; 29 | @property (nonatomic, readonly) NSString *roleIdentifier; 30 | @property (nonatomic, readonly) NSString *sdkVersion; 31 | @property (nonatomic, readonly) NSString *shortVersionString; 32 | @property (nonatomic, readonly) NSString *sourceAppIdentifier; 33 | @property (nonatomic, readonly) NSNumber *staticDiskUsage; 34 | @property (nonatomic, readonly) NSString *teamID; 35 | @property (nonatomic, readonly) NSString *vendorName; 36 | 37 | @property (nonatomic,readonly) NSArray *plugInKitPlugins; 38 | 39 | @property (nonatomic, readonly) BOOL isHiddenApp; 40 | 41 | + (instancetype)appWithPrivateProxy:(id)privateProxy; 42 | + (instancetype)appWithBundleIdentifier:(NSString*)bundleIdentifier; 43 | 44 | @end 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /RootHide/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "Blacklist" = "القائمة السوداء"; 2 | "name or identifier" = "الاسم أو المعرف"; 3 | 4 | "varClean" = "مسح مسار var"; 5 | "Clean" = "مسح"; 6 | "SelectAll" = "تحديد الكل"; 7 | 8 | "Setting" = "الإعدادات"; 9 | 10 | "General" = "عام"; 11 | "Whitelist Mode" = "نمط القائمة البيضاء"; 12 | "auto blacklist newly installed apps" = "وضع التطبيقات المثبتة حديثًا في القائمة السوداء تلقائيًا."; 13 | 14 | "Advanced" = "متقدم"; 15 | "Edit varClean Rules" = "تعديل قواعد مسح مسار var"; 16 | "view the rules file in Filza" = "عرض ملف القواعد في Filza."; 17 | 18 | "Misc" = "متنوع"; 19 | "Hide xinaA15 Files" = "إخفاء ملفات XinaA15"; 20 | "hide xinaA15 files without uninstall it" = "إخفاء ملفات XinaA15 دون إزالته."; 21 | 22 | 23 | 24 | "Got It" = "لقد فهمت"; 25 | 26 | "SSH Detected" = "تم اكتشاف SSH"; 27 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "تم تثبيت خدمة SSH، يمكنك إلغاء تثبيتها عبر Sileo أو Zebra."; 28 | 29 | "xinaA15 detected" = "تم اكتشاف XinaA15"; 30 | 31 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "ملفات جيلبريك XinaA15 مثبتة، يمكنك إلغاء تثبيتها عبر تطبيق XinaA15 أو إخفائها من إعدادات تطبيق RootHide."; 32 | 33 | "Process xinaA15 Files" = "معالجة ملفات XinaA15"; 34 | 35 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "تم إخفاء ملفات XinaA15، يرجى إعادة تشغيل جهازك.\n\nيمكنك استعادتها لاحقا إذا كنت ترغب في استخدام XinaA15 مرةً أخرى."; 36 | 37 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "تمت استعادة ملفات XinaA15، يمكنك إعادة تشغيل جهازك لإكمال الانتقال إلى XinaA15."; 38 | 39 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "توجد عدة ملفات لجيلبريك XinaA15، يمكنك استعادة هذه الملفات يدويًا:\n\n%s/"; 40 | 41 | "restore failed: xinaA15 file not found!" = "فشلت الاستعادة: تعذر العثور على ملف XinaA15!"; 42 | "restore failed: %@" = "فشلت الاستعادة: %@"; 43 | "hide failed: %@" = "فشل الإخفاء: %@"; 44 | -------------------------------------------------------------------------------- /RootHide/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "Blacklist"; 3 | "name or identifier" = "name or identifier"; 4 | 5 | "varClean" = "varClean"; 6 | "Clean" = "Clean"; 7 | "SelectAll" = "SelectAll"; 8 | 9 | "Setting" = "Setting"; 10 | 11 | "General" = "General"; 12 | "Whitelist Mode" = "Whitelist Mode"; 13 | "auto blacklist newly installed apps" = "auto blacklist newly installed apps"; 14 | 15 | "Advanced" = "Advanced"; 16 | "Edit varClean Rules" = "Edit varClean Rules"; 17 | "view the rules file in Filza" = "view the rules file in Filza"; 18 | 19 | "Misc" = "Misc"; 20 | "Hide xinaA15 Files" = "Hide xinaA15 Files"; 21 | "hide xinaA15 files without uninstall it" = "hide xinaA15 files without uninstall it"; 22 | 23 | 24 | 25 | "Got It" = "Got It"; 26 | 27 | "SSH Detected" = "SSH Detected"; 28 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "SSH Server has been installed, you can uninstall it via Sileo/Zebra."; 29 | 30 | "xinaA15 detected" = "xinaA15 detected"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app."; 33 | 34 | "Process xinaA15 Files" = "Process xinaA15 Files"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again."; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "xinaA15 files has been restored, you can reboot your device to switch to xinaA15."; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "restore failed: xinaA15 file not found!"; 43 | "restore failed: %@" = "restore failed: %@"; 44 | "hide failed: %@" = "hide failed: %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide/vi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "Blacklist"; 3 | "name or identifier" = "tên hoặc định danh"; 4 | 5 | "varClean" = "Dọn var"; 6 | "Clean" = "Dọn sạch"; 7 | "SelectAll" = "Chọn tất cả"; 8 | 9 | "Setting" = "Cài đặt"; 10 | 11 | "General" = "Cài đặt chung"; 12 | "Whitelist Mode" = "Chế độ Whitelist"; 13 | "auto blacklist newly installed apps" = "Tự động bật blacklist cho app mới cài đặt"; 14 | 15 | "Advanced" = "Nâng cao"; 16 | "Edit varClean Rules" = "Sửa quy tắc dọn sạch /var"; 17 | "view the rules file in Filza" = "Xem quy tắc file ở Filza"; 18 | 19 | "Misc" = "Linh tinh"; 20 | "Hide xinaA15 Files" = "Ẩn file XinaA15"; 21 | "hide xinaA15 files without uninstall it" = "Ẩn file XinaA15 mà không gỡ cài đặt"; 22 | 23 | 24 | 25 | "Got It" = "Okay"; 26 | 27 | "SSH Detected" = "Phát hiện SSH"; 28 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "SSH Server đã được cài đặt, bạn có thể gỡ cài đặt nó qua Sileo/Zebra."; 29 | 30 | "xinaA15 detected" = "Phát hiện XinaA15"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "Máy đã jailbreak bằng XinaA15, bạn có thể gỡ cài đặt qua XinaA15 hoặc ẩn nó trong cài đặt của RootHide."; 33 | 34 | "Process xinaA15 Files" = "Xử lý file XinaA15"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "Các file của XinaA15 đã bị ẩn, vui lòng khởi động lại thiết bị của bạn.\n\nBạn có thể khôi phục nó sau nếu muốn sử dụng lại XinaA15."; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "Các file XinaA15 đã được khôi phục, bạn có thể khởi động lại thiết bị của mình để chuyển sang XinaA15"; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "Có nhiều file XinaA15 jailbreak, bạn có thể khôi phục thủ công:\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "Khôi phục lỗi: không tìm thấy file XinaA15!"; 43 | "restore failed: %@" = "Khôi phục lỗi: %@"; 44 | "hide failed: %@" = "Ẩn lỗi: %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "Lista nera"; 3 | "name or identifier" = "Nome o ID"; 4 | 5 | "varClean" = "Pulisci var"; 6 | "Clean" = "Pulisci"; 7 | "SelectAll" = "Seleziona tutti"; 8 | 9 | "Setting" = "Impostazioni"; 10 | 11 | "General" = "Generali"; 12 | "Whitelist Mode" = "Modalitá lista bianca"; 13 | "auto blacklist newly installed apps" = "Lista nera automatica per le nuove app installate"; 14 | 15 | "Advanced" = "Avanzate"; 16 | "Edit varClean Rules" = "Modifica le regole di Pulisci var"; 17 | "view the rules file in Filza" = "Visualizza le regole dei file in Filza"; 18 | 19 | "Misc" = "Varie"; 20 | "Hide xinaA15 Files" = "Nascondi i file di xinaA15"; 21 | "hide xinaA15 files without uninstall it" = "Nascondi i file di xinaA15 senza disintallarli"; 22 | 23 | 24 | 25 | "Got It" = "Fatto"; 26 | 27 | "SSH Detected" = "SSH Rilevato"; 28 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "Il servizio SSH è stato installato, puoi disintallarlo tramite Sileo/Zebra."; 29 | 30 | "xinaA15 detected" = "xinaA15 Rilevato"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "I file del jailbreak xinaA15 sono stati installati, puoi disinstallarlo tramite l'app xinaA15 o nasconderli nelle impostazioni dell'app RootHide."; 33 | 34 | "Process xinaA15 Files" = "Processo i file di xinaA15"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "I file di xinaA15 sono stati nascosti, per favore riavvia il dispositivo.\n\npuoi recuperarli dopo se vuoi usare di nuovo xinaA15."; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "I file di xinaA15 sono stati recuperati, puoi riavviare il dispositivo per cambiare in xinaA15."; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "Ci sono molteplici file del jailbreak xinaA15, puoi recuperarli manualmente:\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "Recupero fallito: file di xinaA15 non trovati!"; 43 | "restore failed: %@" = "Recupero fallito: %@"; 44 | "hide failed: %@" = "Nascondere fallito: %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "Blacklist" = "Blacklist"; 2 | 3 | "name or identifier" = "Name oder Identifier"; 4 | 5 | "varClean" = "var Bereinigen"; 6 | "Clean" = "Bereinigen"; 7 | "SelectAll" = "Alles auswählen"; 8 | 9 | "Setting" = "Einstellungen"; 10 | 11 | "General" = "Allgemein"; 12 | "Whitelist Mode" = "Whitelist-Modus"; 13 | "auto blacklist newly installed apps" = "Automatische Blacklist für neu installierte Apps"; 14 | 15 | "Advanced" = "Erweitert"; 16 | "Edit varClean Rules" = "Regeln für \"var Bereinigen\" bearbeiten"; 17 | "view the rules file in Filza" = "Regeldatei in Filza anzeigen"; 18 | 19 | "Misc" = "Verschiedenes"; 20 | "Hide xinaA15 Files" = "xinaA15-Dateien ausblenden"; 21 | "hide xinaA15 files without uninstall it" = "xinaA15-Dateien ausblenden, ohne sie zu deinstallieren"; 22 | 23 | "Got It" = "Verstanden"; 24 | 25 | "SSH Detected" = "SSH erkannt"; 26 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "SSH-Dienst wurde installiert, Sie können ihn über Sileo/Zebra deinstallieren."; 27 | 28 | "xinaA15 detected" = "xinaA15 erkannt"; 29 | 30 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "Die xinaA15-Jailbreak-Datei wurde installiert. Sie können sie über die xinaA15-App deinstallieren oder in den Einstellungen der RootHide-App ausblenden."; 31 | 32 | "Process xinaA15 Files" = "xinaA15-Dateien verarbeiten"; 33 | 34 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "xinaA15-Dateien wurden ausgeblendet. Bitte starten Sie Ihr Gerät neu.\n\nSie können sie später wiederherstellen, wenn Sie xinaA15 erneut verwenden möchten."; 35 | 36 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "xinaA15-Dateien wurden wiederhergestellt. Sie können Ihr Gerät neu starten, um zu xinaA15 zu wechseln."; 37 | 38 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "Es gibt mehrere xinaA15-Jailbreak-Dateien. Sie können sie manuell wiederherstellen:\n\n%s/"; 39 | 40 | "restore failed: xinaA15 file not found!" = "Wiederherstellung fehlgeschlagen: xinaA15-Datei nicht gefunden!"; 41 | "restore failed: %@" = "Wiederherstellung fehlgeschlagen: %@"; 42 | "hide failed: %@" = "Ausblenden fehlgeschlagen: %@"; 43 | -------------------------------------------------------------------------------- /RootHide/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | "Blacklist" = "Liste noire"; 3 | "name or identifier" = "nom ou identifiant"; 4 | 5 | "varClean" = "varClean"; 6 | "Clean" = "Faire le ménage"; 7 | "SelectAll" = "Tout sélectionner"; 8 | 9 | "Setting" = "Paramètre"; 10 | 11 | "General" = "Général"; 12 | "Whitelist Mode" = "Mode liste blanche"; 13 | "auto blacklist newly installed apps" = "liste noire automatique des applications nouvellement installées"; 14 | 15 | "Advanced" = "Avancée"; 16 | "Edit varClean Rules" = "Modifier les règles varClean"; 17 | "view the rules file in Filza" = "afficher le fichier de règles dans Filza"; 18 | 19 | "Misc" = "Divers"; 20 | "Hide xinaA15 Files" = "Masquer les fichiers xinaA15"; 21 | "hide xinaA15 files without uninstall it" = "masquer les fichiers xinaA15 sans les désinstaller"; 22 | 23 | 24 | 25 | "Got It" = "J'ai compris"; 26 | 27 | "SSH Detected" = "SSH détecté"; 28 | "SSH Server has been installed, you can uninstall it via Sileo/Zebra." = "Le Server SSH a été installé, vous pouvez le désinstaller via Sileo/Zebra."; 29 | 30 | "xinaA15 detected" = "xinaA15 détecté"; 31 | 32 | "xinaA15 jailbreak file has been installed, you can uninstall it via xinaA15 app or hide it in the settings of the RootHide app." = "Le fichier jailbreak xinaA15 a été installé, vous pouvez le désinstaller via l'application xinaA15 ou le masquer dans les paramètres de l'application RootHide."; 33 | 34 | "Process xinaA15 Files" = "Traiter les fichiers xinaA15"; 35 | 36 | "xinaA15 files has been hidden, please reboot your device.\n\nyou can restore it later if you want to use xinaA15 again." = "Les fichiers xinaA15 ont été masqués, veuillez redémarrer votre appareil.\n\vous pourrez le restaurer plus tard si vous souhaitez utiliser à nouveau xinaA15."; 37 | 38 | "xinaA15 files has been restored, you can reboot your device to switch to xinaA15." = "Les fichiers xinaA15 ont été restaurés, vous pouvez redémarrer votre appareil pour passer à xinaA15."; 39 | 40 | "there are multiple xinaA15 jailbreak files, you can restore it manually:\n\n%s/" = "il existe plusieurs fichiers de jailbreak xinaA15, vous pouvez le restaurer manuellement :\n\n%s/"; 41 | 42 | "restore failed: xinaA15 file not found!" = "échec de la restauration : fichier xinaA15 introuvable !"; 43 | "restore failed: %@" = "échec de la restauration : %@"; 44 | "hide failed: %@" = "échec du masquage : %@"; 45 | 46 | -------------------------------------------------------------------------------- /RootHide/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-20@2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "icon-20@3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "icon-29.png", 17 | "idiom" : "iphone", 18 | "scale" : "1x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "icon-29@2x.png", 23 | "idiom" : "iphone", 24 | "scale" : "2x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "icon-29@3x.png", 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "29x29" 32 | }, 33 | { 34 | "filename" : "icon-40@2x.png", 35 | "idiom" : "iphone", 36 | "scale" : "2x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "icon-40@3x.png", 41 | "idiom" : "iphone", 42 | "scale" : "3x", 43 | "size" : "40x40" 44 | }, 45 | { 46 | "filename" : "icon-60@2x.png", 47 | "idiom" : "iphone", 48 | "scale" : "2x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "icon-60@3x.png", 53 | "idiom" : "iphone", 54 | "scale" : "3x", 55 | "size" : "60x60" 56 | }, 57 | { 58 | "filename" : "icon-20-ipad.png", 59 | "idiom" : "ipad", 60 | "scale" : "1x", 61 | "size" : "20x20" 62 | }, 63 | { 64 | "filename" : "icon-20@2x-ipad.png", 65 | "idiom" : "ipad", 66 | "scale" : "2x", 67 | "size" : "20x20" 68 | }, 69 | { 70 | "filename" : "icon-29-ipad.png", 71 | "idiom" : "ipad", 72 | "scale" : "1x", 73 | "size" : "29x29" 74 | }, 75 | { 76 | "filename" : "icon-29@2x-ipad.png", 77 | "idiom" : "ipad", 78 | "scale" : "2x", 79 | "size" : "29x29" 80 | }, 81 | { 82 | "filename" : "icon-40.png", 83 | "idiom" : "ipad", 84 | "scale" : "1x", 85 | "size" : "40x40" 86 | }, 87 | { 88 | "filename" : "icon-40@2x.png", 89 | "idiom" : "ipad", 90 | "scale" : "2x", 91 | "size" : "40x40" 92 | }, 93 | { 94 | "filename" : "icon-76.png", 95 | "idiom" : "ipad", 96 | "scale" : "1x", 97 | "size" : "76x76" 98 | }, 99 | { 100 | "filename" : "icon-76@2x.png", 101 | "idiom" : "ipad", 102 | "scale" : "2x", 103 | "size" : "76x76" 104 | }, 105 | { 106 | "filename" : "icon-83.5@2x.png", 107 | "idiom" : "ipad", 108 | "scale" : "2x", 109 | "size" : "83.5x83.5" 110 | }, 111 | { 112 | "filename" : "icon-1024.png", 113 | "idiom" : "ios-marketing", 114 | "scale" : "1x", 115 | "size" : "1024x1024" 116 | } 117 | ], 118 | "info" : { 119 | "author" : "xcode", 120 | "version" : 1 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/xcshareddata/xcschemes/RootHide.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /RootHide/UIComponent/ZFCheckbox.m: -------------------------------------------------------------------------------- 1 | // 2 | // ZFCheckbox.m 3 | // ZFCheckbox 4 | // 5 | // Created by Amornchai Kanokpullwad on 30/03/2015. 6 | // 7 | // 8 | 9 | #import "ZFCheckbox.h" 10 | 11 | CGFloat const kLine1UnselectedStart = 0.2; 12 | CGFloat const kLine1UnselectedEnd = 1.0; 13 | CGFloat const kLine1SelectedStart = 0; 14 | CGFloat const kLine1SelectedEnd = 0.15; 15 | 16 | CGFloat const kLine2UnselectedStart = 0.41; 17 | CGFloat const kLine2UnselectedEnd = 1.0; 18 | CGFloat const kLine2SelectedStart = 0.0; 19 | CGFloat const kLine2SelectedEnd = 0.4; 20 | 21 | @interface ZFCheckbox () 22 | @property (nonatomic, strong) CAShapeLayer *line1Layer; 23 | @property (nonatomic, strong) CAShapeLayer *line2Layer; 24 | @end 25 | 26 | @implementation ZFCheckbox 27 | 28 | - (instancetype)initWithCoder:(NSCoder *)aDecoder 29 | { 30 | self = [super initWithCoder:aDecoder]; 31 | if (self) { 32 | [self setup]; 33 | } 34 | return self; 35 | } 36 | 37 | - (instancetype)initWithFrame:(CGRect)frame 38 | { 39 | self = [super initWithFrame:frame]; 40 | if (self) { 41 | [self setup]; 42 | } 43 | return self; 44 | } 45 | 46 | - (void)setup 47 | { 48 | // default 49 | self.lineWidth = 1.2; 50 | self.lineColor = [UIColor systemBlueColor]; 51 | self.lineBackgroundColor = [UIColor clearColor]; 52 | self.backgroundColor = [UIColor clearColor]; 53 | self.animateDuration = 0.3; 54 | 55 | self.line1Layer = [CAShapeLayer layer]; 56 | self.line2Layer = [CAShapeLayer layer]; 57 | 58 | [self.layer addSublayer:self.line1Layer]; 59 | [self.layer addSublayer:self.line2Layer]; 60 | } 61 | 62 | - (void)drawRect:(CGRect)rect 63 | { 64 | CGRect insetRect = CGRectInset(rect, self.lineWidth, self.lineWidth); 65 | UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:insetRect]; 66 | path.lineWidth = self.lineWidth; 67 | [self.lineBackgroundColor setStroke]; 68 | [path stroke]; 69 | } 70 | 71 | - (void)layoutSubviews 72 | { 73 | [super layoutSubviews]; 74 | 75 | self.line1Layer.strokeColor = self.line2Layer.strokeColor = self.lineColor.CGColor; 76 | self.line1Layer.fillColor = self.line2Layer.fillColor = [UIColor clearColor].CGColor; 77 | self.line1Layer.lineCap = self.line2Layer.lineCap = kCALineCapRound; 78 | self.line1Layer.lineJoin = self.line2Layer.lineJoin = kCALineJoinRound; 79 | self.line1Layer.lineWidth = self.line2Layer.lineWidth = self.lineWidth; 80 | 81 | CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 82 | CGRect insetRect = CGRectInset(self.bounds, self.lineWidth, self.lineWidth); 83 | CGFloat radius = (CGRectGetWidth(insetRect) > CGRectGetHeight(insetRect) ? CGRectGetHeight(insetRect) : CGRectGetWidth(insetRect)) / 2.0; 84 | CGPoint startPoint = CGPointMake(center.x - 0.25 * radius, center.y + 0.45 * radius); 85 | 86 | CGFloat angle1 = 13 * M_PI/12; 87 | CGFloat angle2 = 9 * M_PI/5; 88 | 89 | UIBezierPath *path1 = [UIBezierPath bezierPath]; 90 | [path1 moveToPoint:startPoint]; 91 | [path1 addArcWithCenter:center radius:radius startAngle:angle1 endAngle:angle2 clockwise:NO]; 92 | 93 | UIBezierPath *path2 = [UIBezierPath bezierPath]; 94 | [path2 moveToPoint:startPoint]; 95 | [path2 addArcWithCenter:center radius:radius startAngle:angle2 endAngle:angle1 clockwise:NO]; 96 | 97 | self.line1Layer.path = path1.CGPath; 98 | self.line2Layer.path = path2.CGPath; 99 | 100 | [self setSelected:self.selected animated:NO]; 101 | } 102 | 103 | - (void)setSelected:(BOOL)selected 104 | { 105 | [self setSelected:selected animated:NO]; 106 | } 107 | 108 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated 109 | { 110 | [super setSelected:selected]; 111 | 112 | [CATransaction begin]; 113 | [CATransaction setAnimationDuration:animated ? self.animateDuration : 0]; 114 | 115 | if (self.selected) { 116 | self.lineWidth = 2.0; 117 | self.lineColor = [UIColor systemBlueColor]; 118 | self.line1Layer.strokeStart = kLine1SelectedStart; 119 | self.line1Layer.strokeEnd = kLine1SelectedEnd; 120 | self.line2Layer.strokeStart = kLine2SelectedStart; 121 | self.line2Layer.strokeEnd = kLine2SelectedEnd; 122 | } else { 123 | self.lineWidth = 1.2; 124 | self.lineColor = [UIColor systemGrayColor]; 125 | self.line1Layer.strokeStart = kLine1UnselectedStart; 126 | self.line1Layer.strokeEnd = kLine1UnselectedEnd; 127 | self.line2Layer.strokeStart = kLine2UnselectedStart; 128 | self.line2Layer.strokeEnd = kLine2UnselectedEnd; 129 | } 130 | 131 | self.line1Layer.lineWidth = self.line2Layer.lineWidth = self.lineWidth; 132 | self.line1Layer.strokeColor = self.line2Layer.strokeColor = self.lineColor.CGColor; 133 | 134 | [CATransaction commit]; 135 | 136 | } 137 | 138 | - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event 139 | { 140 | [super endTrackingWithTouch:touch withEvent:event]; 141 | if (CGRectContainsPoint(self.bounds,[touch locationInView:self])) 142 | { 143 | [self setSelected:!self.selected animated:YES]; 144 | [self sendActionsForControlEvents:UIControlEventValueChanged]; 145 | } 146 | } 147 | 148 | @end 149 | -------------------------------------------------------------------------------- /RootHide/AppInfo.m: -------------------------------------------------------------------------------- 1 | // https://github.com/wujianguo/iOSAppsInfo 2 | // modified by Shadow- 3 | 4 | #import "AppInfo.h" 5 | #import 6 | 7 | @interface UIImage () 8 | + (id)_iconForResourceProxy:(id)arg1 variant:(int)arg2 variantsScale:(float)arg3; 9 | + (id)_applicationIconImageForBundleIdentifier:(id)arg1 format:(int)arg2 scale:(double)arg3; 10 | @end 11 | 12 | #pragma mark - 13 | 14 | @interface PrivateApi_LSApplicationProxy 15 | 16 | + (instancetype)applicationProxyForIdentifier:(NSString*)identifier; 17 | @property (nonatomic, readonly) NSString* localizedShortName; 18 | @property (nonatomic, readonly) NSString* localizedName; 19 | @property (nonatomic, readonly) NSString* bundleIdentifier; 20 | @property (nonatomic, readonly) NSString* bundleExecutable; 21 | @property (nonatomic, readonly) NSArray* appTags; 22 | 23 | @property (nonatomic, readonly) NSString *applicationDSID; 24 | @property (nonatomic, readonly) NSString *applicationIdentifier; 25 | @property (nonatomic, readonly) NSString *applicationType; 26 | @property (nonatomic, readonly) NSNumber *dynamicDiskUsage; 27 | @property (nonatomic, readonly) NSURL *bundleURL; 28 | @property (nonatomic, readonly) NSURL *containerURL; 29 | 30 | @property (nonatomic, readonly) NSArray *groupIdentifiers; 31 | @property (nonatomic, readonly) NSDictionary *groupContainerURLs; 32 | @property (nonatomic, readonly) NSNumber *itemID; 33 | @property (nonatomic, readonly) NSString *itemName; 34 | @property (nonatomic, readonly) NSString *minimumSystemVersion; 35 | @property (nonatomic, readonly) NSArray *requiredDeviceCapabilities; 36 | @property (nonatomic, readonly) NSString *roleIdentifier; 37 | @property (nonatomic, readonly) NSString *sdkVersion; 38 | @property (nonatomic, readonly) NSString *shortVersionString; 39 | @property (nonatomic, readonly) NSString *sourceAppIdentifier; 40 | @property (nonatomic, readonly) NSNumber *staticDiskUsage; 41 | @property (nonatomic, readonly) NSString *teamID; 42 | @property (nonatomic, readonly) NSString *vendorName; 43 | 44 | @property (nonatomic,readonly) NSArray *plugInKitPlugins; 45 | 46 | @end 47 | 48 | 49 | @implementation AppInfo 50 | { 51 | PrivateApi_LSApplicationProxy* _applicationProxy; 52 | UIImage* _icon; 53 | } 54 | 55 | - (NSString*)name 56 | { 57 | NSString *languageCode = [[NSLocale preferredLanguages] firstObject]; 58 | NSRange range = [languageCode rangeOfString:@"-" options:NSBackwardsSearch]; 59 | if (range.location != NSNotFound) { 60 | languageCode = [languageCode substringToIndex:range.location]; 61 | } 62 | 63 | NSString *infoPlistPath = [_applicationProxy.bundleURL.path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.lproj/InfoPlist.strings", languageCode]]; 64 | NSFileManager *fileManager = [NSFileManager defaultManager]; 65 | if ([fileManager fileExistsAtPath:infoPlistPath]) { 66 | NSDictionary *plistDict = [[NSDictionary alloc] initWithContentsOfFile:infoPlistPath]; 67 | NSString* displayName = [plistDict objectForKey:@"CFBundleDisplayName"]; 68 | if (displayName) { 69 | return displayName; 70 | } 71 | } 72 | 73 | return _applicationProxy.localizedName ?: _applicationProxy.localizedShortName; 74 | } 75 | 76 | - (NSString*)bundleIdentifier 77 | { 78 | return [_applicationProxy bundleIdentifier]; 79 | } 80 | 81 | - (NSString*)bundleExecutable 82 | { 83 | return [_applicationProxy bundleExecutable]; 84 | } 85 | 86 | - (UIImage*)icon 87 | { 88 | if(nil == _icon) 89 | { 90 | _icon = [UIImage _applicationIconImageForBundleIdentifier:self.bundleIdentifier format:10 scale:UIScreen.mainScreen.scale]; 91 | } 92 | 93 | return _icon; 94 | } 95 | 96 | - (NSString*)applicationDSID 97 | { 98 | return _applicationProxy.applicationDSID; 99 | } 100 | - (NSURL*)bundleURL 101 | { 102 | return _applicationProxy.bundleURL; 103 | } 104 | - (NSURL*)containerURL 105 | { 106 | return _applicationProxy.containerURL; 107 | } 108 | - (NSString*)applicationIdentifier 109 | { 110 | return _applicationProxy.applicationIdentifier; 111 | } 112 | 113 | - (NSString*)applicationType 114 | { 115 | return _applicationProxy.applicationType; 116 | } 117 | 118 | - (NSArray*)groupIdentifiers 119 | { 120 | return _applicationProxy.groupIdentifiers; 121 | } 122 | 123 | - (NSDictionary*)groupContainerURLs 124 | { 125 | return _applicationProxy.groupContainerURLs; 126 | } 127 | 128 | - (NSNumber*)itemID 129 | { 130 | return _applicationProxy.itemID; 131 | } 132 | 133 | - (NSString*)itemName 134 | { 135 | return _applicationProxy.itemName; 136 | } 137 | 138 | - (NSString*)minimumSystemVersion 139 | { 140 | return _applicationProxy.minimumSystemVersion; 141 | } 142 | 143 | - (NSArray*)requiredDeviceCapabilities 144 | { 145 | return _applicationProxy.requiredDeviceCapabilities; 146 | } 147 | 148 | - (NSString*)sdkVersion 149 | { 150 | return _applicationProxy.sdkVersion; 151 | } 152 | 153 | - (NSString*)shortVersionString 154 | { 155 | return _applicationProxy.shortVersionString; 156 | } 157 | 158 | - (NSNumber*)staticDiskUsage 159 | { 160 | return _applicationProxy.staticDiskUsage; 161 | } 162 | 163 | - (NSString*)teamID 164 | { 165 | return _applicationProxy.teamID; 166 | } 167 | 168 | - (NSString*)vendorName 169 | { 170 | return _applicationProxy.vendorName; 171 | } 172 | 173 | - (NSArray *) plugInKitPlugins 174 | { 175 | return _applicationProxy.plugInKitPlugins; 176 | } 177 | 178 | - (BOOL)isHiddenApp 179 | { 180 | return [[_applicationProxy appTags] indexOfObject:@"hidden"] != NSNotFound; 181 | } 182 | 183 | - (id)initWithPrivateProxy:(id)privateProxy 184 | { 185 | self = [super init]; 186 | if(self != nil) 187 | { 188 | _applicationProxy = (PrivateApi_LSApplicationProxy*)privateProxy; 189 | } 190 | 191 | return self; 192 | } 193 | 194 | - (instancetype)initWithBundleIdentifier:(NSString*)bundleIdentifier 195 | { 196 | self = [super init]; 197 | if(self != nil) 198 | { 199 | _applicationProxy = [NSClassFromString(@"LSApplicationProxy") applicationProxyForIdentifier:bundleIdentifier]; 200 | } 201 | 202 | return self; 203 | } 204 | 205 | + (instancetype)appWithPrivateProxy:(id)privateProxy 206 | { 207 | return [[self alloc] initWithPrivateProxy:privateProxy]; 208 | } 209 | 210 | + (instancetype)appWithBundleIdentifier:(NSString*)bundleIdentifier 211 | { 212 | return [[self alloc] initWithBundleIdentifier:bundleIdentifier]; 213 | } 214 | 215 | @end 216 | -------------------------------------------------------------------------------- /RootHide/SettingViewController.m: -------------------------------------------------------------------------------- 1 | #import "SettingViewController.h" 2 | #include "AppDelegate.h" 3 | #include 4 | #include 5 | 6 | @interface SettingViewController () 7 | 8 | @property (nonatomic, retain) NSMutableArray *menuData; 9 | 10 | @end 11 | 12 | @implementation SettingViewController 13 | 14 | + (instancetype)sharedInstance { 15 | static SettingViewController* sharedInstance = nil; 16 | static dispatch_once_t onceToken; 17 | dispatch_once(&onceToken, ^{ 18 | sharedInstance = [[self alloc] init]; 19 | }); 20 | return sharedInstance; 21 | } 22 | 23 | - (void)reloadMenu { 24 | NSString *rulesFilePath = jbroot(@"/var/mobile/Library/RootHide/varCleanRules-custom.plist"); 25 | NSCharacterSet *CharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet]; 26 | NSString *encodedURLString = [rulesFilePath stringByAddingPercentEncodingWithAllowedCharacters:CharacterSet]; 27 | NSURL *filzaURL = [NSURL URLWithString:[@"filza://view" stringByAppendingString:encodedURLString]]; 28 | 29 | self.menuData = @[ 30 | @{ 31 | @"groupTitle": Localized(@"General"), 32 | @"items": @[ 33 | @{ 34 | @"textLabel": Localized(@"Whitelist Mode"), 35 | @"detailTextLabel": Localized(@"auto blacklist newly installed apps"), 36 | @"type": @"switch", 37 | @"switchKey": @"whitelistMode", 38 | @"disabled": @YES 39 | }, 40 | ] 41 | }, 42 | @{ 43 | @"groupTitle": Localized(@"Advanced"), 44 | @"items": @[ 45 | @{ 46 | @"textLabel": Localized(@"Edit varClean Rules"), 47 | @"detailTextLabel": Localized(@"view the rules file in Filza"), 48 | @"type": @"url", 49 | @"url": filzaURL.absoluteString 50 | }, 51 | ] 52 | }, 53 | ].mutableCopy; 54 | } 55 | 56 | - (void)viewDidLoad { 57 | [super viewDidLoad]; 58 | self.navigationController.navigationBar.hidden = NO; 59 | self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleInsetGrouped]; 60 | self.tableView.tableFooterView = [[UIView alloc] init]; 61 | 62 | [self setTitle:Localized(@"Setting")]; 63 | 64 | [self reloadMenu]; 65 | } 66 | 67 | #pragma mark - Table view data source 68 | 69 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 70 | return self.menuData.count; 71 | } 72 | 73 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 74 | NSDictionary *groupData = self.menuData[section]; 75 | NSArray *items = groupData[@"items"]; 76 | return items.count; 77 | } 78 | 79 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 80 | NSDictionary *groupData = self.menuData[section]; 81 | return groupData[@"groupTitle"]; 82 | } 83 | 84 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 85 | UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; 86 | 87 | NSDictionary *groupData = self.menuData[indexPath.section]; 88 | NSArray *items = groupData[@"items"]; 89 | 90 | NSDictionary *item = items[indexPath.row]; 91 | cell.textLabel.text = item[@"textLabel"]; 92 | cell.detailTextLabel.text = item[@"detailTextLabel"]; 93 | 94 | NSDictionary* settings = [AppDelegate getDefaultsForKey:@"settings"]; 95 | if([item[@"type"] isEqualToString:@"switch"]) { 96 | UISwitch *theSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 97 | if(item[@"status"]) 98 | [theSwitch setOn:[item[@"status"] boolValue] ]; 99 | else 100 | [theSwitch setOn:[[settings objectForKey:item[@"switchKey"]] boolValue] ]; 101 | [theSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 102 | if(item[@"disabled"])[theSwitch setEnabled:![item[@"disabled"] boolValue]]; 103 | cell.accessoryView = theSwitch; 104 | } 105 | 106 | if([item[@"type"] isEqualToString:@"url"]) { 107 | cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 108 | } 109 | 110 | return cell; 111 | } 112 | 113 | - (void)switchChanged:(id)sender { 114 | UISwitch *switchInCell = (UISwitch *)sender; 115 | CGPoint pos = [switchInCell convertPoint:switchInCell.bounds.origin toView:self.tableView]; 116 | NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pos]; 117 | 118 | NSDictionary *groupData = self.menuData[indexPath.section]; 119 | NSArray *items = groupData[@"items"]; 120 | 121 | NSDictionary *item = items[indexPath.row]; 122 | 123 | if(item[@"switchKey"]) { 124 | NSMutableDictionary* settings = [AppDelegate getDefaultsForKey:@"settings"]; 125 | if(!settings) settings = [[NSMutableDictionary alloc] init]; 126 | [settings setObject:@(switchInCell.on) forKey:item[@"switchKey"]]; 127 | [AppDelegate setDefaults:settings forKey:@"settings"]; 128 | } 129 | else if(item[@"action"]) { 130 | ((void(^)(void))item[@"action"])(); 131 | } 132 | } 133 | 134 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 135 | [tableView deselectRowAtIndexPath:indexPath animated:YES];// 136 | 137 | NSDictionary *groupData = self.menuData[indexPath.section]; 138 | NSArray *items = groupData[@"items"]; 139 | 140 | NSDictionary *item = items[indexPath.row]; 141 | 142 | if([item[@"type"] isEqualToString:@"url"]) { 143 | NSURL* url = [NSURL URLWithString:item[@"url"]]; 144 | BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:url]; 145 | if(canOpen) { 146 | [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; 147 | } else { 148 | UIAlertController *alert = [UIAlertController alertControllerWithTitle:Localized(@"URL") message:item[@"url"] preferredStyle:UIAlertControllerStyleAlert]; 149 | 150 | [alert addAction:[UIAlertAction actionWithTitle:Localized(@"Got It") style:UIAlertActionStyleDefault handler:nil]]; 151 | [self.navigationController presentViewController:alert animated:YES completion:nil]; 152 | } 153 | } 154 | } 155 | @end 156 | -------------------------------------------------------------------------------- /RootHide/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | #import 5 | #import "AppDelegate.h" 6 | #import "AppInfo.h" 7 | 8 | #ifndef DEBUG 9 | #define NSLog(...) 10 | #endif 11 | 12 | extern const char** environ; 13 | 14 | #define POSIX_SPAWN_PERSONA_FLAGS_OVERRIDE 1 15 | extern int posix_spawnattr_set_persona_np(const posix_spawnattr_t* __restrict, uid_t, uint32_t); 16 | extern int posix_spawnattr_set_persona_uid_np(const posix_spawnattr_t* __restrict, uid_t); 17 | extern int posix_spawnattr_set_persona_gid_np(const posix_spawnattr_t* __restrict, uid_t); 18 | 19 | int spawn(const char* path, const char** argv, const char** envp, void(^std_out)(char*,int), void(^std_err)(char*,int)) 20 | { 21 | NSLog(@"spawn %s", path); 22 | 23 | __block pid_t pid=0; 24 | posix_spawnattr_t attr; 25 | posix_spawnattr_init(&attr); 26 | 27 | posix_spawnattr_set_persona_np(&attr, 99, POSIX_SPAWN_PERSONA_FLAGS_OVERRIDE); 28 | posix_spawnattr_set_persona_uid_np(&attr, 0); 29 | posix_spawnattr_set_persona_gid_np(&attr, 0); 30 | 31 | posix_spawn_file_actions_t action; 32 | posix_spawn_file_actions_init(&action); 33 | 34 | int outPipe[2]; 35 | pipe(outPipe); 36 | posix_spawn_file_actions_addclose(&action, outPipe[0]); 37 | posix_spawn_file_actions_adddup2(&action, outPipe[1], STDOUT_FILENO); 38 | posix_spawn_file_actions_addclose(&action, outPipe[1]); 39 | 40 | int errPipe[2]; 41 | pipe(errPipe); 42 | posix_spawn_file_actions_addclose(&action, errPipe[0]); 43 | posix_spawn_file_actions_adddup2(&action, errPipe[1], STDERR_FILENO); 44 | posix_spawn_file_actions_addclose(&action, errPipe[1]); 45 | 46 | 47 | dispatch_semaphore_t lock = dispatch_semaphore_create(0); 48 | 49 | dispatch_queue_t queue = dispatch_queue_create("spawnPipeQueue", DISPATCH_QUEUE_CONCURRENT); 50 | 51 | dispatch_source_t stdOutSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, outPipe[0], 0, queue); 52 | dispatch_source_t stdErrSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, errPipe[0], 0, queue); 53 | 54 | int outFD = outPipe[0]; 55 | int errFD = errPipe[0]; 56 | 57 | dispatch_source_set_cancel_handler(stdOutSource, ^{ 58 | close(outFD); 59 | dispatch_semaphore_signal(lock); 60 | NSLog(@"stdout canceled [%d]", pid); 61 | }); 62 | dispatch_source_set_cancel_handler(stdErrSource, ^{ 63 | close(errFD); 64 | dispatch_semaphore_signal(lock); 65 | NSLog(@"stderr canceled [%d]", pid); 66 | }); 67 | 68 | dispatch_source_set_event_handler(stdOutSource, ^{ 69 | char buffer[BUFSIZ]={0}; 70 | ssize_t bytes = read(outFD, buffer, sizeof(buffer)-1); 71 | if (bytes <= 0) { 72 | dispatch_source_cancel(stdOutSource); 73 | return; 74 | } 75 | NSLog(@"spawn[%d] stdout: %s", pid, buffer); 76 | if(std_out) std_out(buffer,bytes); 77 | }); 78 | dispatch_source_set_event_handler(stdErrSource, ^{ 79 | char buffer[BUFSIZ]={0}; 80 | ssize_t bytes = read(errFD, buffer, sizeof(buffer)-1); 81 | if (bytes <= 0) { 82 | dispatch_source_cancel(stdErrSource); 83 | return; 84 | } 85 | NSLog(@"spawn[%d] stderr: %s", pid, buffer); 86 | if(std_err) std_err(buffer,bytes); 87 | }); 88 | 89 | dispatch_resume(stdOutSource); 90 | dispatch_resume(stdErrSource); 91 | 92 | int spawnError = posix_spawn(&pid, path, &action, &attr, argv, envp); 93 | NSLog(@"spawn ret=%d, pid=%d", spawnError, pid); 94 | 95 | posix_spawnattr_destroy(&attr); 96 | posix_spawn_file_actions_destroy(&action); 97 | 98 | close(outPipe[1]); 99 | close(errPipe[1]); 100 | 101 | if(spawnError != 0) 102 | { 103 | NSLog(@"posix_spawn error %d:%s\n", spawnError, strerror(spawnError)); 104 | dispatch_source_cancel(stdOutSource); 105 | dispatch_source_cancel(stdErrSource); 106 | return spawnError; 107 | } 108 | 109 | //wait stdout 110 | dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); 111 | //wait stderr 112 | dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); 113 | 114 | int status=0; 115 | while(waitpid(pid, &status, 0) != -1) 116 | { 117 | if (WIFSIGNALED(status)) { 118 | return 128 + WTERMSIG(status); 119 | } else if (WIFEXITED(status)) { 120 | return WEXITSTATUS(status); 121 | } 122 | //keep waiting?return status; 123 | }; 124 | return -1; 125 | } 126 | 127 | int spawnRoot(NSString* path, NSArray* args, NSString** stdOut, NSString** stdErr) 128 | { 129 | NSLog(@"spawnRoot %@ with %@", path, args); 130 | 131 | NSMutableArray* argsM = args.mutableCopy ?: [NSMutableArray new]; 132 | [argsM insertObject:path atIndex:0]; 133 | 134 | NSUInteger argCount = [argsM count]; 135 | char **argsC = (char **)malloc((argCount + 1) * sizeof(char*)); 136 | 137 | for (NSUInteger i = 0; i < argCount; i++) 138 | { 139 | argsC[i] = strdup([[argsM objectAtIndex:i] UTF8String]); 140 | } 141 | argsC[argCount] = NULL; 142 | 143 | 144 | __block NSMutableString* outString=nil; 145 | __block NSMutableString* errString=nil; 146 | 147 | if(stdOut) outString = [NSMutableString new]; 148 | if(stdErr) errString = [NSMutableString new]; 149 | 150 | int retval = spawn(path.fileSystemRepresentation, argsC, environ, ^(char* outstr, int length){ 151 | NSString *str = [[NSString alloc] initWithBytes:outstr length:length encoding:NSASCIIStringEncoding]; 152 | if(stdOut) [outString appendString:str]; 153 | }, ^(char* errstr, int length){ 154 | NSString *str = [[NSString alloc] initWithBytes:errstr length:length encoding:NSASCIIStringEncoding]; 155 | if(stdErr) [errString appendString:str]; 156 | }); 157 | 158 | if(stdOut) *stdOut = outString.copy; 159 | if(stdErr) *stdErr = errString.copy; 160 | 161 | for (NSUInteger i = 0; i < argCount; i++) 162 | { 163 | free(argsC[i]); 164 | } 165 | free(argsC); 166 | 167 | return retval; 168 | } 169 | 170 | BOOL isUUIDPathOf(NSString* path, NSString* parent) 171 | { 172 | if(!path || !parent) return NO; 173 | 174 | const char* _path = path.UTF8String; 175 | const char* _parent = parent.UTF8String; 176 | 177 | char rp[PATH_MAX]; 178 | if(!realpath(_path, rp)) return NO; 179 | 180 | char rpp[PATH_MAX+1]; 181 | if(!realpath(_parent, rpp)) return NO; 182 | 183 | size_t rpplen = strlen(rpp); 184 | 185 | if(rpp[rpplen] != '/') { 186 | strcat(rpp, "/"); 187 | rpplen++; 188 | } 189 | 190 | if(strncmp(rp, rpp, rpplen) != 0) 191 | return NO; 192 | 193 | char* p1 = rp + rpplen; 194 | char* p2 = strchr(p1, '/'); 195 | if(!p2) p2 = rp + strlen(rp); 196 | 197 | //is normal app or jailbroken app/daemon? 198 | if((p2 - p1) != (sizeof("xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx")-1)) 199 | return NO; 200 | 201 | return YES; 202 | } 203 | 204 | #include 205 | 206 | int proc_pidpath(int pid, void * buffer, uint32_t buffersize); 207 | 208 | void killAllForBundle(const char* bundlePath) 209 | { 210 | NSLog(@"killAllForBundle: %s", bundlePath); 211 | 212 | char realBundlePath[PATH_MAX+1]; 213 | if(!realpath(bundlePath, realBundlePath)) 214 | return; 215 | 216 | size_t realBundlePathLen = strlen(realBundlePath); 217 | if(realBundlePath[realBundlePathLen] != '/') { 218 | strcat(realBundlePath, "/"); 219 | realBundlePathLen++; 220 | } 221 | 222 | int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL}; 223 | struct kinfo_proc *info; 224 | size_t length; 225 | size_t count; 226 | 227 | if (sysctl(mib, 3, NULL, &length, NULL, 0) < 0) 228 | return; 229 | if (!(info = malloc(length))) 230 | return; 231 | if (sysctl(mib, 3, info, &length, NULL, 0) < 0) { 232 | free(info); 233 | return; 234 | } 235 | count = length / sizeof(struct kinfo_proc); 236 | for (int i = 0; i < count; i++) { 237 | pid_t pid = info[i].kp_proc.p_pid; 238 | if (pid == 0) { 239 | continue; 240 | } 241 | 242 | char executablePath[PATH_MAX]; 243 | if(proc_pidpath(pid, executablePath, sizeof(executablePath)) > 0) { 244 | // NSLog(@"executablePath [%d] %s", pid, executablePath); 245 | char realExecutablePath[PATH_MAX]; 246 | if (realpath(executablePath, realExecutablePath) 247 | && strncmp(realExecutablePath, realBundlePath, realBundlePathLen) == 0) { 248 | int ret = kill(pid, SIGKILL); 249 | NSLog(@"killAllForBundle %s -> %d", realExecutablePath, ret); 250 | } 251 | } 252 | } 253 | free(info); 254 | } 255 | 256 | NSString* RootUserClearAppData(AppInfo* app) { 257 | NSString* error=nil; 258 | NSString* result=nil; 259 | int ret = spawnRoot(NSBundle.mainBundle.executablePath, @[@"clearAppData", app.bundleIdentifier], &result, &error); 260 | if(ret != 0) { 261 | NSLog(@"removeItemAtPath failed: %@", error); 262 | return error; 263 | } 264 | return nil; 265 | } 266 | 267 | BOOL RootUserRemoveItemAtPath(NSString* path) 268 | { 269 | NSString* error=nil; 270 | NSString* result=nil; 271 | int ret = spawnRoot(NSBundle.mainBundle.executablePath, @[@"removeItemAtPath", path], &result, &error); 272 | if(ret != 0) { 273 | NSLog(@"removeItemAtPath failed: %@", error); 274 | return NO; 275 | } 276 | return YES; 277 | } 278 | 279 | int main(int argc, char * argv[]) { 280 | 281 | //Keyboard Preference & Localized won't work 282 | // assert(setuid(0) == 0); 283 | // assert(getuid() == 0); 284 | // assert(setgid(0) == 0); 285 | // assert(getgid() == 0); 286 | 287 | NSLog(@"uid=%d euid=%d gid=%d egid=%d issetugid=%d", getuid(), geteuid(), getgid(), getegid(), issetugid()); 288 | 289 | if(argc >= 2) 290 | { 291 | if(argc==3 && strcmp(argv[1], "removeItemAtPath")==0) { 292 | NSError* err; 293 | if(![NSFileManager.defaultManager removeItemAtPath:@(argv[2]) error:&err]) { 294 | fprintf(stderr, "%s", err.description.UTF8String); 295 | return -1; 296 | } 297 | return 0; 298 | } 299 | if(argc==3 && strcmp(argv[1], "clearAppData")==0) { 300 | AppInfo* app = [AppInfo appWithBundleIdentifier:@(argv[2])]; 301 | NSString* clearAppData(AppInfo* app); 302 | NSString* error = clearAppData(app); 303 | if(error) { 304 | fprintf(stderr, "%s", error.UTF8String); 305 | return -1; 306 | } 307 | return 0; 308 | } 309 | } 310 | 311 | NSString * appDelegateClassName; 312 | @autoreleasepool { 313 | // Setup code that might create autoreleased objects goes here. 314 | appDelegateClassName = NSStringFromClass([AppDelegate class]); 315 | } 316 | return UIApplicationMain(argc, argv, nil, appDelegateClassName); 317 | } 318 | -------------------------------------------------------------------------------- /RootHide/NSJSONSerialization+Comments.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSJSONSerialization+Comments.m 3 | // ABCodeEditor 4 | // 5 | // Created by Alexander Blach on 22.07.14. 6 | // Copyright (c) 2014 Alexander Blach. All rights reserved. 7 | // 8 | 9 | #import "NSJSONSerialization+Comments.h" 10 | 11 | 12 | static const int EncLen_UTF8[256] = { 13 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 15 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 17 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 18 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 19 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20 | 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1}; 21 | 22 | static inline void copyUTF8CharacterAndAdvancePointers(UTF8Char **source, UTF8Char **target) { 23 | UTF8Char character = **source; 24 | if (__builtin_expect(character < 128, 1)) { 25 | // one byte UTF-8 character 26 | **target = **source; 27 | *source += 1; 28 | *target += 1; 29 | } else { 30 | int len = EncLen_UTF8[character]; 31 | memcpy(*target, *source, len); 32 | *source += len; 33 | *target += len; 34 | } 35 | } 36 | 37 | static inline void skipUTF8Character(UTF8Char **source) { *source += EncLen_UTF8[**source]; } 38 | 39 | 40 | @implementation NSJSONSerialization (Comments) 41 | 42 | + (NSData *)dataByStrippingJSONCommentsAndWhiteSpaceOfUTF8Data:(NSData *)data 43 | skipBytes:(NSUInteger)bytesToSkip { 44 | UTF8Char *originalString = (UTF8Char *)[data bytes]; 45 | NSUInteger length = [data length]; 46 | 47 | UTF8Char *modifiedString = malloc(sizeof(UTF8Char) * length); 48 | 49 | UTF8Char *originalStringCurrent = originalString; 50 | UTF8Char *originalStringEnd = originalString + length; 51 | UTF8Char *modifiedStringCurrent = modifiedString; 52 | 53 | 54 | // skip bytes 55 | originalStringCurrent += bytesToSkip; 56 | 57 | while (originalStringCurrent < originalStringEnd) { 58 | UTF8Char currentChar = *originalStringCurrent; 59 | 60 | if (currentChar == '\t' || currentChar == ' ' || currentChar == '\r' 61 | || currentChar == '\n') { 62 | // skip whitespace 63 | 64 | // Ignore whitespace tokens. According to ES 5.1 section 15.12.1.1, 65 | // whitespace tokens include tabs, carriage returns, line feeds, and 66 | // space characters. 67 | originalStringCurrent++; 68 | } else if (currentChar == '"') { 69 | // we found a string! -> handle it 70 | *modifiedStringCurrent++ = currentChar; 71 | originalStringCurrent++; 72 | 73 | UTF8Char lastChar = 0; 74 | 75 | while (originalStringCurrent < originalStringEnd) { 76 | currentChar = *originalStringCurrent; 77 | 78 | if (currentChar == '"') { 79 | *modifiedStringCurrent++ = currentChar; 80 | originalStringCurrent++; 81 | 82 | if (lastChar == '\\') { 83 | // was escaped character -> not at string end 84 | } else { 85 | // arrived at end of string 86 | break; 87 | } 88 | } else if (currentChar == '\n' || currentChar == '\r') { 89 | // line breaks should not happen in JSON strings! 90 | *modifiedStringCurrent++ = currentChar; 91 | originalStringCurrent++; 92 | break; 93 | } else { 94 | // still in string -> copy character 95 | copyUTF8CharacterAndAdvancePointers(&originalStringCurrent, 96 | &modifiedStringCurrent); 97 | } 98 | lastChar = currentChar; 99 | } 100 | } else if (currentChar == '/' && originalStringCurrent + 1 < originalStringEnd) { 101 | // maybe we have a single-line or multi-line comment 102 | UTF8Char nextChar = *(originalStringCurrent + 1); 103 | 104 | if (nextChar == '/') { 105 | // single line comment 106 | originalStringCurrent += 2; 107 | 108 | while (originalStringCurrent < originalStringEnd) { 109 | char currentChar = *originalStringCurrent; 110 | 111 | if (currentChar == '\r' || currentChar == '\n') { 112 | // at end of line -> comment end 113 | break; 114 | } else { 115 | // skip 116 | skipUTF8Character(&originalStringCurrent); 117 | } 118 | } 119 | } else if (nextChar == '*') { 120 | // multi line comment 121 | originalStringCurrent += 2; 122 | 123 | while (originalStringCurrent < originalStringEnd) { 124 | char currentChar = *originalStringCurrent; 125 | 126 | if (currentChar == '*') { 127 | originalStringCurrent++; 128 | 129 | if (originalStringCurrent < originalStringEnd) { 130 | currentChar = *originalStringCurrent; 131 | if (currentChar == '/') { 132 | // comment end! 133 | originalStringCurrent++; 134 | break; 135 | } 136 | } 137 | } else { 138 | // skip 139 | skipUTF8Character(&originalStringCurrent); 140 | } 141 | } 142 | } else { 143 | // nope, no comment, just copy the character 144 | *modifiedStringCurrent++ = currentChar; 145 | originalStringCurrent++; 146 | } 147 | } else { 148 | // copy character as is 149 | copyUTF8CharacterAndAdvancePointers(&originalStringCurrent, &modifiedStringCurrent); 150 | } 151 | } 152 | 153 | NSUInteger modifiedStringLength = modifiedStringCurrent - modifiedString; 154 | 155 | if (modifiedStringLength != length) { 156 | modifiedString = realloc(modifiedString, sizeof(UTF8Char) * modifiedStringLength); 157 | return [NSData dataWithBytesNoCopy:modifiedString 158 | length:modifiedStringLength 159 | freeWhenDone:YES]; 160 | } else { 161 | free(modifiedString); 162 | return data; 163 | } 164 | } 165 | 166 | 167 | + (id)JSONObjectWithCommentedUTF8Data:(NSData *)data 168 | options:(NSJSONReadingOptions)opt 169 | error:(NSError **)error { 170 | NSData *strippedData = 171 | [self dataByStrippingJSONCommentsAndWhiteSpaceOfUTF8Data:data skipBytes:0]; 172 | 173 | // NSLog(@"before:\n%@", [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] 174 | // autorelease]); 175 | // NSLog(@"after:\n%@", [[[NSString alloc] initWithData:strippedData 176 | // encoding:NSUTF8StringEncoding] autorelease]); 177 | 178 | return [self JSONObjectWithData:strippedData options:opt error:error]; 179 | } 180 | 181 | 182 | + (NSStringEncoding)stringEncodingFromData:(NSData *)data detectedBOMSize:(NSUInteger *)bomSize { 183 | NSStringEncoding encoding = 0; 184 | if (bomSize) { 185 | *bomSize = 0; 186 | } 187 | 188 | NSUInteger fileSize = [data length]; 189 | 190 | // try to get from BOM 191 | if (fileSize >= 2) { 192 | UInt8 *bomBuffer = (UInt8 *)[data bytes]; 193 | 194 | // go back to start of file 195 | if (fileSize >= 2 && fileSize % 2 == 0) { 196 | // even amount of bytes? could be UTF-16 or UTF-32 197 | if (bomBuffer[0] == 0xFE && bomBuffer[1] == 0xFF) { 198 | // Big Endian 199 | encoding = NSUTF16StringEncoding; 200 | if (bomSize) { 201 | *bomSize = 2; 202 | } 203 | } else if (bomBuffer[0] == 0xFF && bomBuffer[1] == 0xFE) { 204 | // Little Endian 205 | encoding = NSUTF16StringEncoding; 206 | if (bomSize) { 207 | *bomSize = 2; 208 | } 209 | } else if (fileSize >= 4) { 210 | if (bomBuffer[0] == 0x00 && bomBuffer[1] == 0x00 && bomBuffer[2] == 0xFE 211 | && bomBuffer[3] == 0xFF) { 212 | // Big Endian 213 | encoding = NSUTF32StringEncoding; 214 | if (bomSize) { 215 | *bomSize = 4; 216 | } 217 | } else if (bomBuffer[0] == 0xFF && bomBuffer[1] == 0xFE && bomBuffer[2] == 0x00 218 | && bomBuffer[3] == 0x00) { 219 | // Little Endian 220 | encoding = NSUTF32StringEncoding; 221 | if (bomSize) { 222 | *bomSize = 4; 223 | } 224 | } 225 | } 226 | } 227 | 228 | if (!encoding) { 229 | if (fileSize >= 3) { 230 | if (bomBuffer[0] == 0xEF && bomBuffer[1] == 0xBB && bomBuffer[2] == 0xBF) { 231 | encoding = NSUTF8StringEncoding; 232 | if (bomSize) { 233 | *bomSize = 3; 234 | } 235 | } 236 | } 237 | } 238 | } 239 | 240 | return encoding; 241 | } 242 | 243 | + (id)JSONObjectWithCommentedData:(NSData *)data 244 | options:(NSJSONReadingOptions)opt 245 | error:(NSError **)error { 246 | if (data) { 247 | NSUInteger bomSize = 0; 248 | NSStringEncoding encoding = [self stringEncodingFromData:data detectedBOMSize:&bomSize]; 249 | 250 | if (encoding == 0 || // assume UTF-8 if no BOM is detected 251 | encoding == NSUTF8StringEncoding) { 252 | // we can use the data as is, because it is already UTF-8 253 | } else { 254 | // convert to UTF-8 first 255 | NSString *string = [[NSString alloc] initWithData:data encoding:encoding]; 256 | if (!string) { 257 | if (error) { 258 | // use the same error description, domain, and code as NSJSONSerialization 259 | *error = 260 | [NSError errorWithDomain:NSCocoaErrorDomain 261 | code:0xf00 262 | userInfo:@{ 263 | (NSString *)kCFErrorDescriptionKey : 264 | @"Unable to convert data to a string using the " 265 | @"detected encoding. The data may be corrupt." 266 | }]; 267 | } 268 | return nil; 269 | } else { 270 | data = [string dataUsingEncoding:NSUTF8StringEncoding]; 271 | [string release]; 272 | bomSize = 0; 273 | } 274 | } 275 | 276 | return [self JSONObjectWithCommentedUTF8Data:data options:opt error:error]; 277 | } else { 278 | return nil; 279 | } 280 | } 281 | 282 | 283 | + (id)JSONObjectWithCommentedContentsOfURL:(NSURL *)url 284 | options:(NSJSONReadingOptions)opt 285 | error:(NSError **)error { 286 | // load data from URL 287 | NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:error]; 288 | return [self JSONObjectWithCommentedData:data options:opt error:error]; 289 | } 290 | 291 | + (id)JSONObjectWithCommentedContentsOfFile:(NSString *)path 292 | options:(NSJSONReadingOptions)opt 293 | error:(NSError **)error { 294 | // load data from file 295 | NSData *data = [NSData dataWithContentsOfFile:path options:NSDataReadingUncached error:error]; 296 | 297 | return [self JSONObjectWithCommentedData:data options:opt error:error]; 298 | } 299 | 300 | + (id)JSONObjectWithCommentedString:(NSString *)string 301 | options:(NSJSONReadingOptions)opt 302 | error:(NSError **)error { 303 | NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 304 | return [self JSONObjectWithCommentedUTF8Data:data options:opt error:error]; 305 | } 306 | 307 | + (NSString *)stringWithJSONObject:(id)obj 308 | options:(NSJSONWritingOptions)opt 309 | error:(NSError **)error { 310 | NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:opt error:error]; 311 | if (data) { 312 | NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 313 | 314 | return [string autorelease]; 315 | } else { 316 | return nil; 317 | } 318 | } 319 | 320 | @end 321 | -------------------------------------------------------------------------------- /RootHide/BlacklistViewController.m: -------------------------------------------------------------------------------- 1 | // ref https://github.com/XsF1re/FlyJB-App 2 | 3 | #import "BlacklistViewController.h" 4 | #include "AppDelegate.h" 5 | #import "AppInfo.h" 6 | 7 | BOOL isUUIDPathOf(NSString* path, NSString* parent); 8 | 9 | BOOL isDefaultInstallationPath(NSString* path) 10 | { 11 | return isUUIDPathOf(path, @"/private/var/containers/Bundle/Application/"); 12 | } 13 | 14 | @interface LSApplicationWorkspace : NSObject 15 | + (id)defaultWorkspace; 16 | - (NSArray*)allApplications; 17 | - (NSArray*)allInstalledApplications; 18 | @end 19 | 20 | @interface BlacklistViewController () { 21 | UISearchController *searchController; 22 | NSArray *applications; 23 | NSArray *appsArray; 24 | 25 | NSMutableArray* filteredApps; 26 | BOOL isFiltered; 27 | 28 | BOOL blacklistDisabled; 29 | BOOL spinlockFixApplied; 30 | } 31 | 32 | @end 33 | 34 | @implementation BlacklistViewController 35 | 36 | + (instancetype)sharedInstance { 37 | static BlacklistViewController* sharedInstance = nil; 38 | static dispatch_once_t onceToken; 39 | dispatch_once(&onceToken, ^{ 40 | sharedInstance = [[self alloc] init]; 41 | }); 42 | return sharedInstance; 43 | } 44 | 45 | -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 46 | [searchBar resignFirstResponder]; 47 | } 48 | - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 49 | if(isFiltered) { 50 | self->appsArray = [self sortAppList:YES]; 51 | } 52 | isFiltered = false; 53 | [self.tableView reloadData]; 54 | } 55 | 56 | -(void)reloadSearch { 57 | NSString* searchText = searchController.searchBar.text; 58 | if(searchText.length == 0) { 59 | isFiltered = false; 60 | } else { 61 | isFiltered = true; 62 | filteredApps = [[NSMutableArray alloc] init]; 63 | searchText = searchText.lowercaseString; 64 | for (AppInfo* app in appsArray) { 65 | NSRange nameRange = [app.name.lowercaseString rangeOfString:searchText options:NSCaseInsensitiveSearch]; 66 | NSRange bundleIdRange = [app.bundleIdentifier.lowercaseString rangeOfString:searchText options:NSCaseInsensitiveSearch]; 67 | if(nameRange.location != NSNotFound || bundleIdRange.location != NSNotFound) { 68 | [filteredApps addObject:app]; 69 | } 70 | } 71 | } 72 | } 73 | 74 | -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 75 | [self reloadSearch]; 76 | [self.tableView reloadData]; 77 | } 78 | 79 | 80 | - (void)viewDidLoad { 81 | [super viewDidLoad]; 82 | self.navigationController.navigationBar.hidden = NO; 83 | self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleInsetGrouped]; 84 | self.tableView.tableFooterView = [[UIView alloc] init]; 85 | 86 | [self setTitle:Localized(@"Blacklist")]; 87 | 88 | self->blacklistDisabled = [[AppDelegate getDefaultsForKey:@"blacklistDisabled"] boolValue]; 89 | self->spinlockFixApplied = [[AppDelegate getDefaultsForKey:@"spinlockFixApplied"] boolValue]; 90 | 91 | isFiltered = false; 92 | 93 | searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 94 | searchController.searchBar.delegate = self; 95 | searchController.searchBar.placeholder = Localized(@"name or identifier"); 96 | searchController.searchBar.barTintColor = [UIColor whiteColor]; 97 | searchController.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 98 | self.navigationItem.searchController = searchController; 99 | self.navigationItem.hidesSearchBarWhenScrolling = NO; 100 | 101 | UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 102 | refreshControl.tintColor = [UIColor grayColor]; 103 | [refreshControl addTarget:self action:@selector(manualRefresh) forControlEvents:UIControlEventValueChanged]; 104 | self.tableView.refreshControl = refreshControl; 105 | 106 | self->applications = [self updateData]; 107 | self->appsArray = [self sortAppList:YES]; 108 | 109 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(autoRefresh) 110 | name:UIApplicationWillEnterForegroundNotification object:nil]; 111 | } 112 | 113 | - (void)startRefresh:(BOOL)resort { 114 | [self.tableView.refreshControl beginRefreshing]; 115 | dispatch_async(dispatch_get_global_queue(0, 0), ^{ 116 | NSArray* newData = [self updateData]; 117 | dispatch_async(dispatch_get_main_queue(), ^{ 118 | self->applications = newData; 119 | self->appsArray = [self sortAppList:resort]; 120 | [self reloadSearch]; 121 | [self.tableView reloadData]; 122 | [self.tableView.refreshControl endRefreshing]; 123 | }); 124 | }); 125 | } 126 | 127 | - (void)manualRefresh { 128 | [self startRefresh:YES]; 129 | } 130 | 131 | - (void)autoRefresh { 132 | [self startRefresh:NO]; 133 | } 134 | 135 | - (void)viewWillAppear:(BOOL)animated { 136 | [super viewWillAppear:animated]; 137 | [self.tableView.refreshControl beginRefreshing]; 138 | [self.tableView.refreshControl endRefreshing]; 139 | } 140 | 141 | - (NSArray*)sortAppList:(BOOL)sortWithStatus { 142 | NSArray *result = nil; 143 | 144 | if(sortWithStatus) 145 | { 146 | NSMutableDictionary* appconfig = [AppDelegate getDefaultsForKey:@"appconfig"]; 147 | 148 | result = [applications sortedArrayUsingComparator:^NSComparisonResult(AppInfo *app1, AppInfo *app2) { 149 | 150 | BOOL enabled1 = [[appconfig objectForKey:app1.bundleIdentifier] boolValue]; 151 | BOOL enabled2 = [[appconfig objectForKey:app2.bundleIdentifier] boolValue]; 152 | 153 | if((enabled1&&!enabled2) || (!enabled1&&enabled2)) { 154 | return [@(enabled2) compare:@(enabled1)]; 155 | } 156 | 157 | if(app1.isHiddenApp || app2.isHiddenApp) { 158 | return (enabled1&&enabled2) ? [@(app2.isHiddenApp) compare:@(app1.isHiddenApp)] : [@(app1.isHiddenApp) compare:@(app2.isHiddenApp)]; 159 | } 160 | 161 | return [app1.name localizedStandardCompare:app2.name]; 162 | }]; 163 | } 164 | else 165 | { 166 | NSMutableArray *newapps = [NSMutableArray array]; 167 | [applications enumerateObjectsUsingBlock:^(AppInfo *newobj, NSUInteger idx, BOOL * _Nonnull stop) { 168 | __block BOOL hasBeenContained = NO; 169 | [self->appsArray enumerateObjectsUsingBlock:^(AppInfo *obj, NSUInteger idx, BOOL * _Nonnull stop) { 170 | if ([obj.bundleIdentifier isEqualToString:newobj.bundleIdentifier]) { 171 | hasBeenContained = YES; 172 | *stop = YES; 173 | } 174 | }]; 175 | if (!hasBeenContained) { 176 | [newapps addObject:newobj]; 177 | } 178 | }]; 179 | 180 | NSMutableArray *tmpArray = [NSMutableArray array]; 181 | [self->appsArray enumerateObjectsUsingBlock:^(AppInfo *obj, NSUInteger idx, BOOL * _Nonnull stop) { 182 | [applications enumerateObjectsUsingBlock:^(AppInfo *newobj, NSUInteger idx, BOOL * _Nonnull stop) { 183 | if ([obj.bundleIdentifier isEqualToString:newobj.bundleIdentifier]) { 184 | [tmpArray addObject:newobj]; 185 | *stop = YES; 186 | } 187 | }]; 188 | }]; 189 | 190 | [tmpArray addObjectsFromArray:newapps]; 191 | result = tmpArray.copy; 192 | } 193 | 194 | return result; 195 | } 196 | 197 | - (NSArray*)updateData { 198 | NSMutableArray* applications = [NSMutableArray new]; 199 | NSArray* allInstalledApplications = [LSApplicationWorkspace.defaultWorkspace allInstalledApplications]; 200 | for(id proxy in allInstalledApplications) 201 | { 202 | AppInfo* app = [AppInfo appWithPrivateProxy:proxy]; 203 | //if(!app.isHiddenApp && ([app.applicationType containsString:@"User"])) 204 | //some apps can be installed in trollstore but detect jailbreak 205 | if(!app.isHiddenApp 206 | && ![app.bundleIdentifier hasPrefix:@"com.apple."] 207 | && isDefaultInstallationPath(app.bundleURL.path)) 208 | { 209 | [applications addObject:app]; 210 | } 211 | } 212 | 213 | return applications; 214 | } 215 | 216 | #pragma mark - Table view data source 217 | 218 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 219 | return 1; 220 | } 221 | 222 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 223 | return isFiltered? filteredApps.count : appsArray.count; 224 | } 225 | 226 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 227 | return @"Applist"; 228 | } 229 | 230 | - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 231 | return [[UIView alloc] init]; 232 | } 233 | - (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 234 | return [[UIView alloc] init]; 235 | } 236 | 237 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 238 | [tableView deselectRowAtIndexPath:indexPath animated:YES];// 239 | } 240 | 241 | - (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { 242 | UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0); 243 | [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 244 | UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 245 | UIGraphicsEndImageContext(); 246 | return newImage; 247 | } 248 | 249 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 250 | UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; 251 | 252 | AppInfo* app = isFiltered? filteredApps[indexPath.row] : appsArray[indexPath.row]; 253 | 254 | UIImage *image = app.icon; 255 | cell.imageView.image = [self imageWithImage:image scaledToSize:CGSizeMake(40, 40)]; 256 | 257 | cell.textLabel.text = app.name; 258 | cell.detailTextLabel.text = app.bundleIdentifier; 259 | 260 | UISwitch *theSwitch = [[UISwitch alloc] init]; 261 | 262 | NSMutableDictionary* appconfig = [AppDelegate getDefaultsForKey:@"appconfig"]; 263 | [theSwitch setOn:[[appconfig objectForKey:app.bundleIdentifier] boolValue]]; 264 | [theSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 265 | 266 | if(blacklistDisabled) { 267 | //theSwitch.enabled = NO; 268 | [theSwitch setOn:NO]; 269 | } 270 | 271 | cell.accessoryView = theSwitch; 272 | 273 | UILongPressGestureRecognizer *gest = [[UILongPressGestureRecognizer alloc] 274 | initWithTarget:self action:@selector(cellLongPress:)]; 275 | [cell.contentView addGestureRecognizer:gest]; 276 | gest.view.tag = indexPath.row | indexPath.section<<32; 277 | gest.minimumPressDuration = 1; 278 | 279 | return cell; 280 | } 281 | 282 | - (void)cellLongPress:(UIGestureRecognizer *)recognizer 283 | { 284 | if (recognizer.state == UIGestureRecognizerStateBegan) 285 | { 286 | long tag = recognizer.view.tag; 287 | NSIndexPath* indexPath = [NSIndexPath indexPathForRow:tag&0xFFFFFFFF inSection:tag>>32]; 288 | 289 | AppInfo* app = isFiltered? filteredApps[indexPath.row] : appsArray[indexPath.row]; 290 | 291 | UIAlertController* appMenuAlert = [UIAlertController alertControllerWithTitle:app.name?:@"" message:app.bundleIdentifier?:@"" preferredStyle:UIAlertControllerStyleActionSheet]; 292 | 293 | UIAlertAction* cleanAction = [UIAlertAction actionWithTitle:@"Clear App Data" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action) 294 | { 295 | void killAllForBundle(const char* bundlePath); 296 | killAllForBundle(app.bundleURL.path.UTF8String); 297 | 298 | NSString* error = nil; 299 | if(geteuid()==0 && getegid()==0) { 300 | NSString* clearAppData(AppInfo* app); 301 | error = clearAppData(app); 302 | } else { 303 | NSString* RootUserClearAppData(AppInfo* app); 304 | error = RootUserClearAppData(app); 305 | } 306 | if(error) { 307 | [AppDelegate showMessage:error title:Localized(@"Error")]; 308 | } else { 309 | [AppDelegate showMessage:@"" title:Localized(@"Cleaned up")]; 310 | } 311 | }]; 312 | [appMenuAlert addAction:cleanAction]; 313 | 314 | UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction* action) 315 | { 316 | }]; 317 | [appMenuAlert addAction:cancelAction]; 318 | 319 | //fix crashing on ipad 320 | appMenuAlert.popoverPresentationController.sourceView = recognizer.view; 321 | appMenuAlert.popoverPresentationController.sourceRect = recognizer.view.bounds; 322 | 323 | [AppDelegate showAlert:appMenuAlert]; 324 | } 325 | } 326 | 327 | - (void)switchChanged:(id)sender { 328 | // https://stackoverflow.com/questions/31063571/getting-indexpath-from-switch-on-uitableview 329 | UISwitch *switchInCell = (UISwitch *)sender; 330 | 331 | if(blacklistDisabled) 332 | { 333 | [switchInCell setOn:NO]; 334 | 335 | NSString* msg = Localized(@"Blacklist is not supported in current environment."); 336 | if([NSFileManager.defaultManager fileExistsAtPath:jbroot(@"/.bootstrapped")] 337 | || [NSFileManager.defaultManager fileExistsAtPath:jbroot(@"/.thebootstrapped")]) { 338 | msg = [NSString stringWithFormat:@"%@ %@",msg,Localized(@"Just disable tweaks for this app in the AppList of Bootstrap.")]; 339 | } 340 | 341 | [AppDelegate showMessage:msg title:@""]; 342 | 343 | return; 344 | } 345 | 346 | #ifdef __arm64e__ 347 | if (spinlockFixApplied && NSProcessInfo.processInfo.operatingSystemVersion.majorVersion==15) { 348 | static BOOL Alerted = NO; 349 | if(!Alerted && switchInCell.on) { 350 | Alerted = YES; 351 | [AppDelegate showMessage:Localized(@"\nFor iOS15 A12+ devices:\n\nthe blacklisted app will have its app extension disabled, and may cause a spinlock panic when the app is running in the foreground/background.\n\nYou can first try disabling tweak injection for this app in Choicy, and only blacklist the app if it doesn't work.") title:Localized(@"Warning")]; 352 | } 353 | } 354 | #endif 355 | 356 | 357 | CGPoint pos = [switchInCell convertPoint:switchInCell.bounds.origin toView:self.tableView]; 358 | NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pos]; 359 | 360 | AppInfo* app = isFiltered? filteredApps[indexPath.row] : appsArray[indexPath.row]; 361 | 362 | NSMutableDictionary* appconfig = [AppDelegate getDefaultsForKey:@"appconfig"]; 363 | if(!appconfig) appconfig = [[NSMutableDictionary alloc] init]; 364 | [appconfig setObject:@(switchInCell.on) forKey:app.bundleIdentifier]; 365 | [AppDelegate setDefaults:appconfig forKey:@"appconfig"]; 366 | 367 | void killAllForBundle(const char* bundlePath); 368 | killAllForBundle(app.bundleURL.path.UTF8String); 369 | 370 | } 371 | @end 372 | -------------------------------------------------------------------------------- /RootHide/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | #import "VarCleanRules.h" 3 | #import "BlacklistViewController.h" 4 | #import "varCleanController.h" 5 | #import "SettingViewController.h" 6 | #include "NSJSONSerialization+Comments.h" 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | @implementation AppDelegate 17 | 18 | + (id)getDefaultsForKey:(NSString*)key { 19 | NSString *configFilePath = jbroot(@"/var/mobile/Library/RootHide/RootHideConfig.plist"); 20 | NSDictionary* defaults = [NSDictionary dictionaryWithContentsOfFile:configFilePath]; 21 | return [defaults objectForKey:key]; 22 | } 23 | 24 | + (void)setDefaults:(NSObject*)value forKey:(NSString*)key { 25 | NSString *configFilePath = jbroot(@"/var/mobile/Library/RootHide/RootHideConfig.plist"); 26 | NSMutableDictionary* defaults = [NSMutableDictionary dictionaryWithContentsOfFile:configFilePath]; 27 | if(!defaults) defaults = [[NSMutableDictionary alloc] init]; 28 | [defaults setValue:value forKey:key]; 29 | [defaults writeToFile:configFilePath atomically:YES]; 30 | } 31 | 32 | + (void)showAlert:(UIAlertController*)alert { 33 | 34 | static dispatch_queue_t alertQueue = nil; 35 | 36 | static dispatch_once_t oncetoken; 37 | dispatch_once(&oncetoken, ^{ 38 | alertQueue = dispatch_queue_create("alertQueue", DISPATCH_QUEUE_SERIAL); 39 | }); 40 | 41 | dispatch_async(alertQueue, ^{ 42 | __block BOOL presenting = NO; 43 | __block BOOL presented = NO; 44 | while(!presenting) { 45 | dispatch_sync(dispatch_get_main_queue(), ^{ 46 | UIViewController* vc = UIApplication.sharedApplication.keyWindow.rootViewController; 47 | while(vc.presentedViewController){ 48 | vc = vc.presentedViewController; 49 | if(vc.isBeingDismissed) { 50 | return; 51 | } 52 | } 53 | presenting = YES; 54 | [vc presentViewController:alert animated:YES completion:^{ presented=YES; }]; 55 | }); 56 | if(!presenting) usleep(1000*100); 57 | } 58 | while(!presented) usleep(100*1000); 59 | }); 60 | } 61 | 62 | + (void)showMessage:(NSString*)msg title:(NSString*)title { 63 | dispatch_async(dispatch_get_main_queue(), ^{ 64 | UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert]; //may crash if on non-main thread 65 | [alert addAction:[UIAlertAction actionWithTitle:Localized(@"Got It") style:UIAlertActionStyleDefault handler:nil]]; 66 | [self showAlert:alert]; 67 | }); 68 | } 69 | 70 | - (void)applicationDidEnterBackground:(UIApplication *)application { 71 | __block int repeatCount=0; 72 | [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer* timer) { 73 | char* paths[][3] = { 74 | {"","Library/Preferences",".plist"}, 75 | {"","Library/Application Support/Containers",""}, 76 | {"","Library/SplashBoard/Snapshots",""}, 77 | {"","Library/Caches",""}, 78 | {"","Library/Saved Application State",".savedState"}, 79 | {"","Library/WebKit",""}, 80 | {"","Library/Cookies",".binarycookies"}, 81 | {"","Library/HTTPStorages",""}, 82 | }; 83 | 84 | for(int i=0; i 40) { 95 | [timer invalidate]; 96 | } 97 | }]; 98 | } 99 | 100 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 101 | // Override point for customization after application launch. 102 | 103 | NSString* roothideDir = jbroot(@"/var/mobile/Library/RootHide"); 104 | if(![NSFileManager.defaultManager fileExistsAtPath:roothideDir]) { 105 | NSDictionary* attr = @{NSFilePosixPermissions:@(0755), NSFileOwnerAccountID:@(501), NSFileGroupOwnerAccountID:@(501)}; 106 | assert([NSFileManager.defaultManager createDirectoryAtPath:roothideDir withIntermediateDirectories:YES attributes:attr error:nil]); 107 | } 108 | 109 | NSString* jsonPath = [NSBundle.mainBundle pathForResource:@"varCleanRules" ofType:@"json"]; 110 | NSLog(@"jsonPath=%@", jsonPath); 111 | NSData* jsonData = [NSData dataWithContentsOfFile:jsonPath]; 112 | assert(jsonData != NULL); 113 | 114 | uLong hash = crc32(0, jsonData.bytes, (uInt)jsonData.length); 115 | NSLog(@"hash=%lx", hash); 116 | assert(hash==VARCLEANRULESHASH); 117 | 118 | NSError* err; 119 | NSDictionary *rules = [NSJSONSerialization JSONObjectWithCommentedData:jsonData options:NSJSONReadingMutableContainers error:&err]; 120 | if(err) NSLog(@"json error=%@", err); 121 | assert(rules != NULL); 122 | NSLog(@"default rules=%@", rules); 123 | NSString *rulesFilePath = jbroot(@"/var/mobile/Library/RootHide/varCleanRules.plist"); 124 | if([NSFileManager.defaultManager fileExistsAtPath:rulesFilePath]) { 125 | assert([NSFileManager.defaultManager removeItemAtPath:rulesFilePath error:nil]); 126 | } 127 | NSLog(@"copy default rules to %@", rulesFilePath); 128 | assert([rules writeToFile:rulesFilePath atomically:YES]); 129 | 130 | NSString *customedRulesFilePath = jbroot(@"/var/mobile/Library/RootHide/varCleanRules-custom.plist"); 131 | if(![NSFileManager.defaultManager fileExistsAtPath:customedRulesFilePath]) { 132 | NSDictionary* template = [[NSDictionary alloc] init]; 133 | assert([template writeToFile:customedRulesFilePath atomically:YES]); 134 | } 135 | 136 | self.window = UIWindow.alloc.init; 137 | self.window.backgroundColor = [UIColor clearColor]; 138 | [self.window makeKeyAndVisible]; 139 | 140 | BlacklistViewController *listController = [BlacklistViewController sharedInstance]; 141 | varCleanController *cleanController = [varCleanController sharedInstance]; 142 | SettingViewController *setController = [SettingViewController sharedInstance]; 143 | 144 | 145 | listController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Blacklist",@"") image:[UIImage systemImageNamed:@"list.bullet.circle"] tag:0]; 146 | cleanController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"varClean",@"") image:[UIImage systemImageNamed:@"trash"] tag:1]; 147 | setController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Setting",@"") image:[UIImage systemImageNamed:@"gearshape"] tag:2]; 148 | 149 | 150 | UINavigationController *listNavigationController = [[UINavigationController alloc] initWithRootViewController:listController]; 151 | UINavigationController *cleanNavigationController = [[UINavigationController alloc] initWithRootViewController:cleanController]; 152 | UINavigationController *setNavigationController = [[UINavigationController alloc] initWithRootViewController:setController]; 153 | 154 | 155 | 156 | UITabBarController *tabBarController = [[UITabBarController alloc] init]; 157 | tabBarController.viewControllers = @[listNavigationController, cleanNavigationController, setNavigationController]; 158 | 159 | // 160 | //tabBarController.tabBar.scrollEdgeAppearance = [UITabBarAppearance new]; 161 | 162 | self.window.rootViewController = tabBarController; 163 | 164 | 165 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////// 166 | NSMutableArray* prebootDefaultContents = @[ 167 | @".fseventsd", 168 | @"active", //why don't some guys have this file on their devices? 169 | @"cryptex1", 170 | @"Cryptexes", 171 | ].mutableCopy; 172 | 173 | NSArray* activedBootDefaultContents = @[ 174 | @"AppleInternal", 175 | @"private", 176 | @"System", 177 | @"usr", 178 | @"LocalPolicy.cryptex1.img4", //ios16+? 179 | ]; 180 | 181 | NSMutableString* activedBootHash = [NSMutableString new]; 182 | io_registry_entry_t registryEntry = IORegistryEntryFromPath(kIOMainPortDefault, "IODeviceTree:/chosen"); 183 | if (registryEntry) { 184 | CFDataRef bootManifestHashData = IORegistryEntryCreateCFProperty(registryEntry, CFSTR("boot-manifest-hash"), NULL, 0); 185 | CFIndex bootManifestHashLength = CFDataGetLength(bootManifestHashData); 186 | const UInt8* bytes = CFDataGetBytePtr(bootManifestHashData); 187 | if(bytes) for(int i=0; i0) ? [@"/private/preboot" stringByAppendingPathComponent:activedBootHash] : nil; 195 | if(activedBootHash && activedBootPath && [NSFileManager.defaultManager fileExistsAtPath:activedBootPath]) 196 | { 197 | [prebootDefaultContents addObject:activedBootHash]; 198 | 199 | NSArray* prebootContent = [NSFileManager.defaultManager contentsOfDirectoryAtPath:@"/private/preboot" error:nil]; 200 | 201 | NSArray* activedBootContent = [NSFileManager.defaultManager contentsOfDirectoryAtPath:activedBootPath error:nil]; 202 | 203 | NSMutableSet* prebootContentUnknownSet = [NSMutableSet setWithArray:prebootContent]; 204 | [prebootContentUnknownSet minusSet:[NSSet setWithArray:prebootDefaultContents]]; 205 | 206 | NSMutableSet* activedBootContentUnknownSet = [NSMutableSet setWithArray:activedBootContent]; 207 | [activedBootContentUnknownSet minusSet:[NSSet setWithArray:activedBootDefaultContents]]; 208 | 209 | NSArray* unknownContents = [prebootContentUnknownSet.allObjects arrayByAddingObjectsFromArray:activedBootContentUnknownSet.allObjects]; 210 | 211 | if(unknownContents.count > 0) 212 | { 213 | NSMutableArray* items = [NSMutableArray new]; 214 | [unknownContents enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 215 | [items addObject:[NSString stringWithFormat:@"\"%@\"",obj]]; 216 | }]; 217 | 218 | [AppDelegate showMessage:[NSString stringWithFormat:@"%@\n\n%@:\n\n%@\n\n(%@)",Localized(@"⚠️Jailbreak Detection Warning⚠️"), Localized(@"Legacy rootless jailbreak(s)"), [items componentsJoinedByString:@"\n\n"], 219 | Localized(@"*WARNING*: Don't touch any other files in /private/preboot/, otherwise it will cause bootloop")] 220 | title:Localized(@"⚠️Warning⚠️")]; 221 | 222 | pid_t pid=0; 223 | char* args[] = {"/sbin/mount", "-u", "-w", "/private/preboot", NULL}; 224 | posix_spawn(&pid, args[0], NULL, NULL, args, NULL); 225 | if(pid > 0) { 226 | int status=0; 227 | waitpid(pid, &status, 0); 228 | } 229 | } 230 | } 231 | else 232 | { 233 | [AppDelegate showMessage:[NSString stringWithFormat:@"%@: %@",Localized(@"Unknown preboot system"),activedBootHash] title:Localized(@"Error")]; 234 | } 235 | 236 | 237 | NSArray* defaultBindMounts = @[ 238 | @"/usr/standalone/firmware", 239 | @"/System/Library/Pearl/ReferenceFrames", 240 | @"/System/Library/Caches/com.apple.factorydata", 241 | ]; 242 | 243 | NSMutableArray* unknownBindMounts = [NSMutableArray new]; 244 | 245 | struct statfs * ss=NULL; 246 | int n = getmntinfo(&ss, 0); //MNT_NOWAIT); 247 | for(int i=0; i 0) 256 | { 257 | NSMutableArray* items = [NSMutableArray new]; 258 | for(NSString* mnt in unknownBindMounts) { 259 | [items addObject:[NSString stringWithFormat:@"\n\"%@\"", mnt]]; 260 | } 261 | 262 | [AppDelegate showMessage:[NSString stringWithFormat:@"%@\n\n%@:\n%@\n",Localized(@"⚠️Jailbreak Detection Warning⚠️"),Localized(@"Unknown Bindfs Mount(s)"),[items componentsJoinedByString:@"\n"]] title:Localized(@"⚠️Warning⚠️")]; 263 | } 264 | 265 | dispatch_async(dispatch_get_global_queue(0, 0), ^{ 266 | 267 | int ports[] = { 22, 2222 }; 268 | for(int i=0; i 2 | 3 | 4 | 5 | 9 | com.apple.private.security.storage.adprivacyd 10 | 11 | com.apple.private.security.storage.amfid 12 | 13 | com.apple.private.security.storage.AppBundles 14 | 15 | com.apple.private.security.storage.AppDataContainers 16 | 17 | com.apple.private.security.storage.automation-mode 18 | 19 | com.apple.private.security.storage.Biome 20 | 21 | com.apple.private.security.storage.Calendar 22 | 23 | com.apple.private.security.storage.CallHistory 24 | 25 | com.apple.private.security.storage.CarrierBundles 26 | 27 | com.apple.private.security.storage.chronod 28 | 29 | com.apple.private.security.storage.CloudDocsDB 30 | 31 | com.apple.private.security.storage.CloudKit 32 | 33 | com.apple.private.security.storage.containers 34 | 35 | com.apple.private.security.storage.CoreFollowUp 36 | 37 | com.apple.private.security.storage.CoreKnowledge 38 | 39 | com.apple.private.security.storage.Cryptex 40 | 41 | com.apple.private.security.storage.demo_backup 42 | 43 | com.apple.private.security.storage.DocumentRevisions 44 | 45 | com.apple.private.security.storage.DumpPanic 46 | 47 | com.apple.private.security.storage.ExposureNotification 48 | 49 | com.apple.private.security.storage.FaceTime 50 | 51 | com.apple.private.security.storage.familycircled 52 | 53 | com.apple.private.security.storage.FindMy 54 | 55 | com.apple.private.security.storage.fpsd 56 | 57 | com.apple.private.security.storage.Health 58 | 59 | com.apple.private.security.storage.HomeAI 60 | 61 | com.apple.private.security.storage.HomeKit 62 | 63 | com.apple.private.security.storage.iCloudDrive 64 | 65 | com.apple.private.security.storage.idcredd 66 | 67 | com.apple.private.security.storage.IdentityServices 68 | 69 | com.apple.private.security.storage.kbd 70 | 71 | com.apple.private.security.storage.Keychains 72 | 73 | com.apple.private.security.storage.Lockdown 74 | 75 | com.apple.private.security.storage.Mail 76 | 77 | com.apple.private.security.storage.Messages 78 | 79 | com.apple.private.security.storage.MessagesMetaData 80 | 81 | com.apple.private.security.storage.MobileContainerManager 82 | 83 | com.apple.private.security.storage.MobileDocuments 84 | 85 | com.apple.private.security.storage.MobileIdentityService 86 | 87 | com.apple.private.security.storage.mobilesync 88 | 89 | com.apple.private.security.storage.multimodalsearchd 90 | 91 | com.apple.private.security.storage.NanoTimeKit.FaceSupport 92 | 93 | com.apple.private.security.storage.News 94 | 95 | com.apple.private.security.storage.Notes 96 | 97 | com.apple.private.security.storage.Photos 98 | 99 | com.apple.private.security.storage.PhotosLibraries 100 | 101 | com.apple.private.security.storage.pipelined 102 | 103 | com.apple.private.security.storage.preferences 104 | 105 | com.apple.private.security.storage.PrivacyAccounting 106 | 107 | com.apple.private.security.storage.Safari 108 | 109 | com.apple.private.security.storage.SearchParty 110 | 111 | com.apple.private.security.storage.SecureElementService 112 | 113 | com.apple.private.security.storage.SensorKit 114 | 115 | com.apple.private.security.storage.SFAnalytics 116 | 117 | com.apple.private.security.storage.SiriInference 118 | 119 | com.apple.private.security.storage.SiriReferenceResolution 120 | 121 | com.apple.private.security.storage.SiriVocabulary 122 | 123 | com.apple.private.security.storage.SoC 124 | 125 | com.apple.private.security.storage.SpeechPersonalizedLM 126 | 127 | com.apple.private.security.storage.Spotlight 128 | 129 | com.apple.private.security.storage.StatusKit 130 | 131 | com.apple.private.security.storage.Stocks 132 | 133 | com.apple.private.security.storage.Suggestions 134 | 135 | com.apple.private.security.storage.SymptomFramework 136 | 137 | com.apple.private.security.storage.sysdagnose.ScreenshotServicesService 138 | 139 | com.apple.private.security.storage.TCC 140 | 141 | com.apple.private.security.storage.TimeMachine 142 | 143 | com.apple.private.security.storage.triald 144 | 145 | com.apple.private.security.storage.trustd 146 | 147 | com.apple.private.security.storage.trustd-private 148 | 149 | com.apple.private.security.storage.universalaccess 150 | 151 | com.apple.private.security.storage.Voicemail 152 | 153 | com.apple.private.security.storage.Wireless 154 | 155 | com.apple.private.security.disk-device-access 156 | 157 | com.apple.rootless.storage.ane_model_cache 158 | 159 | com.apple.rootless.storage.apfs_boot_mount 160 | 161 | com.apple.rootless.storage.clientScripter 162 | 163 | com.apple.rootless.storage.com.apple.mediaanalysisd 164 | 165 | com.apple.rootless.storage.com.apple.MobileAsset.CarPlayAppBlacklist 166 | 167 | com.apple.rootless.storage.com.apple.MobileAsset.DeviceCheck 168 | 169 | com.apple.rootless.storage.com.apple.MobileAsset.DictionaryServices.dictionary2 170 | 171 | com.apple.rootless.storage.com.apple.MobileAsset.DuetExpertCenterAsset 172 | 173 | com.apple.rootless.storage.com.apple.MobileAsset.EmbeddedNL 174 | 175 | com.apple.rootless.storage.com.apple.MobileAsset.Font5 176 | 177 | com.apple.rootless.storage.com.apple.MobileAsset.Font6 178 | 179 | com.apple.rootless.storage.com.apple.MobileAsset.HealthKt.FeatureAvailability 180 | 181 | com.apple.rootless.storage.com.apple.MobileAsset.HomeKit 182 | 183 | com.apple.rootless.storage.com.apple.MobileAsset.MacinTalkVoiceAssets 184 | 185 | com.apple.rootless.storage.com.apple.MobileAsset.MailDynamicData 186 | 187 | com.apple.rootless.storage.com.apple.MobileAsset.MXLongFormVideoApps 188 | 189 | com.apple.rootless.storage.com.apple.MobileAsset.network.networknomicon 190 | 191 | com.apple.rootless.storage.com.apple.MobileAsset.PKITrustSupplementals 192 | 193 | com.apple.rootless.storage.com.apple.MobileAsset.SharingDeviceAssets 194 | 195 | com.apple.rootless.storage.com.apple.MobileAsset.SiriShortcutsMobileAsset 196 | 197 | com.apple.rootless.storage.com.apple.MobileAsset.TimeZoneUpdate 198 | 199 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceServices.CombinedVocalizerVoices 200 | 201 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceServices.CustomVoice 202 | 203 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceServices.GryphonVoice 204 | 205 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceServicesVocalizerVoice 206 | 207 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceServices.VoiceResources 208 | 209 | com.apple.rootless.storage.com.apple.MobileAsset.VoiceTriggerAssets 210 | 211 | com.apple.rootless.storage.CoreAnalytics 212 | 213 | com.apple.rootless.storage.coreduet_knowledge_store 214 | 215 | com.apple.rootless.storage.coreidvd 216 | 217 | com.apple.rootless.storage.coreknowledge 218 | 219 | com.apple.rootless.storage.CoreRoutine 220 | 221 | com.apple.rootless.storage.CoreSpeech 222 | 223 | com.apple.rootless.storage.dmd 224 | 225 | com.apple.rootless.storage.dprivacyd_storage 226 | 227 | com.apple.rootless.storage.ExtensibleSSO 228 | 229 | com.apple.rootless.storage.facekit 230 | 231 | com.apple.rootless.storage.fpsd 232 | 233 | com.apple.rootless.storage.MobileStorageMounter 234 | 235 | com.apple.rootless.storage.MusicApp 236 | 237 | com.apple.rootless.storage.nsurlsessiond 238 | 239 | com.apple.rootless.storage.pearl-field-diagnostics 240 | 241 | com.apple.rootless.storage.proactivepredictions 242 | 243 | com.apple.rootless.storage.QLThumbnailCache 244 | 245 | com.apple.rootless.storage.remotemanagementd 246 | 247 | com.apple.rootless.storage.RoleAccountStaging 248 | 249 | com.apple.rootless.storage.sensorkit 250 | 251 | com.apple.rootless.storage.shortcuts 252 | 253 | com.apple.rootless.storage.siriremembers 254 | 255 | com.apple.rootless.storage.timezone 256 | 257 | com.apple.rootless.storage.triald 258 | 259 | com.apple.rootless.storage.voiceshortcuts 260 | 261 | com.apple.private.security.storage-exempt.heritable 262 | 263 | com.apple.private.security.storage.AppleMediaServices 264 | 265 | com.apple.private.security.storage.ContactlessReader 266 | 267 | com.apple.private.security.storage.CoreRoutine 268 | 269 | com.apple.private.security.storage.DiagnosticReports 270 | 271 | com.apple.private.security.storage.DiagnosticReports.read-write 272 | 273 | com.apple.private.security.storage.DoNotDisturb 274 | 275 | com.apple.private.security.storage.Home 276 | 277 | com.apple.private.security.storage.IntelligencePlatform 278 | 279 | com.apple.private.security.storage.Location 280 | 281 | com.apple.private.security.storage.ManagedConfiguration 282 | 283 | com.apple.private.security.storage.MapsSync 284 | 285 | com.apple.private.security.storage.MobileBackup 286 | 287 | com.apple.private.security.storage.MobileStorageMounter 288 | 289 | com.apple.private.security.storage.PassKit 290 | 291 | com.apple.private.security.storage.SiriFeatureStore 292 | 293 | com.apple.private.security.storage.SiriSELF 294 | 295 | com.apple.private.security.storage.SoundProfileAsset 296 | 297 | com.apple.private.security.storage.TextUnderstanding 298 | 299 | com.apple.private.security.storage.Weather 300 | 301 | com.apple.private.security.storage.appleaccountd 302 | 303 | com.apple.private.security.storage.ciconia 304 | 305 | com.apple.private.security.storage.clipserviced 306 | 307 | com.apple.private.security.storage.coreduet_knowledge_store 308 | 309 | com.apple.private.security.storage.driverkitd 310 | 311 | com.apple.private.security.storage.geoanalyticsd 312 | 313 | com.apple.private.security.storage.geod 314 | 315 | com.apple.private.security.storage.launchd 316 | 317 | com.apple.private.security.storage.sessionkitd 318 | 319 | com.apple.private.security.storage.sysdiagnose.ScreenshotServicesService 320 | 321 | com.apple.private.security.storage.sysdiagnose.sysdiagnose 322 | 323 | com.apple.private.security.storage.tmp 324 | 325 | com.apple.rootless.critical 326 | 327 | com.apple.rootless.datavault.metadata 328 | 329 | com.apple.rootless.install 330 | 331 | com.apple.rootless.install.heritable 332 | 333 | com.apple.rootless.restricted-block-devices 334 | 335 | com.apple.rootless.storage.MobileAssetDownload 336 | 337 | com.apple.rootless.storage.amsengagementd 338 | 339 | com.apple.rootless.storage.com.apple.MobileAsset.HealthKit.FeatureAvailability 340 | 341 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriDialogAssets 342 | 343 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriExperienceCam 344 | 345 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriFindMyConfigurationFiles 346 | 347 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriInferredHelpfulness 348 | 349 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriTextToSpeech 350 | 351 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingAsrAssistant 352 | 353 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingAsrHammer 354 | 355 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingAsrUaap 356 | 357 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingAttentionAssets 358 | 359 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingMorphun 360 | 361 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingNL 362 | 363 | com.apple.rootless.storage.com.apple.MobileAsset.Trial.Siri.SiriUnderstandingNLOverrides 364 | 365 | com.apple.rootless.storage.coreparsec_feedbacks 366 | 367 | com.apple.rootless.storage.coreparsec_uploadables 368 | 369 | com.apple.rootless.storage.early_boot_mount 370 | 371 | com.apple.rootless.storage.screentime 372 | 373 | com.apple.rootless.volume.ISCRecovery 374 | 375 | com.apple.rootless.volume.Preboot 376 | 377 | com.apple.rootless.volume.Recovery 378 | 379 | com.apple.rootless.volume.Update 380 | 381 | com.apple.rootless.volume.VM 382 | 383 | com.apple.rootless.volume.iSCPreboot 384 | 385 | 386 | 387 | -------------------------------------------------------------------------------- /RootHide/VarCleanController.m: -------------------------------------------------------------------------------- 1 | #import "varCleanController.h" 2 | #include "AppDelegate.h" 3 | #import "ZFCheckbox.h" 4 | 5 | @interface varCleanController () 6 | @property (nonatomic, retain) NSMutableArray* tableData; 7 | @end 8 | 9 | @implementation varCleanController 10 | 11 | + (instancetype)sharedInstance { 12 | static varCleanController* sharedInstance = nil; 13 | static dispatch_once_t onceToken; 14 | dispatch_once(&onceToken, ^{ 15 | sharedInstance = [[self alloc] init]; 16 | }); 17 | return sharedInstance; 18 | } 19 | 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | self.navigationController.navigationBar.hidden = NO; 24 | self.tableView.tableFooterView = [[UIView alloc] init]; 25 | self.clearsSelectionOnViewWillAppear = NO; 26 | 27 | [self setTitle:Localized(@"varClean")]; 28 | 29 | UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:Localized(@"Clean") style:UIBarButtonItemStylePlain target:self action:@selector(varClean)]; 30 | self.navigationItem.rightBarButtonItem = button; 31 | 32 | UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:Localized(@"SelectAll") style:UIBarButtonItemStylePlain target:self action:@selector(batchSelect)]; 33 | self.navigationItem.leftBarButtonItem = button2; 34 | 35 | self.tableData = [[NSMutableArray alloc] init]; 36 | 37 | UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 38 | refreshControl.tintColor = [UIColor grayColor]; 39 | [refreshControl addTarget:self action:@selector(manualRefresh) forControlEvents:UIControlEventValueChanged]; 40 | self.tableView.refreshControl = refreshControl; 41 | 42 | 43 | self.tableData = [self updateData:NO]; 44 | 45 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(autoRefresh) 46 | name:UIApplicationWillEnterForegroundNotification object:nil]; 47 | } 48 | 49 | - (void)batchSelect { 50 | int selected = 0; 51 | for(NSDictionary* group in self.tableData) { 52 | for(NSMutableDictionary* item in group[@"items"]) { 53 | if(![item[@"checked"] boolValue] && ![item[@"ignored"] boolValue]) { 54 | item[@"checked"] = @YES; 55 | selected++; 56 | } 57 | } 58 | } 59 | if(selected==0) for(NSDictionary* group in self.tableData) { 60 | for(NSMutableDictionary* item in group[@"items"]) { 61 | if([item[@"checked"] boolValue]) { 62 | item[@"checked"] = @NO; 63 | } 64 | } 65 | } 66 | [self.tableView reloadData]; 67 | } 68 | 69 | - (void)startRefresh:(BOOL)keepState { 70 | [self.tableView.refreshControl beginRefreshing]; 71 | dispatch_async(dispatch_get_global_queue(0, 0), ^{ 72 | NSMutableArray* newData = [self updateData:keepState]; 73 | dispatch_async(dispatch_get_main_queue(), ^{ 74 | self.tableData = newData; 75 | [self.tableView reloadData]; 76 | [self.tableView.refreshControl endRefreshing]; 77 | }); 78 | }); 79 | } 80 | 81 | - (void)manualRefresh { 82 | [self startRefresh:NO]; 83 | } 84 | 85 | - (void)autoRefresh { 86 | [self startRefresh:YES]; 87 | } 88 | 89 | - (void)viewWillAppear:(BOOL)animated { 90 | [super viewWillAppear:animated]; 91 | [self.tableView.refreshControl beginRefreshing]; 92 | [self.tableView.refreshControl endRefreshing]; 93 | } 94 | 95 | - (void)updateForRules:(NSDictionary*)rules customed:(NSMutableDictionary*)customedRules newData:(NSMutableArray*)newData keepState:(BOOL)keepState { 96 | for (NSString* path in rules) { 97 | NSMutableArray *folders = [[NSMutableArray alloc] init]; 98 | NSMutableArray *files = [[NSMutableArray alloc] init]; 99 | 100 | NSDictionary* ruleItem = [rules objectForKey:path]; 101 | 102 | NSFileManager *fileManager = [NSFileManager defaultManager]; 103 | 104 | NSArray *contents = [fileManager contentsOfDirectoryAtPath:path error:nil]; 105 | 106 | NSArray *whiteList = ruleItem[@"whitelist"]; 107 | NSArray *blackList = ruleItem[@"blacklist"]; 108 | 109 | NSDictionary* customedRuleItem = customedRules[path]; 110 | NSArray* customedWhiteList = customedRuleItem[@"whitelist"]; 111 | NSArray* customedBlackList = customedRuleItem[@"blacklist"]; 112 | [customedRules removeObjectForKey:path]; 113 | 114 | NSMutableDictionary *tableGroup = @{ 115 | @"group": path, 116 | @"items": @[] 117 | }.mutableCopy; 118 | 119 | for (NSString *file in contents) { 120 | 121 | BOOL checked = NO; 122 | BOOL ignored = NO; 123 | 124 | // blacklist priority 125 | if([self checkFileInList:file List:blackList]) 126 | { 127 | if([self checkFileInList:file List:customedWhiteList]) { 128 | ignored = YES; 129 | checked = NO; 130 | } else { 131 | checked = YES; 132 | } 133 | } 134 | else if([self checkFileInList:file List:customedBlackList]) 135 | { 136 | checked = YES; 137 | } 138 | else if([self checkFileInList:file List:whiteList]) 139 | { 140 | continue; 141 | } 142 | else if([ruleItem[@"default"] isEqualToString:@"blacklist"]) 143 | { 144 | if([self checkFileInList:file List:customedWhiteList] || [customedRuleItem[@"default"] isEqualToString:@"whitelist"]) { 145 | ignored = YES; 146 | checked = NO; 147 | } 148 | else { 149 | checked = YES; 150 | } 151 | } 152 | else if([ruleItem[@"default"] isEqualToString:@"whitelist"]) 153 | { 154 | if([customedRuleItem[@"default"] isEqualToString:@"blacklist"]) { 155 | checked = YES; 156 | } else { 157 | continue; 158 | } 159 | } 160 | else 161 | { 162 | if([self checkFileInList:file List:customedWhiteList] || [customedRuleItem[@"default"] isEqualToString:@"whitelist"]) { 163 | ignored = YES; 164 | checked = NO; 165 | } 166 | else if([customedRuleItem[@"default"] isEqualToString:@"blacklist"]) { 167 | checked = YES; 168 | } 169 | else { 170 | checked = NO; 171 | } 172 | } 173 | 174 | if(keepState) 175 | { 176 | for(NSDictionary* group in self.tableData) 177 | { 178 | if([group[@"group"] isEqualToString:path]) 179 | { 180 | for(NSDictionary* item in group[@"items"]) 181 | { 182 | if([item[@"name"] isEqualToString:file]) 183 | { 184 | if(!ignored) { 185 | checked = [item[@"checked"] boolValue]; 186 | } 187 | break; 188 | } 189 | } 190 | break; 191 | } 192 | } 193 | } 194 | 195 | NSString *filePath = [path stringByAppendingPathComponent:file]; 196 | 197 | BOOL isDirectory = NO; 198 | BOOL exists = [fileManager fileExistsAtPath:filePath isDirectory:&isDirectory]; 199 | BOOL isFolder = exists && isDirectory; 200 | 201 | NSMutableDictionary *tableItem = @{ 202 | @"name": file, 203 | @"path": filePath, 204 | @"isFolder": @(isFolder), 205 | @"checked": @(checked), 206 | @"ignored": @(ignored), 207 | }.mutableCopy; 208 | 209 | if(isFolder) { 210 | [folders addObject:tableItem]; 211 | } else { 212 | [files addObject:tableItem]; 213 | } 214 | } 215 | 216 | NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; 217 | NSArray *sortedFolders = [folders sortedArrayUsingDescriptors:@[sortDescriptor]]; 218 | NSArray *sortedFiles = [files sortedArrayUsingDescriptors:@[sortDescriptor]]; 219 | 220 | tableGroup[@"items"] = [[sortedFolders arrayByAddingObjectsFromArray:sortedFiles] mutableCopy]; 221 | [newData addObject:tableGroup]; 222 | } 223 | } 224 | 225 | - (NSMutableArray*)updateData:(BOOL)keepState { 226 | NSLog(@"updateData..."); 227 | NSMutableArray* newData = [[NSMutableArray alloc] init]; 228 | 229 | NSString *rulesFilePath = jbroot(@"/var/mobile/Library/RootHide/varCleanRules.plist"); 230 | NSDictionary *rules = [NSDictionary dictionaryWithContentsOfFile:rulesFilePath]; 231 | 232 | NSString *customedRulesFilePath = jbroot(@"/var/mobile/Library/RootHide/varCleanRules-custom.plist"); 233 | NSMutableDictionary *customedRules = [NSMutableDictionary dictionaryWithContentsOfFile:customedRulesFilePath]; 234 | 235 | [self updateForRules:rules customed:customedRules newData:newData keepState:keepState]; 236 | //continue processing the remaining paths that are not in the built-in list 237 | [self updateForRules:customedRules customed:nil newData:newData keepState:keepState]; 238 | 239 | NSComparator sorter = ^NSComparisonResult(NSDictionary* a, NSDictionary* b) 240 | { 241 | if([a[@"items"] count]!=0 && [b[@"items"] count]==0) return NSOrderedAscending; 242 | if([a[@"items"] count]==0 && [b[@"items"] count]!=0) return NSOrderedDescending; 243 | 244 | return [a[@"group"] compare:b[@"group"]]; 245 | }; 246 | [newData sortUsingComparator:sorter]; 247 | 248 | return newData; 249 | } 250 | 251 | - (BOOL)checkFileInList:(NSString *)fileName List:(NSArray*)list { 252 | for (NSObject* item in list) { 253 | if([item isKindOfClass:NSString.class]) { 254 | if ([fileName isEqualToString:(NSString*)item]) { 255 | return YES; 256 | } 257 | } else if([item isKindOfClass:NSDictionary.class]) { 258 | NSDictionary* condition = (NSDictionary*)item; 259 | NSString *name = condition[@"name"]; 260 | NSString *match = condition[@"match"]; 261 | 262 | if ([match isEqualToString:@"include"]) { 263 | if ([fileName rangeOfString:name].location != NSNotFound) { 264 | return YES; 265 | } 266 | } else if ([match isEqualToString:@"regexp"]) { 267 | NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:name options:0 error:nil]; 268 | NSUInteger result = [regex numberOfMatchesInString:fileName options:0 range:NSMakeRange(0, fileName.length)]; 269 | if(result != 0) return YES; 270 | } 271 | } 272 | } 273 | return NO; 274 | } 275 | 276 | - (void)varClean { 277 | NSLog(@"self.tableData=%@", self.tableData); 278 | 279 | [self.tableView.refreshControl beginRefreshing]; 280 | 281 | for(NSDictionary* group in [self.tableData copy]) { 282 | for(NSDictionary* item in [group[@"items"] copy]) 283 | { 284 | if(![item[@"checked"] boolValue]) continue; 285 | 286 | NSLog(@"clean=%@", item); 287 | 288 | /* 289 | NSString* backup = jbroot(@"/var/mobile/Library/RootHide/backup"); 290 | NSString* newpath = [backup stringByAppendingPathComponent:item[@"path"]]; 291 | NSString* dirpath = [newpath stringByDeletingLastPathComponent]; 292 | NSLog(@"newpath=%@, dirpath=%@", newpath, dirpath); 293 | if(![NSFileManager.defaultManager fileExistsAtPath:dirpath]) 294 | [NSFileManager.defaultManager createDirectoryAtPath:dirpath 295 | withIntermediateDirectories:YES attributes:nil error:nil]; 296 | [NSFileManager.defaultManager copyItemAtPath:item[@"path"] toPath:newpath error:nil]; 297 | //*/ 298 | 299 | // NSDirectoryEnumerator* enumerator = [NSFileManager.defaultManager enumeratorAtPath:item[@"path"]]; 300 | // if(enumerator) for(NSString* subpath in enumerator) 301 | // { 302 | // NSError* err; 303 | // if(![NSFileManager.defaultManager removeItemAtPath:[item[@"path"] stringByAppendingPathComponent:subpath] error:&err]) { 304 | // NSLog(@"clean failed=%@", err); 305 | // } 306 | // } 307 | 308 | NSError* err; 309 | if(![NSFileManager.defaultManager removeItemAtPath:item[@"path"] error:&err]) { 310 | NSLog(@"clean failed: %@", err); 311 | 312 | if(geteuid()!=0 || getegid()!=0) { 313 | NSLog(@"try RootUserRemoveItemAtPath: %@", item[@"path"]); 314 | BOOL RootUserRemoveItemAtPath(NSString* path); 315 | BOOL __ret = RootUserRemoveItemAtPath(item[@"path"]); 316 | } 317 | 318 | continue; 319 | } 320 | 321 | NSIndexPath* indexPath = [NSIndexPath indexPathForRow:[group[@"items"] indexOfObject:item] 322 | inSection:[self.tableData indexOfObject:group] ]; 323 | 324 | [group[@"items"] removeObject:item]; //delete source data first 325 | 326 | NSLog(@"indexPath=%@", indexPath); 327 | [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 328 | } 329 | } 330 | 331 | [self.tableView.refreshControl endRefreshing]; 332 | 333 | self.tableData = [self updateData:NO]; 334 | [self.tableView reloadData]; 335 | } 336 | 337 | #pragma mark - Table view data source 338 | 339 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 340 | NSLog(@"numberOfRowsInSection=%ld", self.tableData.count); 341 | return self.tableData.count; 342 | } 343 | 344 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 345 | NSDictionary *groupData = self.tableData[section]; 346 | NSArray *items = groupData[@"items"]; 347 | NSLog(@"numberOfRowsInSection=%ld %ld", (long)section, items.count); 348 | return items.count; 349 | } 350 | 351 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 352 | NSDictionary *groupData = self.tableData[section]; 353 | return groupData[@"group"]; 354 | } 355 | 356 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 357 | NSLog(@"cellForRowAtIndexPath=%@", indexPath); 358 | UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; 359 | 360 | NSDictionary *groupData = self.tableData[indexPath.section]; 361 | NSArray *items = groupData[@"items"]; 362 | 363 | NSDictionary *item = items[indexPath.row]; 364 | cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",[item[@"isFolder"] boolValue] ? @"🗂️" : @"📄", item[@"name"]]; 365 | if([item[@"ignored"] boolValue]) { 366 | cell.textLabel.textColor = UIColor.grayColor; 367 | } 368 | ZFCheckbox *checkbox = [[ZFCheckbox alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 369 | checkbox.userInteractionEnabled = FALSE; //passthrough to didSelectRowAtIndexPath 370 | [checkbox setSelected:[item[@"checked"] boolValue]]; 371 | cell.accessoryView = checkbox; 372 | 373 | UILongPressGestureRecognizer *gest = [[UILongPressGestureRecognizer alloc] 374 | initWithTarget:self action:@selector(cellLongPress:)]; 375 | [cell.contentView addGestureRecognizer:gest]; 376 | gest.view.tag = indexPath.row | indexPath.section<<32; 377 | gest.minimumPressDuration = 1; 378 | 379 | return cell; 380 | } 381 | 382 | - (void)cellLongPress:(UIGestureRecognizer *)recognizer 383 | { 384 | if (recognizer.state == UIGestureRecognizerStateBegan) 385 | { 386 | long tag = recognizer.view.tag; 387 | NSIndexPath* indexPath = [NSIndexPath indexPathForRow:tag&0xFFFFFFFF inSection:tag>>32]; 388 | 389 | NSDictionary *groupData = self.tableData[indexPath.section]; 390 | NSArray *items = groupData[@"items"]; 391 | NSMutableDictionary *item = items[indexPath.row]; 392 | NSLog(@"open item %@", item); 393 | NSURL* url = [NSURL URLWithString:[@"filza://view" stringByAppendingString: 394 | [item[@"path"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] ]; 395 | 396 | NSLog(@"open url %@", url); 397 | [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil]; 398 | UIPasteboard.generalPasteboard.string = item[@"path"]; 399 | } 400 | } 401 | 402 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 403 | [tableView deselectRowAtIndexPath:indexPath animated:YES];// 404 | 405 | UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 406 | ZFCheckbox *checkbox = (ZFCheckbox*)cell.accessoryView; 407 | 408 | BOOL newstate = !checkbox.selected; 409 | 410 | [checkbox setSelected:newstate animated:YES]; 411 | 412 | NSDictionary *groupData = self.tableData[indexPath.section]; 413 | NSArray *items = groupData[@"items"]; 414 | NSMutableDictionary *item = items[indexPath.row]; 415 | item[@"checked"] = @(newstate); 416 | NSLog(@"select=%@", item); 417 | } 418 | @end 419 | -------------------------------------------------------------------------------- /RootHide/VarCleanRules.json: -------------------------------------------------------------------------------- 1 | { 2 | "/var" : { 3 | "whitelist":[ 4 | ".DocumentRevisions-V100", 5 | ".fseventsd", 6 | ".overprovisioning_file", 7 | "Keychains", 8 | "MobileDevice", 9 | "buddy", 10 | "datamigrator", 11 | "folders", 12 | "keybags", 13 | "networkd", 14 | "root", 15 | "tmp", 16 | "Managed Preferences", 17 | "MobileSoftwareUpdate", 18 | "containers", 19 | "db", 20 | "hardware", 21 | "mobile", 22 | "preferences", 23 | "run", 24 | "vm", 25 | "MobileAsset", 26 | "audit", 27 | "empty", 28 | "installd", 29 | "log", 30 | "logs", 31 | "msgs", 32 | "protected", 33 | "select", 34 | "wireless", 35 | "dirs_cleaner", 36 | "dextcores", 37 | "staged_system_apps", 38 | "internal", 39 | ], 40 | "blacklist":[ 41 | "jb", 42 | "stash", 43 | "alternatives", 44 | "ap", 45 | "apt", 46 | "bin", 47 | "bzip2", 48 | "cache", 49 | "dpkg", 50 | "etc", 51 | "gzip", 52 | "local", 53 | "lib", 54 | "Lib", 55 | "libexec", 56 | "Library", 57 | "LIY", 58 | "Liy", 59 | "newuser", 60 | "profile", 61 | "sbin", 62 | "sh", 63 | "share", 64 | "ssh", 65 | "sudo_logsrvd.conf", 66 | "suid_profile", 67 | "sy", 68 | "usr", 69 | "zlogin", 70 | "zlogout", 71 | "zprofile", 72 | "zshenv", 73 | "zshrc", 74 | "master.passwd", 75 | ".keep_symlinks", 76 | ] 77 | }, 78 | 79 | "/var/log" : { 80 | "default" : "blacklist", 81 | "whitelist":[ 82 | {"match":"regexp", "name":"^com\\.apple\\."}, 83 | "asl", 84 | "mDNSResponder", 85 | "ppp", 86 | ], 87 | "blacklist":[ 88 | ] 89 | }, 90 | 91 | "/var/containers" : { 92 | "whitelist":[ 93 | "Bundle", 94 | "Data", 95 | "Shared", 96 | "Temp", 97 | ] 98 | }, 99 | "/var/containers/Bundle" : { 100 | "whitelist":[ 101 | "Application", 102 | ], 103 | "blacklist":[ 104 | "dylib", 105 | "xina", 106 | ] 107 | }, 108 | 109 | "/var/root" : { 110 | "whitelist":[ 111 | "Library", 112 | ".bootstrapped", 113 | ".aks_migrate", 114 | ".aks_whitelist", 115 | ".mkb_seshat_health", 116 | ".obliterated", 117 | ".aks_allowlist", 118 | ], 119 | "blacklist":[ 120 | ".bash_history", 121 | ".config", //FilzaTS Shell 122 | ".local", //FilzaTS Shell 123 | ] 124 | }, 125 | "/var/root/Library" : { 126 | "whitelist":[ 127 | "Application Support", 128 | "Caches", 129 | "HTTPStorages", 130 | "Lockdown", 131 | "Logs", 132 | "MobileContainerManager", 133 | "Preferences", 134 | "USBRestricted", 135 | "com.apple.wifianalyticsd", 136 | "Catacomb" //FaceID 137 | ], 138 | }, 139 | "/var/root/Library/Application Support" : { 140 | "whitelist":[ 141 | {"match":"regexp", "name":"^com\\.apple\\."}, 142 | ], 143 | "blacklist":[ 144 | ] 145 | }, 146 | "/var/root/Library/Caches" : { 147 | "default" : "blacklist", 148 | "whitelist":[ 149 | {"match":"regexp", "name":"^com\\.apple\\."}, 150 | "Backup", 151 | "locationd", 152 | ], 153 | "blacklist":[ 154 | "shshd" 155 | ] 156 | }, 157 | "/var/root/Library/HTTPStorages" : { 158 | "default" : "blacklist", 159 | "whitelist":[ 160 | {"match":"regexp", "name":"^com\\.apple\\."}, 161 | ], 162 | "blacklist":[ 163 | "shshd", 164 | "FilzaHelper", 165 | ] 166 | }, 167 | "/var/root/Library/Preferences" : { 168 | "default" : "blacklist", 169 | "whitelist":[ 170 | {"match":"regexp", "name":"^com\\.apple\\."}, 171 | {"match":"regexp", "name":"^systemgroup\\.com\\.apple\\."}, 172 | "UserEventAgent.plist", 173 | "osanalyticshelper.plist", 174 | "wifid.plist", 175 | ], 176 | "blacklist":[ 177 | "com.xina.jailbreak.plist", 178 | "com.xina.blacklist.plist", 179 | "ws.hbang.Terminal.plist", 180 | ] 181 | }, 182 | 183 | "/var/mobile" : { 184 | "whitelist":[ 185 | ".fseventsd", 186 | ".DocumentRevisions-V100", 187 | "Applications", 188 | "Containers", 189 | "Documents", 190 | "Downloads", 191 | "Library", 192 | "Media", 193 | "MobileSoftwareUpdate", 194 | "tmp", 195 | ], 196 | "blacklist":[ 197 | "log.txt", 198 | ".ekenablelogging", 199 | ".eksafemode", 200 | "Serotonin.jp2", 201 | ] 202 | }, 203 | "/var/mobile/Media" : { 204 | "default" : "whitelist", 205 | "whitelist":[ 206 | {"match":"regexp", "name":"^com\\.apple\\."}, 207 | "AirFair", 208 | "Books", 209 | "CloudAssets", 210 | "DCIM", 211 | "Deferred", 212 | "Downloads", 213 | "EnhancedAudioSharedKeys", 214 | "Espresso", 215 | "LoFiCloudAssets", 216 | "ManagedPurchases", 217 | "MediaAnalysis", 218 | "Music", 219 | "PhotoData", 220 | "PhotoStreamsData", 221 | "Photos", 222 | "Podcasts", 223 | "PublicStaging", 224 | "Purchases", 225 | "Radio", 226 | "Recordings", 227 | "Vibrations", 228 | "iTunes_Control", 229 | ], 230 | "blacklist":[ 231 | {"match":"include", "name":"Auto"}, 232 | {"match":"include", "name":"Touch"}, 233 | {"match":"include", "name":"Theme"}, 234 | {"match":"include", "name":"Script"}, 235 | "Cydia", 236 | "CatScript", 237 | "TrollRecorder", 238 | ".evasi0n7_installed", 239 | ".loli", 240 | "blackb0x.log", 241 | "Divise", 242 | ".bootstrapped_electraRemover", 243 | "install", 244 | "log.txt", 245 | "p0laris", 246 | ".Trash", 247 | "spirit", 248 | "TouchSprite", 249 | ".bootstrapped_Th0r_remover", 250 | "AppRank", 251 | "KDTScript", 252 | "NeonStaticClockIcon.png", 253 | ] 254 | }, 255 | "/var/mobile/Documents" : { 256 | "whitelist":[ 257 | {"match":"regexp", "name":"^com\\.apple\\."}, 258 | ], 259 | "blacklist":[ 260 | ] 261 | }, 262 | "/var/mobile/Library" : { 263 | "whitelist":[ 264 | {"match":"regexp", "name":"^com\\.apple\\."}, 265 | "Accessibility", 266 | "CoreBrightness", 267 | "Keyboard", 268 | "Preferences", 269 | "Voicemail", 270 | "Accounts", 271 | "CoreDuet", 272 | "KeyboardServices", 273 | "PrivacyAccounting", 274 | "WatchConnectivity", 275 | "AddressBook", 276 | "CoreFollowUp", 277 | "LASD", 278 | "Recents", 279 | "Weather", 280 | "AggregateDictionary", 281 | "CountryBundles", 282 | "LanguageModeling", 283 | "Reminders", 284 | "WebClips", 285 | "AirPlayRoutePrediction", 286 | "CrashReporter", 287 | "Logs", 288 | "ReplayKit", 289 | "WebKit", 290 | "ApplePushService", 291 | "DES", 292 | "Mail", 293 | "SMS", 294 | "chronod", 295 | "Application Support", 296 | "DataAccess", 297 | "MediaRemote", 298 | "Safari", 299 | "com.apple.ClipServices.clipserviced", 300 | "ApplicationSync", 301 | "DataDeliveryServices", 302 | "MediaStream", 303 | "SafariSafeBrowsing", 304 | "com.apple.FamilyControlsAgent", 305 | "Assets", 306 | "DeviceRegistry.dontBackUp", 307 | "MedicalID", 308 | "SafeHarbor", 309 | "com.apple.VideoSubscriberAccount.DeveloperService", 310 | "Assistant", 311 | "DeviceRegistry.state", 312 | "MemoryMaintenance", 313 | "Saved Application State", 314 | "com.apple.WatchListKit", 315 | "Avatar", 316 | "DiagnosticPipeline", 317 | "MessagesMetaData", 318 | "SecureElementService", 319 | "com.apple.appleaccountd", 320 | "BackBoard", 321 | "DifferentialPrivacy", 322 | "Mobile Documents", 323 | "Sharing", 324 | "com.apple.bluetooth.services.cloud", 325 | "Backup", 326 | "DoNotDisturb", 327 | "MobileBluetooth", 328 | "Shortcuts", 329 | "com.apple.iTunesCloud", 330 | "Biome", 331 | "DuetActivityScheduler", 332 | "MobileContainerManager", 333 | "SoftwareUpdate", 334 | "com.apple.icloud.searchpartyd", 335 | "BulletinBoard", 336 | "DuetExpertCenter", 337 | "MobileInstallation", 338 | "SoftwareUpdateCore", 339 | "com.apple.imagecapture", 340 | "Caches", 341 | "ExposureNotification", 342 | "NFStorage", 343 | "SplashBoard", 344 | "com.apple.internal.ck", 345 | "Calendar", 346 | "ExternalAccessory", 347 | "NanoMusicSync", 348 | "Spotlight", 349 | "com.apple.itunesstored", 350 | "CallDirectory", 351 | "FaceTime", 352 | "NanoTimeKit", 353 | "SpringBoard", 354 | "com.apple.nsurlsessiond", 355 | "CallHistoryDB", 356 | "FairPlay", 357 | "Notes", 358 | "StatusKit", 359 | "com.apple.nsurlsessiond-launchd", 360 | "CallHistoryTransactions", 361 | "OSAnalytics", 362 | "Suggestions", 363 | "com.apple.private.SensorKit", 364 | "CallServices", 365 | "FinHealth", 366 | "OTALogging", 367 | "SyncedPreferences", 368 | "coreidvd", 369 | "Carrier Bundles", 370 | "FrontBoard", 371 | "OnDemandResources", 372 | "TCC", 373 | "dmd", 374 | "CarrierDefault.bundle", 375 | "GameKit", 376 | "Operator Bundle.bundle", 377 | "Translation", 378 | "homed", 379 | "ClassKit", 380 | "HTTPStorages", 381 | "Operator1Bundle.bundle", 382 | "Trial", 383 | "idcredd", 384 | "Contacts", 385 | "Handwriting", 386 | "Operator2Bundle.bundle", 387 | "UserConfigurationProfiles", 388 | "locationd", 389 | "ControlCenter", 390 | "Health", 391 | "POMMES", 392 | "UserFonts", 393 | "mad", 394 | "Cookies", 395 | "ISP", 396 | "Passes", 397 | "UserNotifications", 398 | "terminus", 399 | "CoreAS", 400 | "IdentityServices", 401 | "PersonalizationPortrait", 402 | "UserNotificationsUI", 403 | "CoreAccessories", 404 | "Inboxes", 405 | "Photos", 406 | "VoiceServices", 407 | "CoreBehavior", 408 | "Intents", 409 | "PowerUI", 410 | "VoiceTrigger", 411 | "ConfigurationProfiles", 412 | "ProactiveInsights", 413 | "Carrier Bundle.bundle", 414 | "Carrier1Bundle.bundle", 415 | "PeopleSuggester", 416 | "News", 417 | ".locallized", 418 | "CloudStorage", 419 | "Finance", 420 | "Measure", 421 | "News", 422 | "Recordings", 423 | "ResponseKit", 424 | "Settings", 425 | "studentd", 426 | "VirtualCaptureCard", 427 | "Wallet", 428 | "AppleMediaServices", 429 | "IntelligencePlatform", 430 | "sessionkitd", 431 | "LiveFiles", 432 | "Maps", 433 | "OSIntelligence", 434 | "Phone", 435 | "Seymour", 436 | "UnifiedAssetFramework", 437 | ], 438 | "blacklist":[ 439 | "Sileo", 440 | "Filza", 441 | "Flex3", 442 | "SBSettings", 443 | "iCleaner", 444 | ] 445 | }, 446 | "/var/mobile/Library/Logs" : { 447 | "default" : "whitelist", 448 | "whitelist":[ 449 | ], 450 | "blacklist":[ 451 | "Cydia" 452 | ] 453 | }, 454 | "/var/mobile/Library/UserConfigurationProfiles/PublicInfo/" : { 455 | "whitelist":[ 456 | "MCMeta.plist", 457 | "NamespacedUserSettings.plist", 458 | "PublicEffectiveUserSettings.plist", 459 | "Truth.plist" 460 | ], 461 | "blacklist":[ 462 | "Flex3Patches.plist" 463 | ] 464 | }, 465 | "/var/mobile/Library/Preferences" : { 466 | "default" : "blacklist", 467 | "whitelist":[ 468 | {"match":"regexp", "name":"^com\\.apple\\."}, 469 | {"match":"regexp", "name":"^systemgroup\\.com\\.apple\\."}, 470 | ".GlobalPreferences.plist", 471 | ".GlobalPreferences_m.plist", 472 | "bluetoothaudiod.plist", 473 | "NetworkInterfaces.plist", 474 | "OSThermalStatus.plist", 475 | "preferences.plist", 476 | "osanalyticshelper.plist", 477 | "UserEventAgent.plist", 478 | "wifid.plist", 479 | "dprivacyd.plist", 480 | "silhouette.plist", 481 | "nfcd.plist", 482 | "kNPProgressTrackerDomain.plist", 483 | "siriknowledged.plist", 484 | "UITextInputContextIdentifiers.plist", 485 | "mobile_storage_proxy.plist", 486 | "splashboardd.plist", 487 | "mobile_installation_proxy.plist", 488 | "languageassetd.plist", 489 | "ptpcamerad.plist", 490 | "com.google.gmp.measurement.monitor.plist", 491 | "com.google.gmp.measurement.plist", 492 | ], 493 | "blacklist":[ 494 | "com.roothide.manager.plist", 495 | "com.opa334.Dopamine.roothide.plist", 496 | "com.opa334.Dopamine.plist", 497 | "com.tigisoftware.Filza.plist", 498 | "com.xina.jailbreak.plist", 499 | "org.coolstar.SileoStore.plist", 500 | "ru.domo.cocoatop64.plist", 501 | "ws.hbang.Terminal.plist", 502 | "xyz.willy.Zebra.plist", 503 | "com.apple.lockscreencache-new.plist", 504 | "com.apple.homescreencache-new.plist", 505 | "com.apple.terminal.plist", 506 | ] 507 | }, 508 | "/var/mobile/Library/Application Support" : { 509 | "whitelist":[ 510 | {"match":"regexp", "name":"^com\\.apple\\."}, 511 | "CloudDocs", 512 | "CloudKitMailConversationsFlags", 513 | "Containers", 514 | "FileProvider", 515 | "UsageTrackingAgent", 516 | "videosubscriptionsd", 517 | "CNDuplication", 518 | "icloudsubscriptionoptimizerd", 519 | "networkserviceproxy", 520 | 521 | ], 522 | "blacklist":[ 523 | "xyz.willy.Zebra", 524 | "com.apple.Terminal", 525 | ] 526 | }, 527 | "/var/mobile/Library/Application Support/Containers" : { 528 | "default" : "blacklist", 529 | "blacklist":[ 530 | "xyz.willy.Zebra", 531 | "com.tigisoftware.Filza", 532 | "org.coolstar.SileoStore", 533 | "com.apple.Terminal", 534 | ] 535 | }, 536 | "/var/mobile/Library/SplashBoard/Snapshots" : { 537 | "default" : "blacklist", 538 | "whitelist":[ 539 | {"match":"regexp", "name":"^com\\.apple\\."}, 540 | ], 541 | "blacklist":[ 542 | "com.roothide.manager", 543 | "com.opa334.Dopamine.roothide", 544 | "com.opa334.Dopamine", 545 | "com.tigisoftware.Filza", 546 | "com.xina.jailbreak", 547 | "org.coolstar.SileoStore", 548 | "ru.domo.cocoatop64", 549 | "ws.hbang.Terminal", 550 | "xyz.willy.Zebra", 551 | "com.apple.Terminal", 552 | ] 553 | }, 554 | "/var/mobile/Library/Caches" : { 555 | "default" : "blacklist", 556 | "whitelist":[ 557 | {"match":"regexp", "name":"^com\\.apple\\."}, 558 | {"match":"regexp", "name":"^TelephonyUI-\\d+$"}, 559 | {"match":"regexp", "name":"^FamilyMarquee.*Mode-.*\\.png$"}, 560 | ".com.apple.persistentconnection.settings.lock.lock", 561 | "Checkpoint.plist", 562 | "CloudKit", 563 | "GameKit", 564 | "GeoServices", 565 | "FamilyCircle", 566 | "DateFormats.plist", 567 | "INSTALLATION", 568 | "MappedImageCache", 569 | "PassKit", 570 | "RemoteConfiguration.plist", 571 | "VoiceServices", 572 | "VoiceTrigger", 573 | "mediaanalysisd-service", 574 | "rtcreportingd", 575 | "sharedCaches", 576 | "Backup", 577 | "ssu", 578 | ], 579 | "blacklist":[ 580 | "ImageTables", //Filza 581 | "SentryCrash", 582 | "io.sentry", 583 | "com.hackemist.SDImageCache", 584 | "com.opa334.Dopamine", 585 | "com.tigisoftware.Filza", 586 | "org.coolstar.SileoStore", 587 | "ws.hbang.Terminal", 588 | "xyz.willy.Zebra", 589 | "Cephei", 590 | "com.apple.Terminal", 591 | ] 592 | }, 593 | "/var/mobile/Library/Saved Application State" : { 594 | "default" : "blacklist", 595 | "whitelist":[ 596 | {"match":"regexp", "name":"^com\\.apple\\."}, 597 | ], 598 | "blacklist":[ 599 | "com.opa334.Dopamine.savedState", 600 | "com.tigisoftware.Filza.savedState", 601 | "org.coolstar.SileoStore.savedState", 602 | "ws.hbang.Terminal.savedState", 603 | "xyz.willy.Zebra.savedState", 604 | "ru.domo.cocoatop64.savedState", 605 | "com.apple.Terminal.savedState", 606 | ] 607 | }, 608 | "/var/mobile/Library/WebKit" : { 609 | "whitelist":[ 610 | "Databases", 611 | "LocalStorage", 612 | {"match":"regexp", "name":"^com\\.apple\\."}, 613 | ], 614 | "blacklist":[ 615 | "xyz.willy.Zebra", 616 | ] 617 | }, 618 | "/var/mobile/Library/Cookies" : { 619 | "default" : "blacklist", 620 | "whitelist":[ 621 | {"match":"regexp", "name":"^com\\.apple\\."}, 622 | "Cookies.binarycookies", 623 | ], 624 | "blacklist":[ 625 | "com.johncoates.Flex.binarycookies", 626 | ] 627 | }, 628 | "/var/mobile/Library/HTTPStorages" : { 629 | "default" : "blacklist", 630 | "whitelist":[ 631 | {"match":"regexp", "name":"^com\\.apple\\."}, 632 | ], 633 | "blacklist":[ 634 | "com.opa334.Dopamine", 635 | "com.tigisoftware.Filza", 636 | "org.coolstar.SileoStore", 637 | "ws.hbang.Terminal", 638 | "xyz.willy.Zebra", 639 | ] 640 | }, 641 | 642 | "/var/tmp" : { 643 | "default" : "blacklist", 644 | "whitelist":[ 645 | {"match":"regexp", "name":"^\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}$"}, 646 | {"match":"regexp", "name":"^com\\.apple\\."}, 647 | {"match":"regexp", "name":"^SSOBackup-"}, 648 | {"match":"regexp", "name":"^SOSBackup-.*-tomb"}, 649 | {"match":"regexp", "name":"^CFNetworkDownload_"}, 650 | {"match":"regexp", "name":"^NSIRD_installd_"}, 651 | ".LINKS", 652 | "MediaCache", 653 | "analytics", 654 | "aud", 655 | "ct.shutdown", 656 | "fseventsd-uuid", 657 | "hdds6.dat", 658 | "nfcd.firstlaunch", 659 | "powerlog", 660 | "recommendations", 661 | "journeys", 662 | "ClonedAXAsset", 663 | "internal", 664 | "modelDataBlob.mlmodelc", 665 | "SoftwareUpdateCore", 666 | "CalNotificationsAvailable", 667 | ], 668 | "blacklist":[ 669 | ] 670 | }, 671 | 672 | "/var/MobileSoftwareUpdate/mnt1" : { 673 | "default" : "blacklist", 674 | "whitelist":[ 675 | ], 676 | "blacklist":[ 677 | ] 678 | }, 679 | } 680 | -------------------------------------------------------------------------------- /RootHide.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 53; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 840A948D2C6C9F3C00180FFA /* libroothide.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 840A94892C6C9F3C00180FFA /* libroothide.tbd */; }; 11 | 8477B5E22A7526AB000632D0 /* NSJSONSerialization+Comments.m in Sources */ = {isa = PBXBuildFile; fileRef = 8477B5E02A7526AB000632D0 /* NSJSONSerialization+Comments.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 12 | 8477B6052A866437000632D0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8477B6072A866437000632D0 /* Localizable.strings */; }; 13 | 847EBF812D9B01DB0052E18F /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 847EBF802D9B01DB0052E18F /* MobileCoreServices.framework */; }; 14 | 848148292D131A2800CB9FA9 /* AppDataCleaner.m in Sources */ = {isa = PBXBuildFile; fileRef = 848148282D131A2800CB9FA9 /* AppDataCleaner.m */; }; 15 | 848D86672DBC606D003C680F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 848D86662DBC606D003C680F /* IOKit.framework */; }; 16 | 84BBFAC92A7420100054A68E /* varCleanRules.json in Resources */ = {isa = PBXBuildFile; fileRef = 84BBFAC72A741C800054A68E /* varCleanRules.json */; }; 17 | A672ABB427F748DE00878787 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A672ABB327F748DE00878787 /* AppDelegate.m */; }; 18 | A672ABBF27F748E100878787 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A672ABBE27F748E100878787 /* Assets.xcassets */; }; 19 | A672ABC527F748E100878787 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A672ABC427F748E100878787 /* main.m */; }; 20 | BF0FF1BD2A550FFA00FFA27E /* varCleanController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF0FF1BC2A550FFA00FFA27E /* varCleanController.m */; }; 21 | BF0FF1C12A5510CE00FFA27E /* ZFCheckbox.m in Sources */ = {isa = PBXBuildFile; fileRef = BF0FF1BF2A5510CE00FFA27E /* ZFCheckbox.m */; }; 22 | BFA3034B2A47EBA800DC242C /* BlacklistViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BFA303492A47EBA800DC242C /* BlacklistViewController.m */; }; 23 | BFA3034C2A47EBA800DC242C /* AppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = BFA3034A2A47EBA800DC242C /* AppInfo.m */; }; 24 | BFD8B9732A4BD68D007CCEB8 /* SettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BFD8B9722A4BD68D007CCEB8 /* SettingViewController.m */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | 840A94882C6C9F3C00180FFA /* roothide.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roothide.h; sourceTree = ""; }; 29 | 840A94892C6C9F3C00180FFA /* libroothide.tbd */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.text-based-dylib-definition"; path = libroothide.tbd; sourceTree = ""; }; 30 | 840A948A2C6C9F3C00180FFA /* module.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; 31 | 840A948B2C6C9F3C00180FFA /* stub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stub.h; sourceTree = ""; }; 32 | 840A948C2C6C9F3C00180FFA /* roothide.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roothide.h; sourceTree = ""; }; 33 | 842F23E52AA321E900EE2E9A /* libroothide.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; path = libroothide.tbd; sourceTree = ""; }; 34 | 842F706A2ACB58BB002E5574 /* control */ = {isa = PBXFileReference; lastKnownFileType = text; path = control; sourceTree = ""; }; 35 | 8438C17D2AB3361A001BAB8C /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; 36 | 8438C17E2AB33673001BAB8C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 37 | 8438C1822AB35DED001BAB8C /* zh_CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/Localizable.strings; sourceTree = ""; }; 38 | 8438C1892AB52CED001BAB8C /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; 39 | 8438C18A2AB78A73001BAB8C /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; }; 40 | 845F90C02BC4227400E993FB /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; 41 | 8477B5DD2A75269B000632D0 /* NSJSONSerialization+Comments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSJSONSerialization+Comments.h"; path = "RootHide/NSJSONSerialization+Comments.h"; sourceTree = SOURCE_ROOT; }; 42 | 8477B5E02A7526AB000632D0 /* NSJSONSerialization+Comments.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSJSONSerialization+Comments.m"; path = "RootHide/NSJSONSerialization+Comments.m"; sourceTree = SOURCE_ROOT; }; 43 | 8477B6062A866437000632D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 44 | 8477B6092A8668AF000632D0 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 45 | 8477B60A2A866CBA000632D0 /* entitlements.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = entitlements.plist; sourceTree = ""; }; 46 | 847EBF802D9B01DB0052E18F /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 47 | 848148282D131A2800CB9FA9 /* AppDataCleaner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDataCleaner.m; path = AppDataCleaner/AppDataCleaner.m; sourceTree = ""; }; 48 | 848D86662DBC606D003C680F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; 49 | 84BBFAC72A741C800054A68E /* varCleanRules.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = varCleanRules.json; sourceTree = ""; }; 50 | A672ABAF27F748DE00878787 /* RootHide.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RootHide.app; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | A672ABB227F748DE00878787 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 52 | A672ABB327F748DE00878787 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 53 | A672ABBE27F748E100878787 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 54 | A672ABC327F748E100878787 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | A672ABC427F748E100878787 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 56 | BF0FF1BB2A550FFA00FFA27E /* varCleanController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = varCleanController.h; sourceTree = ""; }; 57 | BF0FF1BC2A550FFA00FFA27E /* varCleanController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = varCleanController.m; sourceTree = ""; }; 58 | BF0FF1BF2A5510CE00FFA27E /* ZFCheckbox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZFCheckbox.m; sourceTree = ""; }; 59 | BF0FF1C02A5510CE00FFA27E /* ZFCheckbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZFCheckbox.h; sourceTree = ""; }; 60 | BF69FE4D28123C7800542668 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 61 | BFA303472A47EBA800DC242C /* AppInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppInfo.h; sourceTree = ""; }; 62 | BFA303482A47EBA800DC242C /* BlacklistViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlacklistViewController.h; sourceTree = ""; }; 63 | BFA303492A47EBA800DC242C /* BlacklistViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlacklistViewController.m; sourceTree = ""; }; 64 | BFA3034A2A47EBA800DC242C /* AppInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppInfo.m; sourceTree = ""; }; 65 | BFD8B9712A4BD68D007CCEB8 /* SettingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingViewController.h; sourceTree = ""; }; 66 | BFD8B9722A4BD68D007CCEB8 /* SettingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingViewController.m; sourceTree = ""; }; 67 | BFE9353C27F753D30022D46C /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 68 | /* End PBXFileReference section */ 69 | 70 | /* Begin PBXFrameworksBuildPhase section */ 71 | A672ABAC27F748DE00878787 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | 848D86672DBC606D003C680F /* IOKit.framework in Frameworks */, 76 | 847EBF812D9B01DB0052E18F /* MobileCoreServices.framework in Frameworks */, 77 | 840A948D2C6C9F3C00180FFA /* libroothide.tbd in Frameworks */, 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 840A94872C6C9F3C00180FFA /* roothide */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 840A94882C6C9F3C00180FFA /* roothide.h */, 88 | 840A94892C6C9F3C00180FFA /* libroothide.tbd */, 89 | 840A948A2C6C9F3C00180FFA /* module.modulemap */, 90 | 840A948B2C6C9F3C00180FFA /* stub.h */, 91 | ); 92 | path = roothide; 93 | sourceTree = ""; 94 | }; 95 | A672ABA627F748DE00878787 = { 96 | isa = PBXGroup; 97 | children = ( 98 | 842F706A2ACB58BB002E5574 /* control */, 99 | 8477B60A2A866CBA000632D0 /* entitlements.plist */, 100 | 845F90C02BC4227400E993FB /* Makefile */, 101 | A672ABB127F748DE00878787 /* RootHide */, 102 | A672ABB027F748DE00878787 /* Products */, 103 | BFE9353B27F753D30022D46C /* Frameworks */, 104 | ); 105 | sourceTree = ""; 106 | }; 107 | A672ABB027F748DE00878787 /* Products */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | A672ABAF27F748DE00878787 /* RootHide.app */, 111 | ); 112 | name = Products; 113 | sourceTree = ""; 114 | }; 115 | A672ABB127F748DE00878787 /* RootHide */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 840A94872C6C9F3C00180FFA /* roothide */, 119 | 840A948C2C6C9F3C00180FFA /* roothide.h */, 120 | BFA303472A47EBA800DC242C /* AppInfo.h */, 121 | BFA3034A2A47EBA800DC242C /* AppInfo.m */, 122 | 8477B5DD2A75269B000632D0 /* NSJSONSerialization+Comments.h */, 123 | 8477B5E02A7526AB000632D0 /* NSJSONSerialization+Comments.m */, 124 | BF0FF1BE2A5510C100FFA27E /* UIComponent */, 125 | A672ABB227F748DE00878787 /* AppDelegate.h */, 126 | A672ABB327F748DE00878787 /* AppDelegate.m */, 127 | BFA303482A47EBA800DC242C /* BlacklistViewController.h */, 128 | BFA303492A47EBA800DC242C /* BlacklistViewController.m */, 129 | 848148282D131A2800CB9FA9 /* AppDataCleaner.m */, 130 | BF0FF1BB2A550FFA00FFA27E /* varCleanController.h */, 131 | BF0FF1BC2A550FFA00FFA27E /* varCleanController.m */, 132 | BFD8B9712A4BD68D007CCEB8 /* SettingViewController.h */, 133 | BFD8B9722A4BD68D007CCEB8 /* SettingViewController.m */, 134 | 84BBFAC72A741C800054A68E /* varCleanRules.json */, 135 | A672ABC427F748E100878787 /* main.m */, 136 | A672ABBE27F748E100878787 /* Assets.xcassets */, 137 | A672ABC327F748E100878787 /* Info.plist */, 138 | 8477B6072A866437000632D0 /* Localizable.strings */, 139 | ); 140 | path = RootHide; 141 | sourceTree = ""; 142 | }; 143 | BF0FF1BE2A5510C100FFA27E /* UIComponent */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | BF0FF1C02A5510CE00FFA27E /* ZFCheckbox.h */, 147 | BF0FF1BF2A5510CE00FFA27E /* ZFCheckbox.m */, 148 | ); 149 | path = UIComponent; 150 | sourceTree = ""; 151 | }; 152 | BFE9353B27F753D30022D46C /* Frameworks */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | 848D86662DBC606D003C680F /* IOKit.framework */, 156 | 847EBF802D9B01DB0052E18F /* MobileCoreServices.framework */, 157 | 842F23E52AA321E900EE2E9A /* libroothide.tbd */, 158 | BF69FE4D28123C7800542668 /* AVFoundation.framework */, 159 | BFE9353C27F753D30022D46C /* Accelerate.framework */, 160 | ); 161 | name = Frameworks; 162 | sourceTree = ""; 163 | }; 164 | /* End PBXGroup section */ 165 | 166 | /* Begin PBXNativeTarget section */ 167 | A672ABAE27F748DE00878787 /* RootHide */ = { 168 | isa = PBXNativeTarget; 169 | buildConfigurationList = A672ABC827F748E100878787 /* Build configuration list for PBXNativeTarget "RootHide" */; 170 | buildPhases = ( 171 | A672ABAB27F748DE00878787 /* Sources */, 172 | A672ABAC27F748DE00878787 /* Frameworks */, 173 | A672ABAD27F748DE00878787 /* Resources */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | ); 179 | name = RootHide; 180 | productName = abcd; 181 | productReference = A672ABAF27F748DE00878787 /* RootHide.app */; 182 | productType = "com.apple.product-type.application"; 183 | }; 184 | /* End PBXNativeTarget section */ 185 | 186 | /* Begin PBXProject section */ 187 | A672ABA727F748DE00878787 /* Project object */ = { 188 | isa = PBXProject; 189 | attributes = { 190 | BuildIndependentTargetsInParallel = 1; 191 | LastUpgradeCheck = 1330; 192 | TargetAttributes = { 193 | A672ABAE27F748DE00878787 = { 194 | CreatedOnToolsVersion = 13.3; 195 | }; 196 | }; 197 | }; 198 | buildConfigurationList = A672ABAA27F748DE00878787 /* Build configuration list for PBXProject "RootHide" */; 199 | compatibilityVersion = "Xcode 8.0"; 200 | developmentRegion = en; 201 | hasScannedForEncodings = 0; 202 | knownRegions = ( 203 | en, 204 | Base, 205 | de, 206 | ar, 207 | fr, 208 | zh_CN, 209 | it, 210 | vi, 211 | ); 212 | mainGroup = A672ABA627F748DE00878787; 213 | productRefGroup = A672ABB027F748DE00878787 /* Products */; 214 | projectDirPath = ""; 215 | projectRoot = ""; 216 | targets = ( 217 | A672ABAE27F748DE00878787 /* RootHide */, 218 | ); 219 | }; 220 | /* End PBXProject section */ 221 | 222 | /* Begin PBXResourcesBuildPhase section */ 223 | A672ABAD27F748DE00878787 /* Resources */ = { 224 | isa = PBXResourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | A672ABBF27F748E100878787 /* Assets.xcassets in Resources */, 228 | 8477B6052A866437000632D0 /* Localizable.strings in Resources */, 229 | 84BBFAC92A7420100054A68E /* varCleanRules.json in Resources */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXResourcesBuildPhase section */ 234 | 235 | /* Begin PBXSourcesBuildPhase section */ 236 | A672ABAB27F748DE00878787 /* Sources */ = { 237 | isa = PBXSourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | A672ABB427F748DE00878787 /* AppDelegate.m in Sources */, 241 | BFA3034C2A47EBA800DC242C /* AppInfo.m in Sources */, 242 | A672ABC527F748E100878787 /* main.m in Sources */, 243 | 8477B5E22A7526AB000632D0 /* NSJSONSerialization+Comments.m in Sources */, 244 | 848148292D131A2800CB9FA9 /* AppDataCleaner.m in Sources */, 245 | BFA3034B2A47EBA800DC242C /* BlacklistViewController.m in Sources */, 246 | BF0FF1C12A5510CE00FFA27E /* ZFCheckbox.m in Sources */, 247 | BFD8B9732A4BD68D007CCEB8 /* SettingViewController.m in Sources */, 248 | BF0FF1BD2A550FFA00FFA27E /* varCleanController.m in Sources */, 249 | ); 250 | runOnlyForDeploymentPostprocessing = 0; 251 | }; 252 | /* End PBXSourcesBuildPhase section */ 253 | 254 | /* Begin PBXVariantGroup section */ 255 | 8477B6072A866437000632D0 /* Localizable.strings */ = { 256 | isa = PBXVariantGroup; 257 | children = ( 258 | 8477B6062A866437000632D0 /* en */, 259 | 8477B6092A8668AF000632D0 /* de */, 260 | 8438C17D2AB3361A001BAB8C /* ar */, 261 | 8438C17E2AB33673001BAB8C /* fr */, 262 | 8438C1822AB35DED001BAB8C /* zh_CN */, 263 | 8438C1892AB52CED001BAB8C /* it */, 264 | 8438C18A2AB78A73001BAB8C /* vi */, 265 | ); 266 | name = Localizable.strings; 267 | sourceTree = ""; 268 | }; 269 | /* End PBXVariantGroup section */ 270 | 271 | /* Begin XCBuildConfiguration section */ 272 | A672ABC627F748E100878787 /* Debug */ = { 273 | isa = XCBuildConfiguration; 274 | buildSettings = { 275 | ALWAYS_SEARCH_USER_PATHS = NO; 276 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 277 | CLANG_ANALYZER_NONNULL = YES; 278 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 279 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 280 | CLANG_ENABLE_MODULES = YES; 281 | CLANG_ENABLE_OBJC_ARC = YES; 282 | CLANG_ENABLE_OBJC_WEAK = YES; 283 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 284 | CLANG_WARN_BOOL_CONVERSION = YES; 285 | CLANG_WARN_COMMA = YES; 286 | CLANG_WARN_CONSTANT_CONVERSION = YES; 287 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 288 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 289 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 290 | CLANG_WARN_EMPTY_BODY = YES; 291 | CLANG_WARN_ENUM_CONVERSION = YES; 292 | CLANG_WARN_INFINITE_RECURSION = YES; 293 | CLANG_WARN_INT_CONVERSION = YES; 294 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 295 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 296 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 297 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 298 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 299 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 300 | CLANG_WARN_STRICT_PROTOTYPES = YES; 301 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 302 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 303 | CLANG_WARN_UNREACHABLE_CODE = YES; 304 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 305 | COPY_PHASE_STRIP = NO; 306 | DEBUG_INFORMATION_FORMAT = dwarf; 307 | ENABLE_STRICT_OBJC_MSGSEND = YES; 308 | ENABLE_TESTABILITY = YES; 309 | GCC_C_LANGUAGE_STANDARD = gnu11; 310 | GCC_DYNAMIC_NO_PIC = NO; 311 | GCC_NO_COMMON_BLOCKS = YES; 312 | GCC_OPTIMIZATION_LEVEL = 0; 313 | GCC_PREPROCESSOR_DEFINITIONS = ( 314 | "DEBUG=1", 315 | "$(inherited)", 316 | ); 317 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 318 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 319 | GCC_WARN_UNDECLARED_SELECTOR = YES; 320 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 321 | GCC_WARN_UNUSED_FUNCTION = YES; 322 | GCC_WARN_UNUSED_VARIABLE = YES; 323 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 324 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 325 | MTL_FAST_MATH = YES; 326 | ONLY_ACTIVE_ARCH = YES; 327 | SDKROOT = iphoneos; 328 | }; 329 | name = Debug; 330 | }; 331 | A672ABC727F748E100878787 /* Release */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | ALWAYS_SEARCH_USER_PATHS = NO; 335 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_ENABLE_OBJC_WEAK = YES; 342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 343 | CLANG_WARN_BOOL_CONVERSION = YES; 344 | CLANG_WARN_COMMA = YES; 345 | CLANG_WARN_CONSTANT_CONVERSION = YES; 346 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 347 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 348 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 349 | CLANG_WARN_EMPTY_BODY = YES; 350 | CLANG_WARN_ENUM_CONVERSION = YES; 351 | CLANG_WARN_INFINITE_RECURSION = YES; 352 | CLANG_WARN_INT_CONVERSION = YES; 353 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 355 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 356 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 357 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 358 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 359 | CLANG_WARN_STRICT_PROTOTYPES = YES; 360 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 361 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 362 | CLANG_WARN_UNREACHABLE_CODE = YES; 363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 364 | COPY_PHASE_STRIP = NO; 365 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 366 | ENABLE_NS_ASSERTIONS = NO; 367 | ENABLE_STRICT_OBJC_MSGSEND = YES; 368 | GCC_C_LANGUAGE_STANDARD = gnu11; 369 | GCC_NO_COMMON_BLOCKS = YES; 370 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 371 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 372 | GCC_WARN_UNDECLARED_SELECTOR = YES; 373 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 374 | GCC_WARN_UNUSED_FUNCTION = YES; 375 | GCC_WARN_UNUSED_VARIABLE = YES; 376 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 377 | MTL_ENABLE_DEBUG_INFO = NO; 378 | MTL_FAST_MATH = YES; 379 | SDKROOT = iphoneos; 380 | VALIDATE_PRODUCT = YES; 381 | }; 382 | name = Release; 383 | }; 384 | A672ABC927F748E100878787 /* Debug */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 389 | CODE_SIGN_ENTITLEMENTS = ""; 390 | CODE_SIGN_STYLE = Automatic; 391 | CURRENT_PROJECT_VERSION = 1; 392 | DEVELOPMENT_TEAM = 49LJ27SG38; 393 | ENABLE_BITCODE = NO; 394 | GENERATE_INFOPLIST_FILE = YES; 395 | INFOPLIST_FILE = RootHide/Info.plist; 396 | INFOPLIST_KEY_CFBundleDisplayName = RootHide; 397 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 398 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 399 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 400 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 401 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 402 | LD_RUNPATH_SEARCH_PATHS = ( 403 | "$(inherited)", 404 | "@executable_path/Frameworks", 405 | ); 406 | LIBRARY_SEARCH_PATHS = ( 407 | "$(inherited)", 408 | "$(PROJECT_DIR)", 409 | "$(PROJECT_DIR)/RootHide", 410 | "$(PROJECT_DIR)/RootHide/roothide", 411 | ); 412 | MARKETING_VERSION = 5.2; 413 | PRODUCT_BUNDLE_IDENTIFIER = com.roothide.manager; 414 | PRODUCT_NAME = "$(TARGET_NAME)"; 415 | SUPPORTS_MACCATALYST = NO; 416 | SWIFT_EMIT_LOC_STRINGS = YES; 417 | TARGETED_DEVICE_FAMILY = "1,2"; 418 | USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)"; 419 | }; 420 | name = Debug; 421 | }; 422 | A672ABCA27F748E100878787 /* Release */ = { 423 | isa = XCBuildConfiguration; 424 | buildSettings = { 425 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 426 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 427 | CODE_SIGN_ENTITLEMENTS = ""; 428 | CODE_SIGN_STYLE = Automatic; 429 | CURRENT_PROJECT_VERSION = 1; 430 | DEVELOPMENT_TEAM = 49LJ27SG38; 431 | ENABLE_BITCODE = NO; 432 | GENERATE_INFOPLIST_FILE = YES; 433 | INFOPLIST_FILE = RootHide/Info.plist; 434 | INFOPLIST_KEY_CFBundleDisplayName = RootHide; 435 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 436 | INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; 437 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 438 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 439 | IPHONEOS_DEPLOYMENT_TARGET = 15.0; 440 | LD_RUNPATH_SEARCH_PATHS = ( 441 | "$(inherited)", 442 | "@executable_path/Frameworks", 443 | ); 444 | LIBRARY_SEARCH_PATHS = ( 445 | "$(inherited)", 446 | "$(PROJECT_DIR)", 447 | "$(PROJECT_DIR)/RootHide", 448 | "$(PROJECT_DIR)/RootHide/roothide", 449 | ); 450 | MARKETING_VERSION = 5.2; 451 | PRODUCT_BUNDLE_IDENTIFIER = com.roothide.manager; 452 | PRODUCT_NAME = "$(TARGET_NAME)"; 453 | SUPPORTS_MACCATALYST = NO; 454 | SWIFT_EMIT_LOC_STRINGS = YES; 455 | TARGETED_DEVICE_FAMILY = "1,2"; 456 | USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)"; 457 | }; 458 | name = Release; 459 | }; 460 | /* End XCBuildConfiguration section */ 461 | 462 | /* Begin XCConfigurationList section */ 463 | A672ABAA27F748DE00878787 /* Build configuration list for PBXProject "RootHide" */ = { 464 | isa = XCConfigurationList; 465 | buildConfigurations = ( 466 | A672ABC627F748E100878787 /* Debug */, 467 | A672ABC727F748E100878787 /* Release */, 468 | ); 469 | defaultConfigurationIsVisible = 0; 470 | defaultConfigurationName = Release; 471 | }; 472 | A672ABC827F748E100878787 /* Build configuration list for PBXNativeTarget "RootHide" */ = { 473 | isa = XCConfigurationList; 474 | buildConfigurations = ( 475 | A672ABC927F748E100878787 /* Debug */, 476 | A672ABCA27F748E100878787 /* Release */, 477 | ); 478 | defaultConfigurationIsVisible = 0; 479 | defaultConfigurationName = Release; 480 | }; 481 | /* End XCConfigurationList section */ 482 | }; 483 | rootObject = A672ABA727F748DE00878787 /* Project object */; 484 | } 485 | --------------------------------------------------------------------------------