Skip to content

Commit

Permalink
OC 工具类优化
Browse files Browse the repository at this point in the history
  • Loading branch information
marlkiller committed Aug 10, 2024
1 parent 063cd74 commit 5f075df
Show file tree
Hide file tree
Showing 13 changed files with 270 additions and 152 deletions.
8 changes: 0 additions & 8 deletions dylib_dobby_hook/apps/AirBuddyHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,6 @@ - (BOOL)hack {
[defaults setBool:true forKey:@"AMSkipOnboarding"];
[defaults synchronize];

// boolForKeyImp = method_getImplementation(class_getInstanceMethod(NSClassFromString(@"NSUserDefaults"), NSSelectorFromString(@"boolForKey:")));
// [MemoryUtils hookInstanceMethod:
// objc_getClass("NSUserDefaults")
// originalSelector:NSSelectorFromString(@"boolForKey:")
// swizzledClass:[self class]
// swizzledSelector:NSSelectorFromString(@"hk_boolForKey:")
// ];
//
return YES;
}

Expand Down
117 changes: 74 additions & 43 deletions dylib_dobby_hook/apps/MacUpdaterHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ @implementation MacUpdaterHack

static IMP defaultStringIMP;
static IMP defaultIntIMP;
static IMP dataTaskWithRequestIMP;
static IMP URLSessionIMP2;
static IMP dataTaskWithRequest;
static IMP URLWithHostIMP;
static IMP directoryContentsIMP;
static IMP URLSessionIMP;
Expand Down Expand Up @@ -175,17 +176,17 @@ +(id)hook_URLWithHost:(id)arg2 path:(id)arg3 query:(id)arg4 user:(id)arg5 passwo


+ (NSString *) hk_checksumSparkleFramework{
NSLog(@">>>>>> hk_checksumSparkleFramework %@", self);
NSLog(@">>>>>> hk_checksumSparkleFramework");

// x86: 46e6b06e5626534a9c61b91cfb041ccf051a2db8
// arm: a5f76baec8ce44138ceadc97130d622642fe4d2e
// id ret = ((id (*)(id,SEL))checksumSparkleFrameworkIMP)(self,_cmd);

NSString *Sparkle = [[Constant getCurrentAppPath] stringByAppendingString:@"/Contents/Frameworks/Sparkle.framework/Versions/B/Sparkle_Backup"];
NSString *retFake = [EncryptionUtils calculateSHA1OfFile:Sparkle];
return retFake;

// return @"5cac513cff8b040faff3d4a6b40d13bbfa034334";
static NSString *cachedChecksum = nil;
if (!cachedChecksum){
NSString *Sparkle = [[Constant getCurrentAppPath] stringByAppendingString:@"/Contents/Frameworks/Sparkle.framework/Versions/B/Sparkle_Backup"];
cachedChecksum = [[EncryptionUtils calculateSHA1OfFile:Sparkle] copy];
NSLog(@">>>>>> hk_checksumSparkleFramework cachedChecksum = %@", cachedChecksum);
}
return cachedChecksum;
}

+ (NSString *) hk_uniqueIdentifierForDB{
Expand All @@ -207,6 +208,48 @@ -(void)hk_URLSession:(NSURLSession *)arg2 didReceiveChallenge:(NSURLAuthenticati
arg4(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:arg3.protectionSpace.serverTrust]);
}
}
//
//- (void)hook_URLSession:(id)session task:(id)task didCompleteWithError:(id)error{
//
// // https://macupdater-backend.com/configfile.cgi?b=16971&c=d8cef3817314647190c70f16357d0204f80c7dd6&s=5cac513cff8b040faff3d4a6b40d13bbfa034334&p=bd4867852d87df9b6353c6cad95adb5cbdde0a81&u=4bxexx40docih65dv6azovmier5m2xc7fqsgjjzn&a=0&e=(null)&l=(null)&x=5
//
// NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// NSString * cacheConfigFile = [cacheDir stringByAppendingPathComponent:@"MacUpdater/cache_configfile.cgi"];
//
//
// NSFileManager *fileManager = [NSFileManager defaultManager];
// NSDate *currentDate = [NSDate date];
// BOOL fileExists = [fileManager fileExistsAtPath:cacheConfigFile];
//
//
// id dataToDownload = [MemoryUtils getInstanceIvar:self ivarName:"dataToDownload"];
//
// if (!fileExists) {
// [dataToDownload writeToFile:cacheConfigFile atomically:YES];
// NSLog(@">>>>>> cache_configfile.cgi 文件不存在,已创建并写入数据");
// } else {
// // 文件存在,检查文件的修改日期
// NSDictionary *attributes = [fileManager attributesOfItemAtPath:cacheConfigFile error:nil];
// NSDate *modificationDate = [attributes fileModificationDate];
//
// if (modificationDate) {
// // 计算文件的修改日期与当前日期的时间差
// NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:modificationDate];
// NSTimeInterval oneMonthInterval = 30 * 24 * 60 * 60; // 一个大致的月份(30天)
// if (timeInterval > oneMonthInterval) {
//
// [dataToDownload writeToFile:cacheConfigFile atomically:YES];
// NSLog(@">>>>>> cache_configfile.cgi 文件存在且超过一个月,已重新写入数据");
// }
// }
// }
//// [MemoryUtils setInstanceIvar:self ivarName:"dataToDownload" value:
//// [NSData dataWithContentsOfFile:@"/Users/voidm/Downloads/[406] Response - macupdater-backend.com_configfile.cgi" options:0 error:nil]
//// ];
// ((void(*)(id,SEL,id,id,id))URLSessionIMP2)(self,_cmd,session,task,error);
// return ;
//}


