diff --git a/Application/Dopamine.xcodeproj/project.pbxproj b/Application/Dopamine.xcodeproj/project.pbxproj index 72b462a59..2ce51de0b 100644 --- a/Application/Dopamine.xcodeproj/project.pbxproj +++ b/Application/Dopamine.xcodeproj/project.pbxproj @@ -2229,7 +2229,7 @@ "$(PROJECT_DIR)/Dopamine/Dependencies", "$(PROJECT_DIR)/Dopamine/Resources", ); - MARKETING_VERSION = 2.1.2; + MARKETING_VERSION = 2.1.4; PRODUCT_BUNDLE_IDENTIFIER = com.opa334.Dopamine; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -2266,7 +2266,7 @@ "$(PROJECT_DIR)/Dopamine/Dependencies", "$(PROJECT_DIR)/Dopamine/Resources", ); - MARKETING_VERSION = 2.1.2; + MARKETING_VERSION = 2.1.4; PRODUCT_BUNDLE_IDENTIFIER = com.opa334.Dopamine; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/Application/Dopamine/Exploits/multicast_bytecopy/exploit/IOGPU.c b/Application/Dopamine/Exploits/multicast_bytecopy/exploit/IOGPU.c index 2693d14d4..71a54ab94 100644 --- a/Application/Dopamine/Exploits/multicast_bytecopy/exploit/IOGPU.c +++ b/Application/Dopamine/Exploits/multicast_bytecopy/exploit/IOGPU.c @@ -56,11 +56,13 @@ int IOGPU_get_command_queue_extra_refills_needed(void) // iPhone 11 // iPhone 12 // iPhone 13 + // iPad mini 6 if ( strstr(u.machine, "iPhone9,") || strstr(u.machine, "iPhone12,") || strstr(u.machine, "iPhone13,") || strstr(u.machine, "iPhone14,") + || strstr(u.machine, "iPad14,") ) { return 1; diff --git a/Application/Dopamine/Jailbreak/DOBootstrapper.m b/Application/Dopamine/Jailbreak/DOBootstrapper.m index 4b484dac9..e4790590d 100644 --- a/Application/Dopamine/Jailbreak/DOBootstrapper.m +++ b/Application/Dopamine/Jailbreak/DOBootstrapper.m @@ -525,19 +525,7 @@ - (void)prepareBootstrapWithCompletion:(void (^)(NSError *))completion [[NSFileManager defaultManager] createDirectoryAtPath:mobilePreferencesPath withIntermediateDirectories:YES attributes:attributes error:nil]; } - // Dopamine 2.0 - 2.0.4 would bootstrap with wrong permissions - // Try to detect and fix it - NSString *mobilePath = NSJBRootPath(@"/var/mobile"); - struct stat s; - stat(mobilePath.fileSystemRepresentation, &s); - if (s.st_uid != 501 || s.st_gid != 501) { - chown(mobilePath.fileSystemRepresentation, 501, 501); - NSURL *mobileURL = [NSURL fileURLWithPath:mobilePath]; - NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtURL:mobileURL includingPropertiesForKeys:nil options:0 errorHandler:nil]; - for (NSURL *fileURL in enumerator) { - chown(fileURL.fileSystemRepresentation, 501, 501); - } - } + JBFixMobilePermissions(); completion(nil); }; diff --git a/Application/Dopamine/vi.lproj/Localizable.strings b/Application/Dopamine/vi.lproj/Localizable.strings index 346666580..25ff6cf74 100644 --- a/Application/Dopamine/vi.lproj/Localizable.strings +++ b/Application/Dopamine/vi.lproj/Localizable.strings @@ -41,7 +41,7 @@ "Settings_Tweak_Injection" = "Cho phép chạy Tweak"; "Settings_iDownload" = "iDownload (nhà phát triển)"; "Settings_Verbose_Logs" = "Hiện Log dạng phức tạp"; -/*Settings_Apps_JIT*/ +"Settings_Apps_JIT" = "Bật JIT"; // Settings Buttons "Button_Remove_Jailbreak" = "Gỡ Jailbreak"; @@ -49,11 +49,11 @@ "Button_Unhide_Jailbreak" = "Bỏ ẩn Jailbreak"; "Button_Refresh_Jailbreak_Apps" = "Làm mới các app Jailbreak"; "Button_Reinstall_Package_Managers" = "Cài lại các trình quản lý gói"; -/*Button_Change_Mobile_Password*/ +"Button_Change_Mobile_Password" = "Đổi mật khẩu \"mobile\""; // Settings Hints "Hint_Hide_Jailbreak" = "Tùy chọn \"Ẩn Jailbreak\" sẽ tạm thời xóa các tệp liên quan đến jailbreak và khôi phục lại các tệp này khi bạn jailbreak vào lần tới."; -"Hint_Hide_Jailbreak_Jailbroken" = "Tùy chọn \"Ẩn Jailbreak\" sẽ tắt một số chức năng đặc biệt nhằm tránh phát hiện jailbreak trong các ứng dụng. Tuy nhiên, tính năng này không phải là hoàn hảo và không thể hoàn toàn ẩn jailbreak khỏi mọi ứng dụng."; +"Hint_Hide_Jailbreak_Jailbroken" = "Tùy chọn \"Ẩn Jailbreak\" sẽ tắt một số chức năng nhằm tránh phát hiện jailbreak trong các ứng dụng. Tuy nhiên, tính năng này không phải là hoàn hảo và không thể hoàn toàn ẩn jailbreak khỏi mọi ứng dụng."; "Section_Jailbreak_Settings" = "Thiết đặt Jailbreak"; "Section_Actions" = "Tác vụ"; "Section_Customization" = "Tùy biến"; @@ -65,27 +65,27 @@ "Alert_Tweak_Injection_Toggled_Reboot_Now" = "Khởi động lại ngay"; "Alert_Tweak_Injection_Toggled_Reboot_Later" = "Để sau"; "Alert_Remove_Jailbreak_Title" = "Gỡ bỏ Jailbreak"; -"Alert_Remove_Jailbreak_Pressed_Body" = "Việc gỡ bỏ jailbreak sẽ xóa toàn bộ các tệp liên quan đến jailbreak. Các ứng dụng, tệp và dữ liệu thông thường sẽ vẫn được giữ nguyên. Bạn sẽ không thể hoàn tác việc gỡ jailbreak sau khi nhấn \"Tiếp tục\"."; -"Alert_Remove_Jailbreak_Enabled_Body" = "Tùy chọn \"Gỡ Jailbreak\" sẽ xóa toàn bộ các tệp liên quan đến jailbreak khi bạn thực hiện jailbreak vào lần tới. Các ứng dụng, tệp và dữ liệu thông thường sẽ vẫn được giữ nguyên. Bạn sẽ không thể hoàn tác việc gỡ jailbreak sau khi nhấn \"Tiếp tục\"."; -/*Alert_Change_Mobile_Password_Body*/ -/*Password_Placeholder*/ -/*Repeat_Password_Placeholder*/ -/*Button_Change*/ +"Alert_Remove_Jailbreak_Pressed_Body" = "Việc này sẽ xóa toàn bộ các tệp liên quan đến jailbreak. Các ứng dụng, tệp và dữ liệu thông thường sẽ vẫn được giữ nguyên. Bạn sẽ không thể hoàn tác sau khi nhấn \"Tiếp tục\"."; +"Alert_Remove_Jailbreak_Enabled_Body" = "Tùy chọn này sẽ xóa toàn bộ các tệp liên quan đến jailbreak khi bạn thực hiện jailbreak vào lần tới. Các ứng dụng, tệp và dữ liệu thông thường sẽ vẫn được giữ nguyên. Bạn sẽ không thể hoàn tác sau khi nhấn \"Tiếp tục\"."; +"Alert_Change_Mobile_Password_Body" = "Thiết đặt mật khẩu của người dùng \"mobile\", có thể sử dụng để lấy quyền root thông qua sudo. Nếu muốn đặt mật khẩu root, bạn có thể thực hiện bằng lệnh \"sudo passwd root\" trong terminal."; +"Password_Placeholder" = "Nhập mật khẩu"; +"Repeat_Password_Placeholder" = "Nhập lại mật khẩu"; +"Button_Change" = "Đổi"; "Button_Cancel" = "Hủy bỏ"; "Button_Continue" = "Tiếp tục"; // Duplicate Apps Errors -"Duplicate_Apps_Error_Dopamine_App" = "Có nhiều ứng dụng với tên định danh \"%@\" trùng nhau trong thư mục ứng dụng của Dopamine (\"%@\"). Không thể tiếp tục."; -"Duplicate_Apps_Error_User_App" = "Ứng dụng với tên định danh \"%@\" đã tồn tại trong thư mục ứng dụng của Dopamine (\"%@\"), nhưng đồng thời cũng được cài đặt tách biệt trên hệ thống. Không thể tiếp tục."; -"Duplicate_Apps_Error_Icon_Cache" = "Ứng dụng với tên định danh \"%@\" đã tồn tại trong thư mục ứng dụng của Dopamine (\"%@\"), nhưng lại được ghi bên trong icon cache với một tên đường dẫn khác (\"%@\"). Không thể tiếp tục."; +"Duplicate_Apps_Error_Dopamine_App" = "Có nhiều ứng dụng với cùng một tên định danh \"%@\" được cài đặt trong thư mục ứng dụng của Dopamine (\"%@\"). Không thể tiếp tục."; +"Duplicate_Apps_Error_User_App" = "Ứng dụng có tên định danh \"%@\" đã được cài đặt trong thư mục ứng dụng của Dopamine (\"%@\"), nhưng đồng thời cũng đã được cài đặt trên hệ thống. Không thể tiếp tục."; +"Duplicate_Apps_Error_Icon_Cache" = "Ứng dụng có tên định danh \"%@\" đã được cài đặt trong thư mục ứng dụng của Dopamine (\"%@\"), nhưng lại được ghi bên trong icon cache với một đường dẫn khác (\"%@\"). Không thể tiếp tục."; // Settings Lists "Theme" = "Chủ đề"; "Kernel Exploit" = "Lỗ hổng Kernel"; "PPL Bypass" = "Lỗ hổng PPL"; "PAC Bypass" = "Lỗ hổng PAC"; -/*None*/ -/*Recommended*/ +"None" = "Không có"; +"Recommended" = "Đề xuất"; // Credits "Credits_Button_Discord" = "Discord"; @@ -94,7 +94,7 @@ // Logs "Initializing Environment" = "Khởi tạo môi trường Jailbreak"; -/*Initializing Protection*/ +"Initializing Protection" = "Khởi tạo quy trình bảo vệ"; "Loading BaseBin TrustCache" = "Đang tải TrustCache BaseBin"; "Applying Bind Mount" = "Đang gắn Bind Mount"; "Removing Jailbreak" = "Đang gỡ bỏ Jailbreak"; @@ -109,6 +109,5 @@ // Package Manager selection "Status_Title_Select_Package_Managers" = "Chọn trình quản lý gói"; -"Select_Package_Managers_Install_Message" = "Nếu bạn không biết nên chọn trình quản lý gói nào, hãy chọn Sileo (sẽ không bao giờ có Cydia cho bạn chọn)"; +"Select_Package_Managers_Install_Message" = "Nếu bạn không biết nên nhấn vào lựa chọn nào, hãy chọn Sileo (sẽ không bao giờ có Cydia cho bạn chọn)"; "Continue" = "Tiếp tục"; - diff --git a/BaseBin/ChOma b/BaseBin/ChOma index 362eac146..4ad4a014e 160000 --- a/BaseBin/ChOma +++ b/BaseBin/ChOma @@ -1 +1 @@ -Subproject commit 362eac14671dd5c86e441a9078939bbbb06042be +Subproject commit 4ad4a014e0e4315d20e2cedc6afe3ad08620c467 diff --git a/BaseBin/XPF b/BaseBin/XPF index f4ce30f7b..4d5f1dc65 160000 --- a/BaseBin/XPF +++ b/BaseBin/XPF @@ -1 +1 @@ -Subproject commit f4ce30f7b0aefed15f53a16e5b67a43c578295c7 +Subproject commit 4d5f1dc6501fac1b6f19cc913c140f6369a23ae2 diff --git a/BaseBin/_external/basebin/.version b/BaseBin/_external/basebin/.version index 8f9174b4d..c346e7a04 100644 --- a/BaseBin/_external/basebin/.version +++ b/BaseBin/_external/basebin/.version @@ -1 +1 @@ -2.1.2 \ No newline at end of file +2.1.4 \ No newline at end of file diff --git a/BaseBin/launchdhook/src/jbserver/jbdomain_systemwide.c b/BaseBin/launchdhook/src/jbserver/jbdomain_systemwide.c index 955e391b8..14b1bbb28 100644 --- a/BaseBin/launchdhook/src/jbserver/jbdomain_systemwide.c +++ b/BaseBin/launchdhook/src/jbserver/jbdomain_systemwide.c @@ -112,9 +112,14 @@ static int systemwide_process_checkin(audit_token_t *processToken, char **rootPa { // Fetch process info pid_t pid = audit_token_to_pid(*processToken); - uint64_t proc = proc_find(pid); char procPath[4*MAXPATHLEN]; - if (proc_pidpath(pid, procPath, sizeof(procPath)) < 0) { + if (proc_pidpath(pid, procPath, sizeof(procPath)) <= 0) { + return -1; + } + + // Find proc in kernelspace + uint64_t proc = proc_find(pid); + if (!proc) { return -1; } @@ -123,7 +128,6 @@ static int systemwide_process_checkin(audit_token_t *processToken, char **rootPa systemwide_get_boot_uuid(bootUUIDOut); // Generate sandbox extensions for the requesting process - char *sandboxExtensionsArr[] = { // Make /var/jb readable and executable sandbox_extension_issue_file_to_process("com.apple.app-sandbox.read", JBRootPath(""), 0, *processToken), @@ -134,12 +138,15 @@ static int systemwide_process_checkin(audit_token_t *processToken, char **rootPa }; int sandboxExtensionsCount = sizeof(sandboxExtensionsArr) / sizeof(char *); *sandboxExtensionsOut = combine_strings('|', sandboxExtensionsArr, sandboxExtensionsCount); - for (int i = 0; i < sandboxExtensionsCount; i++) free(sandboxExtensionsArr[i]); + for (int i = 0; i < sandboxExtensionsCount; i++) { + if (sandboxExtensionsArr[i]) { + free(sandboxExtensionsArr[i]); + } + } bool fullyDebugged = false; if (stringStartsWith(procPath, "/private/var/containers/Bundle/Application") || stringStartsWith(procPath, JBRootPath("/Applications"))) { - // This is an app - // Enable CS_DEBUGGED based on user preference + // This is an app, enable CS_DEBUGGED based on user preference if (jbsetting(markAppsAsDebugged)) { fullyDebugged = true; } diff --git a/BaseBin/launchdhook/src/update.m b/BaseBin/launchdhook/src/update.m index 3f4b9322e..f5d42964b 100644 --- a/BaseBin/launchdhook/src/update.m +++ b/BaseBin/launchdhook/src/update.m @@ -202,4 +202,6 @@ void jbupdate_finalize_stage2(const char *prevVersion, const char *newVersion) arm64_kcall_init(); #endif } + + JBFixMobilePermissions(); } \ No newline at end of file diff --git a/BaseBin/libjailbreak/src/kcall_Fugu14.c b/BaseBin/libjailbreak/src/kcall_Fugu14.c index 66406f33d..1b1a7f2e3 100644 --- a/BaseBin/libjailbreak/src/kcall_Fugu14.c +++ b/BaseBin/libjailbreak/src/kcall_Fugu14.c @@ -19,14 +19,14 @@ void pac_loop(void); uint64_t mapKernelPage(uint64_t addr) { - uint64_t page = addr & ~0x3FFFULL; - uint64_t off = addr & 0x3FFFULL; - uint64_t translated = kvtophys(page); - void *map = NULL; - if (kmap(translated, 0x4000, &map) == 0) { - return ((uint64_t)map) + off; - } - return -1; + uint64_t page = addr & ~0x3FFFULL; + uint64_t off = addr & 0x3FFFULL; + uint64_t translated = kvtophys(page); + void *map = NULL; + if (kmap(translated, 0x4000, &map) == 0) { + return ((uint64_t)map) + off; + } + return -1; } uint64_t getUserReturnThreadContext(void) @@ -130,8 +130,8 @@ int fugu14_kcall_init(int (^threadSigner)(mach_port_t threadPort)) // Write register values uint64_t str_x8_x9_gadget = kgadget(str_x8_x9); - uint64_t exception_return_after_check = kgadget(exception_return_after_check); - uint64_t brX22 = kgadget(br_x22); + uint64_t exception_return_after_check = kgadget(exception_return_after_check); + uint64_t brX22 = kgadget(br_x22); kwrite64(actContext + offsetof(kRegisterState, pc), str_x8_x9_gadget); kwrite32(actContext + offsetof(kRegisterState, cpsr), CPSR_KERN_INTR_DIS); kwrite64(actContext + offsetof(kRegisterState, lr), exception_return_after_check); diff --git a/BaseBin/libjailbreak/src/kernel.c b/BaseBin/libjailbreak/src/kernel.c index 77dcf4226..55fd16a42 100644 --- a/BaseBin/libjailbreak/src/kernel.c +++ b/BaseBin/libjailbreak/src/kernel.c @@ -151,34 +151,40 @@ int pmap_cs_allow_invalid(uint64_t pmap) int cs_allow_invalid(uint64_t proc, bool emulateFully) { - uint64_t task = proc_task(proc); - uint64_t vm_map = kread_ptr(task + koffsetof(task, map)); - uint64_t pmap = kread_ptr(vm_map + koffsetof(vm_map, pmap)); - - // For non-pmap_cs (arm64) devices, this should always be emulated. + if (proc) { + uint64_t task = proc_task(proc); + if (task) { + uint64_t vm_map = kread_ptr(task + koffsetof(task, map)); + if (vm_map) { + uint64_t pmap = kread_ptr(vm_map + koffsetof(vm_map, pmap)); + if (pmap) { + // For non-pmap_cs (arm64) devices, this should always be emulated. #ifdef __arm64e__ - if (emulateFully) { + if (emulateFully) { #endif - // Fugu15 Rootful - //proc_csflags_clear(proc, CS_EXEC_SET_ENFORCEMENT | CS_EXEC_SET_KILL | CS_EXEC_SET_HARD | CS_REQUIRE_LV | CS_ENFORCEMENT | CS_RESTRICT | CS_KILL | CS_HARD | CS_FORCED_LV); - //proc_csflags_set(proc, CS_DEBUGGED | CS_INVALID_ALLOWED | CS_GET_TASK_ALLOW); - - // XNU - proc_csflags_clear(proc, CS_KILL | CS_HARD); - proc_csflags_set(proc, CS_DEBUGGED); - - task_set_memory_ownership_transfer(task, true); - vm_map_flags flags = { 0 }; - kreadbuf(vm_map + koffsetof(vm_map, flags), &flags, sizeof(flags)); - flags.switch_protect = false; - flags.cs_debugged = true; - kwritebuf(vm_map + koffsetof(vm_map, flags), &flags, sizeof(flags)); + // Fugu15 Rootful + //proc_csflags_clear(proc, CS_EXEC_SET_ENFORCEMENT | CS_EXEC_SET_KILL | CS_EXEC_SET_HARD | CS_REQUIRE_LV | CS_ENFORCEMENT | CS_RESTRICT | CS_KILL | CS_HARD | CS_FORCED_LV); + //proc_csflags_set(proc, CS_DEBUGGED | CS_INVALID_ALLOWED | CS_GET_TASK_ALLOW); + + // XNU + proc_csflags_clear(proc, CS_KILL | CS_HARD); + proc_csflags_set(proc, CS_DEBUGGED); + + task_set_memory_ownership_transfer(task, true); + vm_map_flags flags = { 0 }; + kreadbuf(vm_map + koffsetof(vm_map, flags), &flags, sizeof(flags)); + flags.switch_protect = false; + flags.cs_debugged = true; + kwritebuf(vm_map + koffsetof(vm_map, flags), &flags, sizeof(flags)); #ifdef __arm64e__ - } - - // For pmap_cs (arm64e) devices, this is enough to get unsigned code to run - pmap_cs_allow_invalid(pmap); + } + // For pmap_cs (arm64e) devices, this is enough to get unsigned code to run + pmap_cs_allow_invalid(pmap); #endif + } + } + } + } return 0; } diff --git a/BaseBin/libjailbreak/src/util.h b/BaseBin/libjailbreak/src/util.h index 02f48fc9f..12677d16b 100644 --- a/BaseBin/libjailbreak/src/util.h +++ b/BaseBin/libjailbreak/src/util.h @@ -80,4 +80,6 @@ NSString *NSJBRootPath(NSString *relativePath); NSString *NSPrebootUUIDPath(NSString *relativePath); #endif +void JBFixMobilePermissions(void); + #endif \ No newline at end of file diff --git a/BaseBin/libjailbreak/src/util.m b/BaseBin/libjailbreak/src/util.m index d637bb6bd..b99f4509f 100644 --- a/BaseBin/libjailbreak/src/util.m +++ b/BaseBin/libjailbreak/src/util.m @@ -1,6 +1,7 @@ #include "info.h" #import #import "util.h" +#import NSString *NSJBRootPath(NSString *relativePath) { @@ -14,4 +15,49 @@ @autoreleasepool { return [NSString stringWithUTF8String:prebootUUIDPath(relativePath.UTF8String)]; } +} + +void _JBFixMobilePermissionsOfDirectory(NSString *directoryPath, BOOL recursive) +{ + struct stat s; + NSURL *directoryURL = [NSURL fileURLWithPath:directoryPath]; + + if (stat(directoryURL.fileSystemRepresentation, &s) == 0) { + if (s.st_uid != 501 || s.st_gid != 501) { + chown(directoryURL.fileSystemRepresentation, 501, 501); + } + } + + if (recursive) { + NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtURL:directoryURL includingPropertiesForKeys:nil options:0 errorHandler:nil]; + for (NSURL *fileURL in enumerator) { + if (stat(fileURL.fileSystemRepresentation, &s) == 0) { + if (s.st_uid != 501 || s.st_gid != 501) { + chown(fileURL.fileSystemRepresentation, 501, 501); + } + } + } + } +} + +void JBFixMobilePermissions(void) +{ + @autoreleasepool { + NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:NSJBRootPath(@"/var") error:nil]; + if ([attributes[NSFileType] isEqualToString:NSFileTypeSymbolicLink]) { + // /var/jb/var is a symlink, abort + return; + } + attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:NSJBRootPath(@"/var/mobile") error:nil]; + if ([attributes[NSFileType] isEqualToString:NSFileTypeSymbolicLink]) { + // /var/jb/var/mobile is a symlink, abort + return; + } + + _JBFixMobilePermissionsOfDirectory(NSJBRootPath(@"/var/mobile"), NO); + _JBFixMobilePermissionsOfDirectory(NSJBRootPath(@"/var/mobile/Library"), NO); + _JBFixMobilePermissionsOfDirectory(NSJBRootPath(@"/var/mobile/Library/SplashBoard"), YES); + _JBFixMobilePermissionsOfDirectory(NSJBRootPath(@"/var/mobile/Library/Application Support"), YES); + _JBFixMobilePermissionsOfDirectory(NSJBRootPath(@"/var/mobile/Library/Preferences"), YES); + } } \ No newline at end of file