├── 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 |
--------------------------------------------------------------------------------