- (BOOL)hack {
// [BEGIN]
Expand All @@ -219,22 +262,15 @@ - (BOOL)hack {
// [END]

//// -[AppDelegate purchaseInit]:
Class __NSCFStringClz = NSClassFromString(@"__NSCFString");
SEL defaultStringSel = NSSelectorFromString(@"defaultString");
Method defaultStringMethod = class_getInstanceMethod(__NSCFStringClz, defaultStringSel);
defaultStringIMP = method_getImplementation(defaultStringMethod);
[MemoryUtils hookInstanceMethod:__NSCFStringClz
originalSelector:defaultStringSel
defaultStringIMP = [MemoryUtils hookInstanceMethod:NSClassFromString(@"__NSCFString")
originalSelector:NSSelectorFromString(@"defaultString")
swizzledClass:[self class]
swizzledSelector:@selector(hk_defaultString)
];


SEL defaultIntSel = NSSelectorFromString(@"defaultInt");
Method defaultIntMethod = class_getInstanceMethod(__NSCFStringClz, defaultIntSel);
defaultIntIMP = method_getImplementation(defaultIntMethod);
[MemoryUtils hookInstanceMethod:__NSCFStringClz
originalSelector:defaultIntSel

defaultIntIMP = [MemoryUtils hookInstanceMethod:NSClassFromString(@"__NSCFString")
originalSelector:NSSelectorFromString(@"defaultInt")
swizzledClass:[self class]
swizzledSelector:@selector(hk_defaultInt)
];
Expand Down Expand Up @@ -275,37 +311,24 @@ - (BOOL)hack {

// 过滤 Framework 下的 dylib
// -[NSString directoryContents]:
Class NSStringClz = NSClassFromString(@"NSString");
SEL directoryContentsSel = NSSelectorFromString(@"directoryContents");
Method directoryContentsMethod = class_getInstanceMethod(NSStringClz, directoryContentsSel);
directoryContentsIMP = method_getImplementation(directoryContentsMethod);
[MemoryUtils hookInstanceMethod:NSStringClz
originalSelector:directoryContentsSel
directoryContentsIMP = [MemoryUtils hookInstanceMethod:NSClassFromString(@"NSString")
originalSelector:NSSelectorFromString(@"directoryContents")
swizzledClass:[self class]
swizzledSelector:@selector(hk_directoryContents)
];




Class AppDelegateClz = NSClassFromString(@"AppDelegate");
SEL checksumSparkleFrameworkSel = NSSelectorFromString(@"checksumSparkleFramework");
Method checksumSparkleFrameworkMethod = class_getClassMethod(AppDelegateClz, checksumSparkleFrameworkSel);
checksumSparkleFrameworkIMP = method_getImplementation(checksumSparkleFrameworkMethod);
[MemoryUtils hookClassMethod:AppDelegateClz
originalSelector:checksumSparkleFrameworkSel

checksumSparkleFrameworkIMP = [MemoryUtils hookClassMethod:NSClassFromString(@"AppDelegate")
originalSelector:NSSelectorFromString(@"checksumSparkleFramework")
swizzledClass:[self class]
swizzledSelector:@selector(hk_checksumSparkleFramework)
];

// 清除 API 中的 license 信息
Class NSURLClz = NSClassFromString(@"NSURL");
SEL URLWithHostSel = NSSelectorFromString(@"URLWithHost:path:query:user:password:fragment:scheme:port:");
Method URLWithHostMethod = class_getClassMethod(NSURLClz, URLWithHostSel);
URLWithHostIMP = method_getImplementation(URLWithHostMethod);
[MemoryUtils hookClassMethod:
NSURLClz
originalSelector:URLWithHostSel
// 清除 API 中的 license 信息
URLWithHostIMP = [MemoryUtils hookClassMethod:
NSClassFromString(@"NSURL")
originalSelector:NSSelectorFromString(@"URLWithHost:path:query:user:password:fragment:scheme:port:")
swizzledClass:[self class]
swizzledSelector:NSSelectorFromString(@"hook_URLWithHost:path:query:user:password:fragment:scheme:port:")
];
Expand All @@ -326,6 +349,14 @@ - (BOOL)hack {
swizzledSelector:NSSelectorFromString(@"hk_URLSession:didReceiveChallenge:completionHandler:")
];


// TODO: 不知道 有没有好的办法来拦截修改 configfile.cgi 请求
// URLSessionIMP2 = [MemoryUtils hookInstanceMethod:NSClassFromString(@"HTTPSecurePOST")
// originalSelector:NSSelectorFromString(@"URLSession:task:didCompleteWithError:")
// swizzledClass:[self class]
// swizzledSelector:NSSelectorFromString(@"hook_URLSession:task:didCompleteWithError:")
// ];

return YES;
}

Expand Down
11 changes: 3 additions & 8 deletions dylib_dobby_hook/apps/NavicatPremiumHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,9 @@ - (BOOL)hack {
];


Class AboutNavicatWindowControllerClz = NSClassFromString(@"AboutNavicatWindowController");
SEL displayRegisteredInfoSel = NSSelectorFromString(@"displayRegisteredInfo");
Method dataTaskWithRequestMethod = class_getInstanceMethod(AboutNavicatWindowControllerClz, displayRegisteredInfoSel);
displayRegisteredInfoIMP = method_getImplementation(dataTaskWithRequestMethod);

[MemoryUtils hookInstanceMethod:
AboutNavicatWindowControllerClz
originalSelector:displayRegisteredInfoSel
displayRegisteredInfoIMP = [MemoryUtils hookInstanceMethod:
NSClassFromString(@"AboutNavicatWindowController")
originalSelector:NSSelectorFromString(@"displayRegisteredInfo")
swizzledClass:[self class]
swizzledSelector: @selector(hk_displayRegisteredInfo)
];
Expand Down
12 changes: 4 additions & 8 deletions dylib_dobby_hook/apps/ProxyManHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,10 @@ - (BOOL)hack {
NSString *proxymanCoreFilePath = [[Constant getCurrentAppPath] stringByAppendingString:@"/Contents/Frameworks/ProxymanCore.framework/Versions/A/ProxymanCore"];
uintptr_t proxymanCoreFileOffset =[MemoryUtils getCurrentArchFileOffset: proxymanCoreFilePath];


Class NSMutableArrayClass = NSClassFromString(@"_TtC8Proxyman25PremiumPlanViewController");
SEL componentsJoinedByStringSeletor = NSSelectorFromString(@"viewDidLoad");
Method componentsJoinedByStringMethod = class_getInstanceMethod(NSMutableArrayClass, componentsJoinedByStringSeletor);
viewDidLoadIMP = method_getImplementation(componentsJoinedByStringMethod);
[MemoryUtils hookInstanceMethod:
NSMutableArrayClass
originalSelector:componentsJoinedByStringSeletor

viewDidLoadIMP = [MemoryUtils hookInstanceMethod:
NSClassFromString(@"_TtC8Proxyman25PremiumPlanViewController")
originalSelector:NSSelectorFromString(@"viewDidLoad")
swizzledClass:[self class]
swizzledSelector:NSSelectorFromString(@"hook_viewDidLoad")
];
Expand Down
20 changes: 5 additions & 15 deletions dylib_dobby_hook/apps/TablePlusHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -95,27 +95,17 @@ - (BOOL)hack {

// r12 = [[RNDecryptor decryptData:"file bytes" withPassword:"x" error:&var_48] retain];
// +[RNDecryptor decryptData:withPassword:error:]:
Class RNDecryptorClz = NSClassFromString(@"RNDecryptor");
SEL decryptDataSel = NSSelectorFromString(@"decryptData:withPassword:error:");
Method decryptDataMethod = class_getClassMethod(RNDecryptorClz, decryptDataSel);
decryptDataIMP = method_getImplementation(decryptDataMethod);

[MemoryUtils hookClassMethod:
RNDecryptorClz
originalSelector:decryptDataSel
decryptDataIMP = [MemoryUtils hookClassMethod:
NSClassFromString(@"RNDecryptor")
originalSelector:NSSelectorFromString(@"decryptData:withPassword:error:")
swizzledClass:[self class]
swizzledSelector:NSSelectorFromString(@"hk_decryptData:withPassword:error:")
];



Class AFURLSessionManagerClz = NSClassFromString(@"AFHTTPSessionManager");
SEL dataTaskWithRequestSel = NSSelectorFromString(@"dataTaskWithHTTPMethod:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure:");
Method dataTaskWithRequestMethod = class_getInstanceMethod(AFURLSessionManagerClz, dataTaskWithRequestSel);
dataTaskWithRequestIMP = method_getImplementation(dataTaskWithRequestMethod);
[MemoryUtils hookInstanceMethod:
AFURLSessionManagerClz
originalSelector:dataTaskWithRequestSel
dataTaskWithRequestIMP = [MemoryUtils hookInstanceMethod:NSClassFromString(@"AFHTTPSessionManager")
originalSelector:NSSelectorFromString(@"dataTaskWithHTTPMethod:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure:")
swizzledClass:[self class]
swizzledSelector:NSSelectorFromString(@"hk_dataTaskWithHTTPMethod:URLString:parameters:headers:uploadProgress:downloadProgress:success:failure:")
];
Expand Down
13 changes: 0 additions & 13 deletions dylib_dobby_hook/helpers/ForkLiftHelperHack.m
Original file line number Diff line number Diff line change
Expand Up @@ -92,19 +92,6 @@ OSStatus hk_SecCodeCopySigningInformation_forklift(SecCodeRef codeRef, SecCSFlag
}

- (BOOL)hack {

// Class ForkLiftHelper10HelperTool = NSClassFromString(@"_TtC31com_binarynights_ForkLiftHelper10HelperTool");
// SEL listenerSel = NSSelectorFromString(@"listener:shouldAcceptNewConnection:");
// Method listenerMethod = class_getInstanceMethod(ForkLiftHelper10HelperTool, listenerSel);
// listenerIMP = method_getImplementation(listenerMethod);
// [MemoryUtils hookInstanceMethod:ForkLiftHelper10HelperTool
// originalSelector:listenerSel
// swizzledClass:[self class]
// swizzledSelector:@selector(hk_listener:shouldAcceptNewConnection:)
// ];

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

DobbyHook(SecCodeCopySigningInformation, (void *)hk_SecCodeCopySigningInformation_forklift, (void *)&SecCodeCopySigningInformation_ori);
DobbyHook(SecCodeCheckValidityWithErrors, (void *)hk_SecCodeCheckValidityWithErrors, (void *)&SecCodeCheckValidityWithErrors_ori);
return YES;
Expand Down
2 changes: 2 additions & 0 deletions dylib_dobby_hook/utils/CommonRetOC.m
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,13 @@ - (id)hook_NSFileManager:(nullable NSString *)containerIdentifier{

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

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

}
Expand Down
8 changes: 4 additions & 4 deletions dylib_dobby_hook/utils/MemoryUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
+ (void)inspectObjectWithAddress:(void *)address;
+ (void)exAlart:(NSString *)title message:(NSString *)message;

+ (void)hookInstanceMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (void)hookClassMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (void)replaceInstanceMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (void)replaceClassMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (IMP)hookInstanceMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (IMP)hookClassMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (IMP)replaceInstanceMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;
+ (IMP)replaceClassMethod:(Class)originalClass originalSelector:(SEL)originalSelector swizzledClass:(Class)swizzledClass swizzledSelector:(SEL)swizzledSelector;


+ (id)getInstanceIvar:(Class)cls ivarName:(const char *)ivarName;
Expand Down
Loading

0 comments on commit 5f075df

Please sign in to comment.