Skip to content

Commit

Permalink
Mock Container
Browse files Browse the repository at this point in the history
  • Loading branch information
marlkiller committed Aug 3, 2024
1 parent 2ee6c9a commit 063cd74
Show file tree
Hide file tree
Showing 12 changed files with 373 additions and 21 deletions.
16 changes: 16 additions & 0 deletions dylib_dobby_hook.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,17 @@
B552CA382C54AC450095C9B9 /* CommonRetOC.m in Sources */ = {isa = PBXBuildFile; fileRef = B552CA372C54AC450095C9B9 /* CommonRetOC.m */; };
B55407272B653DCB005C08E6 /* NavicatPremiumHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B55407262B653DCB005C08E6 /* NavicatPremiumHack.m */; };
B554D7BC2B63F2A300B7EFEA /* DevUtilsHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B554D7BB2B63F2A300B7EFEA /* DevUtilsHack.m */; };
B57F200E2C5DD6D700C87201 /* MockCKDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = B57F200D2C5DD6D700C87201 /* MockCKDatabase.h */; };
B57F20102C5DD70700C87201 /* MockCKDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = B57F200F2C5DD70700C87201 /* MockCKDatabase.m */; };
B58160172BE88569001DDB9B /* encryp_utils.m in Sources */ = {isa = PBXBuildFile; fileRef = B58160112BE88569001DDB9B /* encryp_utils.m */; };
B581601B2BE88569001DDB9B /* encryp_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = B58160162BE88569001DDB9B /* encryp_utils.h */; };
B5A7D30F2C548B71003D4C7F /* HackProtocolDefault.h in Headers */ = {isa = PBXBuildFile; fileRef = B5A7D30E2C548B71003D4C7F /* HackProtocolDefault.h */; };
B5A7D3112C548BAB003D4C7F /* HackProtocolDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A7D3102C548BAB003D4C7F /* HackProtocolDefault.m */; };
B5A7D3142C549130003D4C7F /* ForkLiftHelperHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A7D3132C549130003D4C7F /* ForkLiftHelperHack.m */; };
B5A7D3172C5491A0003D4C7F /* HackHelperProtocolDefault.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A7D3152C5491A0003D4C7F /* HackHelperProtocolDefault.m */; };
B5A7D3182C5491A0003D4C7F /* HackHelperProtocolDefault.h in Headers */ = {isa = PBXBuildFile; fileRef = B5A7D3162C5491A0003D4C7F /* HackHelperProtocolDefault.h */; };
B5B89BCB2C5DD49B00F61EB0 /* MockCKContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = B5B89BCA2C5DD49B00F61EB0 /* MockCKContainer.h */; };
B5B89BCD2C5DD4AB00F61EB0 /* MockCKContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B89BCC2C5DD4AB00F61EB0 /* MockCKContainer.m */; };
B5D0C0BB2C4B553500881398 /* ForkLiftHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B5D0C0BA2C4B553500881398 /* ForkLiftHack.m */; };
B5D2ED3F2BC0252D0030CBCA /* DevHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B5D2ED3E2BC0252D0030CBCA /* DevHack.m */; };
B5F06B1D2BEF591E0079E68D /* InfuseHack.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F06B1C2BEF591E0079E68D /* InfuseHack.m */; };
Expand Down Expand Up @@ -89,13 +93,17 @@
B57AEDBC2C5009F200B9C5FB /* SMJobBlessUtil-python3.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = "SMJobBlessUtil-python3.py"; sourceTree = "<group>"; };
B57AEDBD2C5009F200B9C5FB /* mac_patch_helper */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = mac_patch_helper; sourceTree = "<group>"; };
B57AEDBE2C5009F200B9C5FB /* patch.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = patch.json; sourceTree = "<group>"; };
B57F200D2C5DD6D700C87201 /* MockCKDatabase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCKDatabase.h; sourceTree = "<group>"; };
B57F200F2C5DD70700C87201 /* MockCKDatabase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCKDatabase.m; sourceTree = "<group>"; };
B58160112BE88569001DDB9B /* encryp_utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = encryp_utils.m; sourceTree = "<group>"; };
B58160162BE88569001DDB9B /* encryp_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encryp_utils.h; sourceTree = "<group>"; };
B5A7D30E2C548B71003D4C7F /* HackProtocolDefault.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HackProtocolDefault.h; sourceTree = "<group>"; };
B5A7D3102C548BAB003D4C7F /* HackProtocolDefault.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HackProtocolDefault.m; sourceTree = "<group>"; };
B5A7D3132C549130003D4C7F /* ForkLiftHelperHack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ForkLiftHelperHack.m; sourceTree = "<group>"; };
B5A7D3152C5491A0003D4C7F /* HackHelperProtocolDefault.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HackHelperProtocolDefault.m; sourceTree = "<group>"; };
B5A7D3162C5491A0003D4C7F /* HackHelperProtocolDefault.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HackHelperProtocolDefault.h; sourceTree = "<group>"; };
B5B89BCA2C5DD49B00F61EB0 /* MockCKContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockCKContainer.h; sourceTree = "<group>"; };
B5B89BCC2C5DD4AB00F61EB0 /* MockCKContainer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockCKContainer.m; sourceTree = "<group>"; };
B5BE2D582C52A5E40056B3E2 /* build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = build.sh; sourceTree = "<group>"; };
B5BE2D592C52A5E40056B3E2 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
B5BE2D5A2C52A5E40056B3E2 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
Expand Down Expand Up @@ -243,6 +251,10 @@
B5FECEAC2BC4FC29008916D6 /* common_ret.m */,
B552CA352C54AC200095C9B9 /* CommonRetOC.h */,
B552CA372C54AC450095C9B9 /* CommonRetOC.m */,
B5B89BCA2C5DD49B00F61EB0 /* MockCKContainer.h */,
B5B89BCC2C5DD4AB00F61EB0 /* MockCKContainer.m */,
B57F200D2C5DD6D700C87201 /* MockCKDatabase.h */,
B57F200F2C5DD70700C87201 /* MockCKDatabase.m */,
);
path = utils;
sourceTree = "<group>";
Expand Down Expand Up @@ -275,13 +287,15 @@
B5FECEAD2BC4FC29008916D6 /* common_ret.h in Headers */,
B581601B2BE88569001DDB9B /* encryp_utils.h in Headers */,
B5A7D30F2C548B71003D4C7F /* HackProtocolDefault.h in Headers */,
B5B89BCB2C5DD49B00F61EB0 /* MockCKContainer.h in Headers */,
38350BF62B53F73A00DD52B3 /* dylib_dobby_hook.h in Headers */,
3816BBB72B54FED80051CF39 /* MemoryUtils.h in Headers */,
B5A7D3182C5491A0003D4C7F /* HackHelperProtocolDefault.h in Headers */,
38350C022B53F78900DD52B3 /* dobby.h in Headers */,
B552CA362C54AC200095C9B9 /* CommonRetOC.h in Headers */,
38D1AC282B54C9C100E6CB9E /* Constant.h in Headers */,
38D1AC2C2B54D03B00E6CB9E /* HackProtocol.h in Headers */,
B57F200E2C5DD6D700C87201 /* MockCKDatabase.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -366,8 +380,10 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B57F20102C5DD70700C87201 /* MockCKDatabase.m in Sources */,
B50E935E2BBD024F0073FEAA /* PaddleBaseHack.m in Sources */,
38D1AC322B54D1CC00E6CB9E /* AirBuddyHack.m in Sources */,
B5B89BCD2C5DD4AB00F61EB0 /* MockCKContainer.m in Sources */,
B5D2ED3F2BC0252D0030CBCA /* DevHack.m in Sources */,
B5A7D3112C548BAB003D4C7F /* HackProtocolDefault.m in Sources */,
B546A6582BC4F0CD0012338D /* ProxyManHack.m in Sources */,
Expand Down
21 changes: 3 additions & 18 deletions dylib_dobby_hook/helpers/ForkLiftHelperHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#import <Foundation/Foundation.h>
#import "Constant.h"
#import "MemoryUtils.h"
#import "common_ret.h"
#import <objc/runtime.h>
#include <sys/ptrace.h>
#import <CloudKit/CloudKit.h>
Expand Down Expand Up @@ -50,7 +51,7 @@ - (NSString *)getSupportAppVersion {
//}


OSStatus hk_SecCodeCopySigningInformation(SecCodeRef codeRef, SecCSFlags flags, CFDictionaryRef *signingInfo) {
OSStatus hk_SecCodeCopySigningInformation_forklift(SecCodeRef codeRef, SecCSFlags flags, CFDictionaryRef *signingInfo) {

OSStatus status = SecCodeCopySigningInformation_ori(codeRef, flags, signingInfo);
NSLog(@">>>>>> hk_SecCodeCopySigningInformation_ori status = %d", status);
Expand Down Expand Up @@ -89,22 +90,6 @@ OSStatus hk_SecCodeCopySigningInformation(SecCodeRef codeRef, SecCSFlags flags,

return errSecSuccess;
}



OSStatus hk_SecCodeCheckValidityWithErrors(SecCodeRef code, SecCSFlags flags,SecRequirementRef requirement, CFErrorRef *errors){
// anchor apple generic and certificate leaf[subject.OU] = "J3CP9BBBN6"
// NSString* fakeRequirement = [NSString stringWithFormat:@"identifier \"com.binarynights.ForkLift\""];
NSLog(@">>>>>> hk_SecCodeCheckValidityWithErrors requirement = %@",requirement);
return errSecSuccess;
}

OSStatus (*SecCodeCopySigningInformation_ori)(SecCodeRef codeRef, SecCSFlags flags, CFDictionaryRef *signingInfo);

OSStatus (*SecRequirementCreateWithString_forklift_ori)(CFStringRef text, SecCSFlags flags,SecRequirementRef *requirement);

OSStatus (*SecCodeCheckValidityWithErrors_ori)(SecCodeRef code, SecCSFlags flags,SecRequirementRef requirement, CFErrorRef *errors);


- (BOOL)hack {

Expand All @@ -120,7 +105,7 @@ - (BOOL)hack {

// DobbyHook((void *)sub_10005ad20, (void *)hook_sub_10005ad20, (void *)&sub_10005ad20_ori);

DobbyHook(SecCodeCopySigningInformation, (void *)hk_SecCodeCopySigningInformation, (void *)&SecCodeCopySigningInformation_ori);
DobbyHook(SecCodeCopySigningInformation, (void *)hk_SecCodeCopySigningInformation_forklift, (void *)&SecCodeCopySigningInformation_ori);
DobbyHook(SecCodeCheckValidityWithErrors, (void *)hk_SecCodeCheckValidityWithErrors, (void *)&SecCodeCheckValidityWithErrors_ori);
return YES;
}
Expand Down
9 changes: 9 additions & 0 deletions dylib_dobby_hook/utils/CommonRetOC.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@
- (int)ret0;
+ (int)ret1;
+ (int)ret0;



+ (id)hook_defaultStore;
- (id)hook_NSFileManager:containerIdentifier;

+ (id)hook_containerWithIdentifier:identifier;
+ (id)hook_defaultContainer;

@end

#endif /* CommonRetOC_h */
42 changes: 42 additions & 0 deletions dylib_dobby_hook/utils/CommonRetOC.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

#import <Foundation/Foundation.h>
#import "CommonRetOC.h"
#import <CloudKit/CloudKit.h>
#import "MockCKContainer.h"

@implementation CommonRetOC

Expand Down Expand Up @@ -53,4 +55,44 @@ - (BOOL)hack {
return NO;
}





+ (id)hook_defaultStore{
NSLog(@">>>>>> hook_defaultStore");
return [NSUserDefaults standardUserDefaults];
}

- (id)hook_NSFileManager:(nullable NSString *)containerIdentifier{
NSLog(@">>>>>> hook_NSFileManager containerIdentifier = %@",containerIdentifier);
NSFileManager *defaultManager = [NSFileManager defaultManager];
NSURL *url = [[defaultManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
url = [url URLByAppendingPathComponent:containerIdentifier];

BOOL isDirectory;
if (![defaultManager fileExistsAtPath:[url path] isDirectory:&isDirectory] || !isDirectory) {
NSError *error = nil;
BOOL success = [defaultManager createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:&error];
if (!success) {
NSLog(@">>>>>> Failed to create directory: %@", error.localizedDescription);
}
} else {
NSLog(@">>>>>> Directory already exists.");
}
return url;
}


+ (id)hook_containerWithIdentifier:identifier {
NSLog(@">>>>>> hook_containerWithIdentifier identifier = %@",identifier);
return [MockCKContainer containerWithIdentifier:identifier];

}
+ (id)hook_defaultContainer {
NSLog(@">>>>>> hook_defaultContainer");
return [MockCKContainer defaultContainer];

}

@end
30 changes: 30 additions & 0 deletions dylib_dobby_hook/utils/MockCKContainer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// MockCKContainer.h
// dylib_dobby_hook
//
// Created by voidm on 2024/8/3.
//
#import <CloudKit/CloudKit.h>
#import "MockCKDatabase.h"

#ifndef MockCKContainer_h
#define MockCKContainer_h

@interface MockCKContainer : NSObject


@property (nonatomic, readonly) MockCKDatabase *privateDatabase;
@property (nonatomic, readonly) MockCKDatabase *publicDatabase;
@property (nonatomic, strong) NSString *identifier;

+ (instancetype)defaultContainer;
+ (instancetype)containerWithIdentifier:(NSString *)identifier;


- (CKDatabase *)privateCloudDatabase;
- (CKDatabase *)publicCloudDatabase;


@end

#endif /* MockCKContainer_h */
60 changes: 60 additions & 0 deletions dylib_dobby_hook/utils/MockCKContainer.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// MockCKContainer.m
// dylib_dobby_hook
//
// Created by voidm on 2024/8/3.
//

#import <Foundation/Foundation.h>
#import "MockCKContainer.h"
#import <CloudKit/CloudKit.h>
#import "MockCKDatabase.h"
#import <objc/runtime.h>


@implementation MockCKContainer

- (instancetype)init {
self = [super init];
if (self) {
_privateDatabase = [[MockCKDatabase alloc] init];
_publicDatabase = [[MockCKDatabase alloc] init];
}
return self;
}

+ (instancetype)defaultContainer {
static MockCKContainer *defaultContainer = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
defaultContainer = [[self alloc] initWithIdentifier:@"default"];
});
return defaultContainer;
}

+ (instancetype)containerWithIdentifier:(NSString *)identifier {
return [[self alloc] initWithIdentifier:identifier];
}

- (instancetype)initWithIdentifier:(NSString *)identifier {
NSLog(@">>>>>> initWithIdentifier identifier = %@",identifier);
self = [super init];
if (self) {
_identifier = [identifier copy];
_privateDatabase = [[MockCKDatabase alloc] init];
_publicDatabase = [[MockCKDatabase alloc] init];
}
return self;
}
- (CKDatabase *)privateCloudDatabase {
NSLog(@">>>>>> privateCloudDatabase");
return (CKDatabase *)self.privateDatabase;
}

- (CKDatabase *)publicCloudDatabase {
NSLog(@">>>>>> publicCloudDatabase");
return (CKDatabase *)self.publicDatabase;
}

@end

39 changes: 39 additions & 0 deletions dylib_dobby_hook/utils/MockCKDatabase.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//
// MockCKDatabase.h
// dylib_dobby_hook
//
// Created by voidm on 2024/8/3.
//
#import <CloudKit/CloudKit.h>

#ifndef MockCKDatabase_h
#define MockCKDatabase_h


@interface MockCKDatabase : NSObject

@property (nonatomic, strong) NSMutableDictionary<CKRecordID *, CKRecord *> * records;
@property (nonatomic, strong) NSMutableDictionary<CKRecordZoneID *, CKRecordZone *> *recordZones;
@property (nonatomic, strong) NSMutableDictionary<NSString *, CKSubscription *> *subscriptions;


- (void)saveRecord:(CKRecord *)record completion:(void (^)(CKRecord *record, NSError *error))completion;
- (void)fetchRecordWithID:(CKRecordID *)recordID completion:(void (^)(CKRecord *record, NSError *error))completion;
- (void)deleteRecordWithID:(CKRecordID *)recordID completion:(void (^)(NSError *error))completion;
- (void)performQuery:(CKQuery *)query inZoneWithID:(CKRecordZoneID *)zoneID completion:(void (^)(NSArray<CKRecord *> *records, NSError *error))completion;
- (void)fetchAllRecordsWithCompletion:(void (^)(NSArray<CKRecord *> *records, NSError *error))completion;
- (void)addOperation:(NSOperation *)operation;

- (void)fetchAllRecordZonesWithCompletionHandler:(void (^)(NSArray<CKRecordZone *> * zones, NSError * error))completionHandler;
- (void)fetchRecordZoneWithID:(CKRecordZoneID *)zoneID completionHandler:(void (^)(CKRecordZone * zone, NSError * error))completionHandler;
- (void)saveRecordZone:(CKRecordZone *)zone completionHandler:(void (^)(CKRecordZone * zone, NSError * error))completionHandler;
- (void)deleteRecordZoneWithID:(CKRecordZoneID *)zoneID completionHandler:(void (^)(CKRecordZoneID * zoneID, NSError * error))completionHandler;

- (void)fetchSubscriptionWithID:(CKSubscriptionID )subscriptionID completionHandler:(void (^)(CKSubscription * subscription, NSError * error))completionHandler;
- (void)fetchAllSubscriptionsWithCompletionHandler:(void (^)(NSArray<CKSubscription *> * subscriptions, NSError * error))completionHandler;
- (void)saveSubscription:(CKSubscription *)subscription completionHandler:(void (^)(CKSubscription * subscription, NSError * error))completionHandler;
- (void)deleteSubscriptionWithID:(CKSubscriptionID)subscriptionID completionHandler:(void (^)(CKSubscriptionID subscriptionID, NSError * error))completionHandler;
@end


#endif /* MockCKDatabase_h */
Loading

0 comments on commit 063cd74

Please sign in to comment.