Skip to content

Commit 230367f

Browse files
authored
Merge pull request #1 from sammyjeng/master
t
2 parents 3a54917 + 89df9a9 commit 230367f

File tree

14 files changed

+122
-19
lines changed

14 files changed

+122
-19
lines changed

.github/workflows/ci.yml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: ci
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
pull_request:
8+
branches:
9+
- master
10+
workflow_dispatch:
11+
12+
jobs:
13+
build:
14+
runs-on: macos-12
15+
16+
steps:
17+
- name: Checkout
18+
uses: actions/checkout@v2
19+
with:
20+
fetch-depth: 0
21+
submodules: recursive
22+
23+
- name: Theos Setup
24+
uses: Randomblock1/theos-action@v1
25+
26+
- name: Setup libSandy
27+
run: |
28+
git clone https://github.com/realthunder/mac-headers --depth 1
29+
mv mac-headers/usr/include/xpc $THEOS/include
30+
git clone https://github.com/opa334/libSandy vendor/libSandy --depth 1
31+
cd vendor/libSandy/ && ./install_to_theos.sh && cd -
32+
33+
- name: Setup AltList
34+
run: |
35+
git clone https://github.com/opa334/AltList --depth 1
36+
cd AltList && ./install_to_theos.sh && cd -
37+
38+
- name: Build shadow
39+
run: ./build.sh
40+
41+
- name: Release
42+
uses: softprops/action-gh-release@v1
43+
if: ${{ startsWith(github.ref, 'refs/tags/') }}
44+
with:
45+
files: |
46+
${{ github.workspace }}/packages/*.deb
47+
env:
48+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
ARCHS ?= armv7 armv7s arm64 arm64e
2-
TARGET ?= iphone:clang:14.5:8.0
1+
ARCHS ?= arm64
2+
TARGET ?= iphone:clang:latest:14
33

44
include $(THEOS)/makefiles/common.mk
55
SUBPROJECTS += Shadow.framework

Shadow.dylib/hooks/hooks.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import <sys/utsname.h>
1010
#import <sys/syslimits.h>
1111
#import <sys/time.h>
12+
#import <sys/ioctl.h>
1213
#import <errno.h>
1314
#import <fcntl.h>
1415
#import <mach-o/dyld.h>

Shadow.dylib/hooks/libc.x

+31
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,35 @@ static DIR* replaced___opendir2(const char* pathname, size_t bufsize) {
831831
return NULL;
832832
}
833833

834+
// anti-antidebug
835+
// Another way of figuring out if LLDB is attached. (Rednick16)
836+
static int (*original_isatty)(int fd);
837+
static int replaced_isatty(int fd) {
838+
int result = original_isatty(fd);
839+
if (result && fd == STDOUT_FILENO) {
840+
errno = ENOENT;
841+
return 0;
842+
}
843+
return result;
844+
}
845+
846+
// Yet another way of figuring out if LLDB is attached. (Rednick16)
847+
static int (*original_ioctl)(int fd, unsigned long request, ...);
848+
static int replaced_ioctl(int fd, unsigned long request, ...) {
849+
void* arg;
850+
va_list args;
851+
va_start(args, request);
852+
arg = va_arg(args, void *);
853+
va_end(args);
854+
855+
int result = original_ioctl(fd, request, arg);
856+
if(!result && request == TIOCGWINSZ) {
857+
errno = ENOTTY;
858+
return -1;
859+
}
860+
return result;
861+
}
862+
834863
void shadowhook_libc(HKSubstitutor* hooks) {
835864
MSHookFunction(access, replaced_access, (void **) &original_access);
836865
MSHookFunction(chdir, replaced_chdir, (void **) &original_chdir);
@@ -884,4 +913,6 @@ void shadowhook_libc_antidebugging(HKSubstitutor* hooks) {
884913
MSHookFunction(ptrace, replaced_ptrace, (void **) &original_ptrace);
885914
MSHookFunction(sysctl, replaced_sysctl, (void **) &original_sysctl);
886915
MSHookFunction(getppid, replaced_getppid, NULL);
916+
MSHookFunction(isatty, replaced_isatty,(void **) &original_isatty);
917+
MSHookFunction(ioctl, replaced_ioctl, (void **) &original_ioctl);
887918
}

Shadow.dylib/hooks/objc.x

+12
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ static Class replaced_NSClassFromString(NSString* aClassName) {
6868
return nil;
6969
}
7070

71+
// iosSecuritySuite objc class check bypass ~ 809323710123
72+
static id (*original_objc_getClass)(const char *name);
73+
static id replaced_objc_getClass(const char *name) {
74+
id result = original_objc_getClass(name);
75+
76+
if(isCallerTweak() || ![_shadow isAddrRestricted:(__bridge const void *)result]) {
77+
return result;
78+
}
79+
return nil;
80+
}
81+
7182
typedef struct _NXMapTable NXMapTable;
7283
typedef struct _NXHashTable NXHashTable;
7384

@@ -104,6 +115,7 @@ void shadowhook_objc(HKSubstitutor* hooks) {
104115
}
105116

106117
void shadowhook_objc_hidetweakclasses(HKSubstitutor* hooks) {
118+
MSHookFunction(objc_getClass, replaced_objc_getClass, (void **) &original_objc_getClass);
107119
MSHookFunction(NSClassFromString, replaced_NSClassFromString, (void **) &original_NSClassFromString);
108120
MSHookFunction(NXMapGet, replaced_NXMapGet, (void **) &original_NXMapGet);
109121
MSHookFunction(NXHashGet, replaced_NXHashGet, (void **) &original_NXHashGet);

Shadow.dylib/hooks/syscall.x

+12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
#import "hooks.h"
44

5+
#ifndef CS_DEBUGGED
6+
#define CS_DEBUGGED 0x10000000
7+
#endif
8+
59
static int (*original_syscall)(int number, ...);
610
static int replaced_syscall(int number, ...) {
711
NSLog(@"%@: %d", @"syscall", number);
@@ -29,6 +33,7 @@ static int replaced_syscall(int number, ...) {
2933
|| number == SYS_access_extended
3034
|| number == SYS_stat64
3135
|| number == SYS_lstat64
36+
|| number == SYS_getfsstat64
3237
|| number == SYS_stat64_extended
3338
|| number == SYS_lstat64_extended
3439
|| number == SYS_readlink
@@ -69,8 +74,15 @@ static int replaced_csops(pid_t pid, unsigned int ops, void* useraddr, size_t us
6974
ret &= ~CS_ENTITLEMENTS_VALIDATED;
7075
ret |= 0x0000300; /* CS_JIT_ALLOW */
7176
ret |= CS_REQUIRE_LV;
77+
78+
int flags = 0;
79+
original_csops(pid, ops, &flags, sizeof(flags));
80+
if(flags & CS_DEBUGGED) {
81+
*(int*)useraddr &= ~CS_DEBUGGED;
82+
}
7283
}
7384

