diff --git a/CMakeLists.txt b/CMakeLists.txt index acf7edf..133d96e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ enable_language(C) enable_language(CXX) enable_language(OBJC) enable_language(OBJCXX) +#enable_language(Swift) set(CMAKE_C_STANDARD 17) @@ -32,6 +33,7 @@ set(COMPILE_OPTION -Wno-incompatible-pointer-types -Wno-int-to-void-pointer-cast -Wno-unguarded-availability-new # is only available on macOS 10.15 or newer + # -ftrivial-auto-var-init=zero ) set(LINK_OPTION @@ -71,6 +73,68 @@ add_library(${PROJECT_NAME} SHARED ${Utils} ${Apps} ) +set_target_properties(${PROJECT_NAME} PROPERTIES + + EXECUTABLE_PREFIX "lib" + EXECUTABLE_EXTENSION "dylib" + + # FRAMEWORK TRUE + # FRAMEWORK_VERSION A + # Mark which headers should public + # PUBLIC_HEADER "/usr/local/include" + + ## ---------------------------------- + ## Architecture + ## ---------------------------------- + XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES" + XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Release] "NO" + ## ---------------------------------- + ## Build Option + ## ---------------------------------- + + XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] "dwarf" + XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym" + + ## ---------------------------------- + ## Deployment + ## ---------------------------------- + XCODE_ATTRIBUTE_SKIP_INSTALL "YES" + # XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_LIBRARY_DIR)/Frameworks" + + ## ---------------------------------- + ## Link + ## ---------------------------------- + # /usr/local/lib + XCODE_ATTRIBUTE_DYLIB_INSTALL_NAME_BASE "$(INSTALL_PATH)" + XCODE_ATTRIBUTE_LD_DYLIB_INSTALL_NAME "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)" + XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/" + XCODE_ATTRIBUTE_DYLIB_COMPATIBILITY_VERSION "1" + XCODE_ATTRIBUTE_DYLIB_CURRENT_VERSION "1" + + ## ---------------------------------- + ## Apple Clang - Language - C/C++ + ## ---------------------------------- + XCODE_ATTRIBUTE_CLANG_GCC_C_LANGUAGE_STANDARD "gnu17" + XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++20" + XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++" + ## ---------------------------------- + ## Apple Clang - Language - Modules + ## ---------------------------------- + XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES" + ## ---------------------------------- + ## Apple Clang - Language - Objective-C + ## ---------------------------------- + # Enable ARC, cmake default is MRC + XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC "No" + XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK "YES" + ## ---------------------------------- + ## Apple Clang - Language - Code Generation + ## ---------------------------------- + XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS "YES" + + # Xcode 的Run 指令会自动 link 已经 dependency 的 target,不需要 CMake 的指令再 link 一遍,如果不是 Xcode Generate 则需要 CMake 进行 Link + +) # 去掉lib前缀 diff --git a/dylib_dobby_hook/apps/DevHack.m b/dylib_dobby_hook/apps/DevHack.m index ab55bd8..e66cd4a 100644 --- a/dylib_dobby_hook/apps/DevHack.m +++ b/dylib_dobby_hook/apps/DevHack.m @@ -164,26 +164,51 @@ + (void)draw_event:(id)sender { - (BOOL)hack { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - // 在这里执行你的代码 - NSLog(@">>>>>> 代码延迟执行了 1 秒"); - NSLog(@">>>>>> 添加自定义菜单"); - - NSMenu *mainMenu = [NSApplication sharedApplication].mainMenu; - // 创建一个与独立的菜单项 - NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"menu_new" action:nil keyEquivalent:@""]; - NSMenuItem *subMenuItem1 = [[NSMenuItem alloc] initWithTitle:@"mem_event" action:NSSelectorFromString(@"mem_event:") keyEquivalent:@""]; - [subMenuItem1 setTarget:self.class]; - NSMenuItem *subMenuItem2 = [[NSMenuItem alloc] initWithTitle:@"draw_event" action:@selector(draw_event:) keyEquivalent:@""]; - [subMenuItem2 setTarget:DevHack.class]; - // 创建一个子菜单并将子菜单项添加进去 - NSMenu *newMenu = [[NSMenu alloc] initWithTitle:@"New Menu [HOOK]"]; - [newMenu addItem:subMenuItem1]; - [newMenu addItem:subMenuItem2]; - // 将子菜单添加到父菜单项 - [newMenuItem setSubmenu:newMenu]; - [mainMenu addItem:newMenuItem]; - }); +// 手动定时监测菜单 +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +// while (true) { +// // 每 5 秒执行一次 +// sleep(5); +// NSLog(@">>>>>> allWindows"); +// // 在主线程上异步执行窗口信息获取和日志记录 +// dispatch_async(dispatch_get_main_queue(), ^{ +// NSArray *allWindows = [NSApplication sharedApplication].windows; +// // 遍历所有窗口,打印窗口信息 +// for (NSWindow *window in allWindows) { +// NSViewController *viewController = window.contentViewController; +// NSLog(@"窗口类名: %@, 关联视图控制器: %@", NSStringFromClass([window class]), viewController ? viewController : @"无"); +// } +// }); +// } +// }); + +// -[_TtC13App_Cleaner_822BaseFeaturesController onAppDidFinishLaunching]: + + + + + +// 添加菜单 +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// // 在这里执行你的代码 +// NSLog(@">>>>>> 代码延迟执行了 1 秒"); +// NSLog(@">>>>>> 添加自定义菜单"); +// +// NSMenu *mainMenu = [NSApplication sharedApplication].mainMenu; +// // 创建一个与独立的菜单项 +// NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@"menu_new" action:nil keyEquivalent:@""]; +// NSMenuItem *subMenuItem1 = [[NSMenuItem alloc] initWithTitle:@"mem_event" action:NSSelectorFromString(@"mem_event:") keyEquivalent:@""]; +// [subMenuItem1 setTarget:self.class]; +// NSMenuItem *subMenuItem2 = [[NSMenuItem alloc] initWithTitle:@"draw_event" action:@selector(draw_event:) keyEquivalent:@""]; +// [subMenuItem2 setTarget:DevHack.class]; +// // 创建一个子菜单并将子菜单项添加进去 +// NSMenu *newMenu = [[NSMenu alloc] initWithTitle:@"New Menu [HOOK]"]; +// [newMenu addItem:subMenuItem1]; +// [newMenu addItem:subMenuItem2]; +// // 将子菜单添加到父菜单项 +// [newMenuItem setSubmenu:newMenu]; +// [mainMenu addItem:newMenuItem]; +// }); // Class WinControllerClass = NSClassFromString(@"mac_app_dev_swift.ViewController"); diff --git a/dylib_dobby_hook/apps/HackProtocol.h b/dylib_dobby_hook/apps/HackProtocol.h index ea65ad7..389fbcf 100644 --- a/dylib_dobby_hook/apps/HackProtocol.h +++ b/dylib_dobby_hook/apps/HackProtocol.h @@ -57,5 +57,16 @@ NSLog(@">>>>>> called + ret"); } +- (BOOL)hack { + return NO; +} + +- (NSString *)getAppName { + return nil; +} + +- (NSString *)getSupportAppVersion { + return nil; +} @end diff --git a/dylib_dobby_hook/apps/NavicatPremiumHack.m b/dylib_dobby_hook/apps/NavicatPremiumHack.m index 81767eb..934f9d5 100644 --- a/dylib_dobby_hook/apps/NavicatPremiumHack.m +++ b/dylib_dobby_hook/apps/NavicatPremiumHack.m @@ -167,6 +167,54 @@ - (void)hk_displayRegisteredInfo { // [mutableDict setObject:@"organization" forKey:@"organization"]; // *deviceIdPtr = mutableDict; // } + + +// 指针转换 (void *) +// id object = self; +// NSString *user = *(NSString __strong **)((__bridge void *)object + 0x60); +// NSString *newUser = @""; +// *(NSString __strong **)((__bridge void *)object + 0x60) = newUser; + + +// 指针转换 (&) +// id object = self; +// NSString *user = *(NSString __strong **)(&object + 0x60); +// NSString *newUser = @""; +// *(NSString __strong **)((&object) + 0x60) = newUser; + + + +// 指针转换 (uintptr_t) +// id object = self; +// NSString *user = *(NSString __strong **)(((void *)(uintptr_t)object) + 0x60); +// NSString *newUser = @""; +// *(NSString __strong **)(((void *)(uintptr_t)object) + 0x60) = newUser; + +// 读写 id 类型 +// id user = *(id __strong *)((__bridge void *)object + 0x60); +// id c = *(id __strong *)(&object + 0x60); +// id newC = @""; +// *(id __strong *)(&object + 0x60) = newC; + + +// 读写 int 属性对象 +// int intValue = *(int *)((__bridge void *)object + 0x30); +// *(int *)((__bridge void *)object + 0x30) = 123; + + +// 读写 NSString 属性对象 +// NSString __strong **propertyPtr = (NSString __strong **)(&object + 0x60); +// *propertyPtr = @"1"; +// NSString *propertyA = *propertyPtr = @"1"; + + + // demo +// std::string str = "123"; +// std::string *ptr = &str; +// +// uintptr_t address = reinterpret_cast(ptr); +// void * address2 = (void *)ptr; +// void * address3 = &str; ((void(*)(id, SEL))displayRegisteredInfoIMP)(self, _cmd); @@ -182,5 +230,25 @@ - (void)hk_displayRegisteredInfo { [_appExtraInfoLabel setStringValue:[Constant G_EMAIL_ADDRESS]]; } +// id BaseFeaturesController = self; +// +//// r14 = *(r13 + *objc_ivar_offset__TtC13App_Cleaner_822BaseFeaturesController_licenseManager); +// id NKLicenseManager = *(id __strong *)((__bridge void *)BaseFeaturesController + 0x8); +// +//// r14 = *(rbx + 0x28); +//// r15 = r14 + 0x20; +// id LicenseStateStorage = *(id __strong *)((__bridge void *)NKLicenseManager + 0x28); +// id TtC16NKLicenseManager19LicenseStateStorage_serialKey = *(id __strong *)((__bridge void *)LicenseStateStorage + 0x20); +// if (!TtC16NKLicenseManager19LicenseStateStorage_serialKey) { +// +// +//// *(id __strong *)((__bridge void *)LicenseStateStorage + 0x20) = @"123456"; +// Ivar serialKeyIvar = class_getInstanceVariable([LicenseStateStorage class], "serialKey"); +// const char *ivarTypeEncoding = ivar_getTypeEncoding(serialKeyIvar); +// NSString *ivarType = [NSString stringWithUTF8String:ivarTypeEncoding]; +// id currentValue = object_getIvar(LicenseStateStorage, serialKeyIvar); +// object_setIvar(LicenseStateStorage, serialKeyIvar, @"2222222222"); +// *(int *)((__bridge void *)LicenseStateStorage + 0x28) = 1; +// } } @end diff --git a/dylib_dobby_hook/dobby.h b/dylib_dobby_hook/dobby.h index d7eec86..2b8b948 100644 --- a/dylib_dobby_hook/dobby.h +++ b/dylib_dobby_hook/dobby.h @@ -129,7 +129,7 @@ int DobbyInstrument(void *address, dobby_instrument_callback_t pre_handler); // destroy and restore code patch int DobbyDestroy(void *address); -const char *DobbyGetVersion(); +const char *DobbyGetVersion(void); // symbol resolver void *DobbySymbolResolver(const char *image_name, const char *symbol_name); diff --git a/dylib_dobby_hook/utils/Constant.m b/dylib_dobby_hook/utils/Constant.m index f5423ba..e2e3926 100644 --- a/dylib_dobby_hook/utils/Constant.m +++ b/dylib_dobby_hook/utils/Constant.m @@ -42,7 +42,11 @@ static void __attribute__ ((constructor)) initialize(void){ @dynamic G_EMAIL_ADDRESS; @dynamic G_EMAIL_ADDRESS_FMT; @dynamic G_DYLIB_NAME; - +@dynamic currentAppPath; +@dynamic currentAppName; +@dynamic currentAppVersion; +@dynamic currentAppCFBundleVersion; +@dynamic arm; + (NSString *)G_EMAIL_ADDRESS { return love69(G_EMAIL_ADDRESS); diff --git a/dylib_dobby_hook/utils/MemoryUtils.m b/dylib_dobby_hook/utils/MemoryUtils.m index 367dc9c..4a9d54a 100644 --- a/dylib_dobby_hook/utils/MemoryUtils.m +++ b/dylib_dobby_hook/utils/MemoryUtils.m @@ -215,7 +215,7 @@ + (NSArray *)searchMachineCodeOffsets:(NSString *)searchFilePath machineCode:(NS searchFilePath, searchMachineCode]; - [self exAlart:@"特征吗匹配 异常 ??!!" message:message]; + [self exAlart:@"特征吗匹配 异常 ?!!!" message:message]; return offsets; } if (CACHE_MACHINE_CODE_OFFSETS) { @@ -518,7 +518,7 @@ + (void)hookInstanceMethod:(Class)originalClass originalSelector:(SEL)originalSe NSStringFromClass(swizzledClass), NSStringFromSelector(swizzledSelector), swizzledMethod]; - [self exAlart:@"hookInstanceMethod 异常 ??!!" message:message]; + [self exAlart:@"hookInstanceMethod 异常 ?!!!" message:message]; } } @@ -551,7 +551,7 @@ + (void)hookClassMethod:(Class)originalClass originalSelector:(SEL)originalSelec NSStringFromClass(swizzledClass), NSStringFromSelector(swizzledSelector), swizzledMethod]; - [self exAlart:@"hookClassMethod 异常 ??!!" message:message]; + [self exAlart:@"hookClassMethod 异常 ?!!!" message:message]; } } @@ -587,7 +587,7 @@ + (void)replaceInstanceMethod:(Class)originalClass originalSelector:(SEL)origina NSStringFromClass(swizzledClass), NSStringFromSelector(swizzledSelector), swizzledImplementation]; - [self exAlart:@"replaceInstanceMethod 异常 ??!!" message:message]; + [self exAlart:@"replaceInstanceMethod 异常 ?!!!" message:message]; } } @@ -622,7 +622,7 @@ + (void)replaceClassMethod:(Class)originalClass originalSelector:(SEL)originalSe NSStringFromClass(swizzledClass), NSStringFromSelector(swizzledSelector), swizzledImplementation]; - [self exAlart:@"replaceClassMethod 异常 ??!!" message:message]; + [self exAlart:@"replaceClassMethod 异常 ?!!!" message:message]; } }