85+
7486
if(ops == CS_OPS_CDHASH) {
7587
// Hide CDHASH for trustcache checks
7688
errno = EBADEXEC;

Shadow.framework/Backend.m

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ - (instancetype)init {
1616
return self;
1717
}
1818

19-
+ (NSArray<ShadowRuleset *> *)_loadRulesets {
20-
NSMutableArray<ShadowRuleset *>* result = [NSMutableArray new];
19+
+ (NSArray<KnoxRuleset *> *)_loadRulesets {
20+
NSMutableArray<KnoxRuleset *>* result = [NSMutableArray new];
2121

2222
NSURL* ruleset_path_url = [NSURL fileURLWithPath:[RootBridge getJBPath:@SHADOW_RULESETS] isDirectory:YES];
2323
NSArray* ruleset_urls = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:ruleset_path_url includingPropertiesForKeys:@[] options:0 error:nil];
2424

2525
if(ruleset_urls) {
2626
for(NSURL* url in ruleset_urls) {
27-
ShadowRuleset* ruleset = [ShadowRuleset rulesetWithURL:url];
27+
KnoxRuleset* ruleset = [KnoxRuleset rulesetWithURL:url];
2828

2929
if(ruleset) {
3030
NSDictionary* info = [[ruleset internalDictionary] objectForKey:@"RulesetInfo"];
@@ -61,7 +61,7 @@ - (BOOL)isPathRestricted:(NSString *)path {
6161
__block BOOL whitelisted = NO;
6262

6363
// Check rulesets
64-
[rulesets enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(ShadowRuleset* ruleset, NSUInteger idx, BOOL* stop) {
64+
[rulesets enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(KnoxRuleset* ruleset, NSUInteger idx, BOOL* stop) {
6565
if(![ruleset isPathCompliant:path]) {
6666
compliant = NO;
6767
*stop = YES;
@@ -102,7 +102,7 @@ - (BOOL)isSchemeRestricted:(NSString *)scheme {
102102
__block BOOL restricted = NO;
103103

104104
// Check rulesets
105-
[rulesets enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(ShadowRuleset* ruleset, NSUInteger idx, BOOL* stop) {
105+
[rulesets enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(KnoxRuleset* ruleset, NSUInteger idx, BOOL* stop) {
106106
if([ruleset isSchemeRestricted:scheme]) {
107107
restricted = YES;
108108
*stop = YES;

Shadow.framework/Core+Utilities.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ + (NSDictionary *)generateDatabase {
101101

102102
// // Load standard (built-in) ruleset.
103103
// NSString* ruleset_path = [@SHADOW_RULESETS stringByAppendingPathComponent:@"StandardRules.plist"];
104-
// ShadowRuleset* ruleset = [ShadowRuleset rulesetWithPath:[RootBridge getJBPath:ruleset_path]];
104+
// KnoxRuleset* ruleset = [KnoxRuleset rulesetWithPath:[RootBridge getJBPath:ruleset_path]];
105105

106106
NSArray* db_list_skip = @[@"base.list", @"firmware-sbin.list"];
107107

Shadow.framework/Headers/Shadow/Backend.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#import <Shadow/Ruleset.h>
66

77
@interface ShadowBackend : NSObject {
8-
NSArray<ShadowRuleset *>* rulesets;
8+
NSArray<KnoxRuleset *>* rulesets;
99
NSCache<NSString *, NSNumber *>* cache_restricted;
1010
}
1111

Shadow.framework/Headers/Shadow/Ruleset.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#import <Foundation/Foundation.h>
55

6-
@interface ShadowRuleset : NSObject {
6+
@interface KnoxRuleset : NSObject {
77
NSSet<NSString *>* set_urlschemes;
88
NSSet<NSString *>* set_whitelist;
99
NSSet<NSString *>* set_blacklist;

Shadow.framework/Ruleset.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#import <Shadow/Ruleset.h>
22

3-
@implementation ShadowRuleset
3+
@implementation KnoxRuleset
44
@synthesize internalDictionary;
55

66
- (instancetype)init {
@@ -20,7 +20,7 @@ + (instancetype)rulesetWithURL:(NSURL *)url {
2020
NSDictionary* ruleset_dict = [NSDictionary dictionaryWithContentsOfURL:url];
2121

2222
if(ruleset_dict) {
23-
ShadowRuleset* ruleset = [self new];
23+
KnoxRuleset* ruleset = [self new];
2424
[ruleset setInternalDictionary:ruleset_dict];
2525
[ruleset _compile];
2626
return ruleset;

Shadow.framework/Shadow.tbd

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
2-
archs: [ armv7, armv7s, arm64, arm64e ]
2+
archs: [ arm64 ]
33
platform: ios
44
install-name: '@rpath/Shadow.framework/Shadow'
55
current-version: 0
66
compatibility-version: 0
77
exports:
8-
- archs: [ armv7, armv7s, arm64, arm64e ]
8+
- archs: [ arm64 ]
99
objc-classes: [ _Shadow, _ShadowBackend,
10-
_ShadowSettings, _ShadowRuleset ]
10+
_ShadowSettings, _KnoxRuleset ]
1111
...

ShadowSettings.bundle/Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ include $(THEOS)/makefiles/common.mk
55
BUNDLE_NAME = ShadowSettings
66

77
ShadowSettings_FILES = $(wildcard *.m)
8-
ShadowSettings_FRAMEWORKS = Foundation
8+
ShadowSettings_FRAMEWORKS = Foundation Preferences
99
ShadowSettings_EXTRA_FRAMEWORKS = Shadow AltList HookKit RootBridge
10-
ShadowSettings_PRIVATE_FRAMEWORKS = Preferences
1110
ShadowSettings_INSTALL_PATH = /Library/PreferenceBundles
1211
ShadowSettings_CFLAGS = -fobjc-arc -I../Shadow.framework/Headers -I../vendor/HookKit.framework/Headers -I../vendor/RootBridge.framework/Headers
1312
ShadowSettings_LDFLAGS = -rpath /Library/Frameworks -rpath /var/jb/Library/Frameworks -rpath /usr/lib -rpath /var/jb/usr/lib

build.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ mkdir -p $PWD/build
1010

1111
# build main project (rootless ver.)
1212
make clean &&
13-
THEOS_PACKAGE_SCHEME=rootless ARCHS="arm64 arm64e" TARGET=iphone:clang:latest:14.0 make package FINALPACKAGE=1 &&
13+
THEOS_PACKAGE_SCHEME=rootless ARCHS="arm64" TARGET=iphone:clang:latest:14.0 make package FINALPACKAGE=1 &&
1414
cp -p "`ls -dtr1 packages/* | tail -1`" $PWD/build/
1515

1616
rm -rf $THEOS/lib/Shadow.framework
1717

18-
# build main project (rooted ver.)
18+
# build main project (rooted ver.) rootful?
1919
make clean &&
2020
make package FINALPACKAGE=1 &&
2121
cp -p "`ls -dtr1 packages/* | tail -1`" $PWD/build/

0 commit comments

Comments
 (0)