diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 7ade1f0..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -cmake_minimum_required(VERSION 3.20) - -project(UIWarp) - -add_library(${PROJECT_NAME} SHARED - src/main.cpp -) - -target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) - -target_compile_options(${PROJECT_NAME} PRIVATE - -stdlib=libc++ - -fno-rtti - -fvisibility=hidden - -fvisibility-inlines-hidden -) - -# Add OLLVM plugin if exists -if (EXISTS ${CMAKE_SOURCE_DIR}/ollvm.dylib) - target_compile_options(${PROJECT_NAME} PRIVATE - -fpass-plugin=${CMAKE_SOURCE_DIR}/ollvm.dylib - ) -endif() - -target_link_libraries(${PROJECT_NAME} PRIVATE - "-framework Foundation" - "-framework CoreFoundation" - "-framework AppKit" - "-framework Cocoa" -) - -target_link_libraries(${PROJECT_NAME} PRIVATE - objc -) diff --git a/crack/pdfm-18.0.1.53056/prl_client_app b/crack/pdfm-18.0.1.53056/prl_client_app index 699b311..4dbd4f4 100644 Binary files a/crack/pdfm-18.0.1.53056/prl_client_app and b/crack/pdfm-18.0.1.53056/prl_client_app differ diff --git a/crack/pdfm-18.0.1.53056/prl_disp_service b/crack/pdfm-18.0.1.53056/prl_disp_service index 432d434..90d6ddf 100644 Binary files a/crack/pdfm-18.0.1.53056/prl_disp_service and b/crack/pdfm-18.0.1.53056/prl_disp_service differ diff --git a/crack/pdfm-18.0.1.53056/prl_disp_service.md b/crack/pdfm-18.0.1.53056/prl_disp_service.md index e1cdac8..ce0e4ef 100644 --- a/crack/pdfm-18.0.1.53056/prl_disp_service.md +++ b/crack/pdfm-18.0.1.53056/prl_disp_service.md @@ -1,6 +1,152 @@ # patch prl_disp_app -## 1. patch /usr/bin/codesign verify +## 2. patch Signature::SignCheckerImpl + +### 2.1 find vtable + +#### x86_64 + +``` +__const:00000001009B2A70 ; `vtable for'Signature::SignCheckerImpl +__const:00000001009B2A70 00 00 00 00 00 00 00 00 _ZTVN9Signature15SignCheckerImplE dq 0 ; DATA XREF: sub_100349A00+28↑o +__const:00000001009B2A70 ; offset to this +__const:00000001009B2A78 A8 2A 9B 00 01 00 00 00 dq offset _ZTIN9Signature15SignCheckerImplE ; `typeinfo for'Signature::SignCheckerImpl +__const:00000001009B2A80 00 0B 5B 00 01 00 00 00 dq offset sub_1005B0B00 +__const:00000001009B2A88 10 0B 5B 00 01 00 00 00 dq offset sub_1005B0B10 +__const:00000001009B2A90 80 07 5B 00 01 00 00 00 dq offset sub_1005B0780 +``` + +#### arm64 + +``` +__const:0000000100988520 ; `vtable for'Signature::SignCheckerImpl +__const:0000000100988520 00 00 00 00 00 00 00 00 _ZTVN9Signature15SignCheckerImplE DCQ 0 ; DATA XREF: sub_100369410+28↑o +__const:0000000100988520 ; offset to this +__const:0000000100988528 58 85 98 00 01 00 00 00 DCQ _ZTIN9Signature15SignCheckerImplE ; `typeinfo for'Signature::SignCheckerImpl +__const:0000000100988530 28 E9 5D 00 01 00 00 00 DCQ nullsub_201 +__const:0000000100988538 2C E9 5D 00 01 00 00 00 DCQ j___ZdlPv_267 +__const:0000000100988540 84 E5 5D 00 01 00 00 00 DCQ sub_1005DE584 +``` + +### 2.2 patch function `sub_1005B0780` + +#### x86_64 + +``` +__text:00000001005B0780 55 push rbp +__text:00000001005B0781 48 89 E5 mov rbp, rsp +__text:00000001005B0784 41 57 push r15 +__text:00000001005B0786 41 56 push r14 +__text:00000001005B0788 41 54 push r12 +__text:00000001005B078A 53 push rbx +__text:00000001005B078B 48 81 EC A0 00 00 00 sub rsp, 0A0h +__text:00000001005B0792 49 89 CE mov r14, rcx +__text:00000001005B0795 49 89 D7 mov r15, rdx +__text:00000001005B0798 49 89 F4 mov r12, rsi +__text:00000001005B079B BF D0 0A 00 00 mov edi, 0AD0h ; unsigned __int64 +__text:00000001005B07A0 E8 D7 4E 23 00 call __Znwm ; operator new(ulong) +__text:00000001005B07A5 48 89 C3 mov rbx, rax +__text:00000001005B07A8 48 89 45 A0 mov [rbp+var_60], rax +__text:00000001005B07AC 0F 28 05 DD 8F 38 00 movaps xmm0, cs:xmmword_100939790 +__text:00000001005B07B3 0F 29 45 90 movaps [rbp+var_70], xmm0 +__text:00000001005B07B7 48 8D 35 58 8F 31 00 lea rsi, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... +__text:00000001005B07BE BA CC 0A 00 00 mov edx, 0ACCh ; __n +__text:00000001005B07C3 48 89 C7 mov rdi, rax ; __dst +__text:00000001005B07C6 E8 3D 53 23 00 call _memcpy +__text:00000001005B07CB C6 83 CC 0A 00 00 00 mov byte ptr [rbx+0ACCh], 0 +__text:00000001005B07D2 48 8D BD 48 FF FF FF lea rdi, [rbp+var_B8] +__text:00000001005B07D9 48 8D 75 90 lea rsi, [rbp+var_70] +__text:00000001005B07DD E8 CE 07 00 00 call sub_1005B0FB0 +__text:00000001005B07E2 F6 45 90 01 test byte ptr [rbp+var_70], 1 +__text:00000001005B07E6 74 09 jz short loc_1005B07F1 +__text:00000001005B07E8 48 8B 7D A0 mov rdi, [rbp+var_60] ; void * +__text:00000001005B07EC E8 61 4E 23 00 call __ZdlPv ; operator delete(void *) +__text:00000001005B07F1 +``` +opcode + +``` +55 48 89 E5 41 57 41 56 41 54 53 48 81 EC A0 00 +00 00 49 89 CE 49 89 D7 49 89 F4 BF D0 0A 00 00 +E8 D7 4E 23 00 48 89 C3 48 89 45 A0 0F 28 05 DD +8F 38 00 0F 29 45 90 48 8D 35 58 8F 31 00 BA CC + +``` + +patch + +``` +6A 01 58 C3 +``` + +after + +``` +__text:00000001005B0780 sub_1005B0780 proc near ; DATA XREF: __const:00000001009B2A90↓o +__text:00000001005B0780 6A 01 push 1 +__text:00000001005B0782 58 pop rax +__text:00000001005B0783 C3 retn +__text:00000001005B0783 sub_1005B0780 endp +``` + + +#### arm64 + +``` +__text:00000001005DE584 FF 03 03 D1 SUB SP, SP, #0xC0 +__text:00000001005DE588 F6 57 09 A9 STP X22, X21, [SP,#0xB0+var_20] +__text:00000001005DE58C F4 4F 0A A9 STP X20, X19, [SP,#0xB0+var_10] +__text:00000001005DE590 FD 7B 0B A9 STP X29, X30, [SP,#0xB0+var_s0] +__text:00000001005DE594 FD C3 02 91 ADD X29, SP, #0xB0 +__text:00000001005DE598 F3 03 03 AA MOV X19, X3 +__text:00000001005DE59C F4 03 02 AA MOV X20, X2 +__text:00000001005DE5A0 F5 03 01 AA MOV X21, X1 +__text:00000001005DE5A4 00 5A 81 52 MOV W0, #0xAD0 ; unsigned __int64 +__text:00000001005DE5A8 70 C8 07 94 BL __Znwm ; operator new(ulong) +__text:00000001005DE5AC F6 03 00 AA MOV X22, X0 +__text:00000001005DE5B0 E0 2B 00 F9 STR X0, [SP,#0xB0+var_60] +__text:00000001005DE5B4 E8 10 00 B0 ADRP X8, #xmmword_1007FB2D0@PAGE +__text:00000001005DE5B8 00 B5 C0 3D LDR Q0, [X8,#xmmword_1007FB2D0@PAGEOFF] +__text:00000001005DE5BC E0 83 85 3C STUR Q0, [SP,#0xB0+var_58] +__text:00000001005DE5C0 C1 18 00 F0 21 84 25 91 ADRL X1, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... +__text:00000001005DE5C8 82 59 81 52 MOV W2, #0xACC ; __n +__text:00000001005DE5CC A7 CA 07 94 BL _memcpy +__text:00000001005DE5D0 DF 32 2B 39 STRB WZR, [X22,#0xACC] +__text:00000001005DE5D4 A0 23 01 D1 SUB X0, X29, #-var_48 +__text:00000001005DE5D8 E1 43 01 91 ADD X1, SP, #0xB0+var_60 +__text:00000001005DE5DC 00 02 00 94 BL j___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_ ; std::string::basic_string(std::string const&) +__text:00000001005DE5E0 E8 9F C1 39 LDRSB W8, [SP,#0xB0+var_58+0xF] +__text:00000001005DE5E4 68 00 F8 36 TBZ W8, #0x1F, loc_1005DE5F0 +__text:00000001005DE5E8 E0 2B 40 F9 LDR X0, [SP,#0xB0+var_60] ; void * +__text:00000001005DE5EC 4A C8 07 94 BL __ZdlPv ; operator delete(void *) +__text:00000001005DE5F0 +``` + +opcode + +``` +FF 03 03 D1 F6 57 09 A9 F4 4F 0A A9 FD 7B 0B A9 +FD C3 02 91 F3 03 03 AA F4 03 02 AA F5 03 01 AA +00 5A 81 52 70 C8 07 94 F6 03 00 AA E0 2B 00 F9 +E8 10 00 B0 00 B5 C0 3D E0 83 85 3C C1 18 00 F0 +``` + +patch + +``` +20 00 80 D2 C0 03 5F D6 +``` + +after + +``` +__text:00000001005DE584 sub_1005DE584 ; DATA XREF: __const:0000000100988540↓o +__text:00000001005DE584 20 00 80 D2 MOV X0, #1 +__text:00000001005DE588 C0 03 5F D6 RET +__text:00000001005DE588 ; End of function sub_1005DE584 +``` + +## 2. patch /usr/bin/codesign verify find string xref to "/usr/bin/codesign" @@ -39,6 +185,21 @@ __text:00000001007C92FD 85 C0 test eax, eax __text:00000001007C92FF 74 29 jz short loc_1007C932A ``` +opcode + +``` +55 48 89 E5 41 57 41 56 41 55 41 54 53 48 81 EC +38 04 00 00 4C 89 85 B8 FB FF FF 48 89 8D B0 FB +FF FF 48 89 95 A8 FB FF FF 41 89 F4 48 89 FB 48 +8B 05 7A 70 1C 00 48 8B 00 48 89 45 D0 48 8B 0D +``` + +patch + +``` +6A 01 58 C3 +``` + after ``` @@ -83,6 +244,21 @@ __text:00000001007B3A88 E0 01 00 34 CBZ __text:00000001007B3A8C ``` +opcode + +``` +FA 67 BB A9 F8 5F 01 A9 F6 57 02 A9 F4 4F 03 A9 +FD 7B 04 A9 FD 03 01 91 FF 43 11 D1 F6 03 04 AA +F7 03 03 AA F4 03 02 AA F5 03 01 AA F3 03 00 AA +C8 0D 00 B0 08 6D 41 F9 08 01 40 F9 A8 83 1B F8 +``` + +patch + +``` +20 00 80 D2 C0 03 5F D6 +``` + after ``` @@ -91,112 +267,3 @@ __text:00000001007B3A14 20 00 80 D2 MOV __text:00000001007B3A18 C0 03 5F D6 RET __text:00000001007B3A18 ; End of function sub_1007B3A14 ``` - -## 2. patch Signature::SignCheckerImpl - -### 2.1 find vtable - -x86_64 - -``` -__const:00000001009B2A70 ; `vtable for'Signature::SignCheckerImpl -__const:00000001009B2A70 00 00 00 00 00 00 00 00 _ZTVN9Signature15SignCheckerImplE dq 0 ; DATA XREF: sub_100349A00+28↑o -__const:00000001009B2A70 ; offset to this -__const:00000001009B2A78 A8 2A 9B 00 01 00 00 00 dq offset _ZTIN9Signature15SignCheckerImplE ; `typeinfo for'Signature::SignCheckerImpl -__const:00000001009B2A80 00 0B 5B 00 01 00 00 00 dq offset sub_1005B0B00 -__const:00000001009B2A88 10 0B 5B 00 01 00 00 00 dq offset sub_1005B0B10 -__const:00000001009B2A90 80 07 5B 00 01 00 00 00 dq offset sub_1005B0780 -``` - -arm64 - -``` - -``` - -### 2.2 patch function `sub_1005B0780` - -x86_64 - -``` -__text:00000001005B0780 55 push rbp -__text:00000001005B0781 48 89 E5 mov rbp, rsp -__text:00000001005B0784 41 57 push r15 -__text:00000001005B0786 41 56 push r14 -__text:00000001005B0788 41 54 push r12 -__text:00000001005B078A 53 push rbx -__text:00000001005B078B 48 81 EC A0 00 00 00 sub rsp, 0A0h -__text:00000001005B0792 49 89 CE mov r14, rcx -__text:00000001005B0795 49 89 D7 mov r15, rdx -__text:00000001005B0798 49 89 F4 mov r12, rsi -__text:00000001005B079B BF D0 0A 00 00 mov edi, 0AD0h ; unsigned __int64 -__text:00000001005B07A0 E8 D7 4E 23 00 call __Znwm ; operator new(ulong) -__text:00000001005B07A5 48 89 C3 mov rbx, rax -__text:00000001005B07A8 48 89 45 A0 mov [rbp+var_60], rax -__text:00000001005B07AC 0F 28 05 DD 8F 38 00 movaps xmm0, cs:xmmword_100939790 -__text:00000001005B07B3 0F 29 45 90 movaps [rbp+var_70], xmm0 -__text:00000001005B07B7 48 8D 35 58 8F 31 00 lea rsi, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... -__text:00000001005B07BE BA CC 0A 00 00 mov edx, 0ACCh ; __n -__text:00000001005B07C3 48 89 C7 mov rdi, rax ; __dst -__text:00000001005B07C6 E8 3D 53 23 00 call _memcpy -__text:00000001005B07CB C6 83 CC 0A 00 00 00 mov byte ptr [rbx+0ACCh], 0 -__text:00000001005B07D2 48 8D BD 48 FF FF FF lea rdi, [rbp+var_B8] -__text:00000001005B07D9 48 8D 75 90 lea rsi, [rbp+var_70] -__text:00000001005B07DD E8 CE 07 00 00 call sub_1005B0FB0 -__text:00000001005B07E2 F6 45 90 01 test byte ptr [rbp+var_70], 1 -__text:00000001005B07E6 74 09 jz short loc_1005B07F1 -__text:00000001005B07E8 48 8B 7D A0 mov rdi, [rbp+var_60] ; void * -__text:00000001005B07EC E8 61 4E 23 00 call __ZdlPv ; operator delete(void *) -__text:00000001005B07F1 -``` - -after - -``` -__text:00000001005B0780 sub_1005B0780 proc near ; DATA XREF: __const:00000001009B2A90↓o -__text:00000001005B0780 6A 01 push 1 -__text:00000001005B0782 58 pop rax -__text:00000001005B0783 C3 retn -__text:00000001005B0783 sub_1005B0780 endp -``` - -arm64 - -``` -__text:00000001005DE584 FF 03 03 D1 SUB SP, SP, #0xC0 -__text:00000001005DE588 F6 57 09 A9 STP X22, X21, [SP,#0xB0+var_20] -__text:00000001005DE58C F4 4F 0A A9 STP X20, X19, [SP,#0xB0+var_10] -__text:00000001005DE590 FD 7B 0B A9 STP X29, X30, [SP,#0xB0+var_s0] -__text:00000001005DE594 FD C3 02 91 ADD X29, SP, #0xB0 -__text:00000001005DE598 F3 03 03 AA MOV X19, X3 -__text:00000001005DE59C F4 03 02 AA MOV X20, X2 -__text:00000001005DE5A0 F5 03 01 AA MOV X21, X1 -__text:00000001005DE5A4 00 5A 81 52 MOV W0, #0xAD0 ; unsigned __int64 -__text:00000001005DE5A8 70 C8 07 94 BL __Znwm ; operator new(ulong) -__text:00000001005DE5AC F6 03 00 AA MOV X22, X0 -__text:00000001005DE5B0 E0 2B 00 F9 STR X0, [SP,#0xB0+var_60] -__text:00000001005DE5B4 E8 10 00 B0 ADRP X8, #xmmword_1007FB2D0@PAGE -__text:00000001005DE5B8 00 B5 C0 3D LDR Q0, [X8,#xmmword_1007FB2D0@PAGEOFF] -__text:00000001005DE5BC E0 83 85 3C STUR Q0, [SP,#0xB0+var_58] -__text:00000001005DE5C0 C1 18 00 F0 21 84 25 91 ADRL X1, aBeginCertifica ; "-----BEGIN CERTIFICATE-----\nMIIHzTCCBb"... -__text:00000001005DE5C8 82 59 81 52 MOV W2, #0xACC ; __n -__text:00000001005DE5CC A7 CA 07 94 BL _memcpy -__text:00000001005DE5D0 DF 32 2B 39 STRB WZR, [X22,#0xACC] -__text:00000001005DE5D4 A0 23 01 D1 SUB X0, X29, #-var_48 -__text:00000001005DE5D8 E1 43 01 91 ADD X1, SP, #0xB0+var_60 -__text:00000001005DE5DC 00 02 00 94 BL j___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_ ; std::string::basic_string(std::string const&) -__text:00000001005DE5E0 E8 9F C1 39 LDRSB W8, [SP,#0xB0+var_58+0xF] -__text:00000001005DE5E4 68 00 F8 36 TBZ W8, #0x1F, loc_1005DE5F0 -__text:00000001005DE5E8 E0 2B 40 F9 LDR X0, [SP,#0xB0+var_60] ; void * -__text:00000001005DE5EC 4A C8 07 94 BL __ZdlPv ; operator delete(void *) -__text:00000001005DE5F0 -``` - -after - -``` -__text:00000001005DE584 sub_1005DE584 ; DATA XREF: __const:0000000100988540↓o -__text:00000001005DE584 20 00 80 D2 MOV X0, #1 -__text:00000001005DE588 C0 03 5F D6 RET -__text:00000001005DE588 ; End of function sub_1005DE584 -``` diff --git a/readme.md b/readme.md index a40b5a6..273f5e2 100644 --- a/readme.md +++ b/readme.md @@ -1,53 +1,39 @@ # Parallels Desktop Crack -Crack for Parallels Desktop. +Crack for Parallels Desktop 18.0.1-53056 - [x] Support Intel -- [ ] Support Apple Silicon (M1) -- [ ] Network -- [ ] USB +- [x] Support Apple Silicon (M1) +- [x] Network +- [x] USB -# Apple Silicon (M1) & Network & USB problem +# Usage -Parallels Desktop new version use Apple's hypervisor framework vmnet API need a paid Developer ID and request to Apple enable vmnet access permission. +run install.sh -Parallels Desktop M1 version only support Apple's hypervisor framework. +# Manual -I don't know how to bypass it. So this crack version not support M1. - -But Intel version have a temp solution: +1. Exit Parallels Desktop ``` killall -9 prl_client_app -sudo sed -i '' 's|.*|0|' /Library/Preferences/Parallels/network.desktop.xml -sudo sed -i '' 's|.*|1|' /Library/Preferences/Parallels/dispatcher.desktop.xml +killall -9 prl_disp_service ``` -After this, network will work, USB only work with storage device. - - -# Build +2. Copy crack file ``` -./scripts/build.bat +sudo copy -f prl_disp_service "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" ``` - -# Install & Test +3. Copy licenses.json ``` -sudo ./scripts/install.sh +sudo echo '{"license":"{\\"product_version\\":\\"18.*\\",\\"edition\\":2,\\"platform\\":3,\\"product\\":7,\\"offline\\":true,\\"cpu_limit\\":32,\\"ram_limit\\":131072}"}' > "/Library/Preferences/Parallels/licenses.json" ``` - -# Publish DMG +4. Sign ``` -brew install create-dmg -./scripts/publish.sh +sudo codesign -f -s - --timestamp=none --all-architectures --entitlements ParallelsService.entitlements "/Applications/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" ``` - -You can found packaged dmg file in `publish` folder. - -Good Luck! - diff --git a/scripts/build.sh b/scripts/build.sh deleted file mode 100644 index 99b928e..0000000 --- a/scripts/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) -ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) - -cmake -S "${ROOT_PATH}" -B "${ROOT_PATH}/build" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="11.0" \ -&& \ -cmake --build "${ROOT_PATH}/build" --target UIWarp -j8 \ -&& echo "[*] Build Success" diff --git a/scripts/insert_dylib b/scripts/insert_dylib deleted file mode 100644 index 6b8f1f4..0000000 Binary files a/scripts/insert_dylib and /dev/null differ diff --git a/scripts/install.sh b/scripts/install.sh index 1f96a3e..39cbf83 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -4,17 +4,10 @@ CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) PTFM_APP_DIR="/Applications/Parallels Toolbox.app" PDFM_APP_DIR="/Applications/Parallels Desktop.app" -CRACK_LIB="${ROOT_PATH}/build/libUIWarp.dylib" -CRACK_LIB_DST_NAME="libUIWarp" - CODESIGN_CERT=- -if [ -n "$(security find-identity -v -p codesigning | grep 6E7BDDB56DD3D9C35A1EAFC787040ADF426EE7F2)" ]; then - CODESIGN_CERT=6E7BDDB56DD3D9C35A1EAFC787040ADF426EE7F2 -fi - function sign_cmd() { - codesign -f -s ${CODESIGN_CERT} --all-architectures --deep "$@" + codesign -f -s ${CODESIGN_CERT} --timestamp=none --all-architectures --deep "$@" } function kill_ptfm_app() { @@ -25,135 +18,25 @@ function kill_pdfm_app() { killall -9 prl_client_app 2> /dev/null } -function apply_ptfm_crack() { - echo "[*] Apply patch" - - if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then - /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" > /dev/null - fi - - RPATH="@rpath/${CRACK_LIB_DST_NAME}.dylib" - DST="${PTFM_APP_DIR}/Contents/Frameworks/${CRACK_LIB_DST_NAME}.dylib" - LOADER="${PTFM_APP_DIR}/Contents/Frameworks/libLogging.dylib" - - if ! grep -q "${RPATH}" "${LOADER}"; then - echo "[*] insert_dylib \"${LOADER}\"" - "${CUR_PATH}/insert_dylib" --inplace --overwrite --no-strip-codesig --all-yes \ - "${RPATH}" "${LOADER}" > /dev/null - fi - echo "[*] Copy \"${CRACK_LIB}\" to \"${DST}\"" - cp -f -X "${CRACK_LIB}" "${DST}" > /dev/null -} - function apply_pdfm_crack() { echo "[*] Apply patch" - if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then - /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" > /dev/null - fi + SRC="${ROOT_PATH}/crack/pdfm-18.0.1.53056/prl_client_app" + DST="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/prl_client_app" + echo "[*] Copy \"${SRC}\" to \"${DST}\"" + cp -f -X "${SRC}" "${DST}" > /dev/null - RPATH="@rpath/${CRACK_LIB_DST_NAME}.dylib" - DST="${PDFM_APP_DIR}/Contents/Frameworks/${CRACK_LIB_DST_NAME}.dylib" - LOADER="${PDFM_APP_DIR}/Contents/Frameworks/QtXml.framework/Versions/5/QtXml" - - if ! grep -q "${RPATH}" "${LOADER}"; then - echo "[*] insert_dylib \"${LOADER}\"" - "${CUR_PATH}/insert_dylib" --inplace --overwrite --no-strip-codesig --all-yes \ - "${RPATH}" "${LOADER}" > /dev/null - fi - echo "[*] Copy \"${CRACK_LIB}\" to \"${DST}\"" - cp -f -X "${CRACK_LIB}" "${DST}" > /dev/null -} - -function sign_ptfm() { - echo "[*] Sign Parallels Toolbox App" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Airplane Mode.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Alarm.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Archive.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Barcode Generator.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Barcode Reader.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Break Time.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/CPU Temperature.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Capture Area.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Capture Screen.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Capture Window.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Clean Drive.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Clipboard History.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Convert Video.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Date Countdown.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Do Not Disturb.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Do Not Sleep.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Download Audio.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Download Video.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Eject Volumes.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Encrypt Files.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Energy Saver.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Find Duplicates.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Focus on Window.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Free Memory.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Hidden Files.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Hide Desktop Files.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Hide Menu Icons.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Launch.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Lock Screen.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Make GIF.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Mute Microphone.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Parallels Tool Launcher.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Presentation Mode.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Recognize Text.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Record Area.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Record Audio.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Record Screen.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Record Window.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Resize Images.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Screenshot Page.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Show Desktop.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Sleep Timer.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Stopwatch.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Switch Resolution.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Take Photo.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Take Video.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Timer.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Transform Text.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Unarchive.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Uninstall Apps.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Unit Converter.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Verify Checksum.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/Window Manager.app" - sign_cmd "${PTFM_APP_DIR}/Contents/Applications/World Time.app" - sign_cmd "${PTFM_APP_DIR}/Parallels Toolbox.app" + SRC="${ROOT_PATH}/crack/pdfm-18.0.1.53056/prl_disp_service" + DST="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" + echo "[*] Copy \"${SRC}\" to \"${DST}\"" + cp -f -X "${SRC}" "${DST}" > /dev/null } function sign_pdfm() { echo "[*] Sign Parallels Desktop App" - sign_cmd "${PDFM_APP_DIR}/Contents/Library/QuickLook/ExeQL.qlgenerator" - sign_cmd "${PDFM_APP_DIR}/Contents/Library/QuickLook/ParallelsQL.qlgenerator" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/launchd_wrapper" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/libprl_shared_apps.dylib" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/lua/ssl.so" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/lua/mime/core.so" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/lua/socket/core.so" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/lua/socket/serial.so" - sign_cmd "${PDFM_APP_DIR}/Contents/Resources/lua/socket/unix.so" - sign_cmd "${PDFM_APP_DIR}/Contents/Applications/Parallels Link.app" - sign_cmd "${PDFM_APP_DIR}/Contents/Applications/Parallels Mounter.app" - sign_cmd "${PDFM_APP_DIR}/Contents/Applications/Parallels Technical Data Reporter.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsMacVM.entitlements" "${PDFM_APP_DIR}/Contents/MacOS/Parallels Mac VM.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsService.entitlements" "${PDFM_APP_DIR}/Contents/MacOS/Parallels Service.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsVM1014.entitlements" "${PDFM_APP_DIR}/Contents/MacOS/Parallels VM 10.14.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsVM.entitlements" "${PDFM_APP_DIR}/Contents/MacOS/Parallels VM.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsDesktop.entitlements" "${PDFM_APP_DIR}" + sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsService.entitlements" "${PDFM_APP_DIR}/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" } -if [ -d "${PTFM_APP_DIR}" ]; then - echo "[*] Install Parallels Toolbox patch" - kill_ptfm_app - apply_ptfm_crack - sign_ptfm -else - echo "[*] not found ${PTFM_APP_DIR}, skip." -fi - if [ -d "${PDFM_APP_DIR}" ]; then echo "[*] Install Parallels Desktop patch" kill_pdfm_app diff --git a/scripts/publish.sh b/scripts/publish.sh index 099caa9..58c2d1e 100644 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -22,18 +22,11 @@ PDFM_PUBLISH_FILE="${PUBLISH_PATH}/ParallelsDesktop-${PDFM_VERSION}_Crack.dmg" CODESIGN_CERT=- -if [ -n "$(security find-identity -v -p codesigning | grep 6E7BDDB56DD3D9C35A1EAFC787040ADF426EE7F2)" ]; then - CODESIGN_CERT=6E7BDDB56DD3D9C35A1EAFC787040ADF426EE7F2 -fi - -CRACK_LIB_DST_NAME="libUIWarp" -CRACK_LIB="${ROOT_PATH}/build/${CRACK_LIB_DST_NAME}.dylib" - PTFM_TMP_DIR="${TEMP_PATH}/ptfm_files" PDFM_TMP_DIR="${TEMP_PATH}/pdfm_files" function sign_cmd() { - codesign -f -s ${CODESIGN_CERT} --all-architectures --deep "$@" + codesign -f -s ${CODESIGN_CERT} --timestamp=none --all-architectures --deep "$@" } function ensure_download_ptfm_dmg() { @@ -123,25 +116,14 @@ function apply_ptfm_crack() { function apply_pdfm_crack() { echo "[*] Apply patch" - if [ -f /usr/local/opt/llvm/bin/llvm-strip ]; then - /usr/local/opt/llvm/bin/llvm-strip -s "${CRACK_LIB}" > /dev/null - fi - - RPATH="@rpath/${CRACK_LIB_DST_NAME}.dylib" - DST="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Frameworks/${CRACK_LIB_DST_NAME}.dylib" - LOADER="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Frameworks/QtXml.framework/Versions/5/QtXml" - - "${CUR_PATH}/insert_dylib" --inplace --overwrite --no-strip-codesig --all-yes \ - "${RPATH}" "${LOADER}" > /dev/null - - cp -f -X "${CRACK_LIB}" "${DST}" > /dev/null - SRC="${ROOT_PATH}/crack/pdfm-18.0.1.53056/prl_client_app" DST="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/prl_client_app" + echo "[*] Copy \"${SRC}\" to \"${DST}\"" cp -f -X "${SRC}" "${DST}" > /dev/null SRC="${ROOT_PATH}/crack/pdfm-18.0.1.53056/prl_disp_service" DST="${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" + echo "[*] Copy \"${SRC}\" to \"${DST}\"" cp -f -X "${SRC}" "${DST}" > /dev/null } @@ -207,25 +189,8 @@ function sign_ptfm() { function sign_pdfm() { echo "[*] Sign Parallels Desktop App" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Library/QuickLook/ExeQL.qlgenerator" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Library/QuickLook/ParallelsQL.qlgenerator" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/launchd_wrapper" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/libprl_shared_apps.dylib" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/lua/ssl.so" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/lua/mime/core.so" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/lua/socket/core.so" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/lua/socket/serial.so" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Resources/lua/socket/unix.so" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Link.app" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Mounter.app" - sign_cmd "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/Applications/Parallels Technical Data Reporter.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsMacVM.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Mac VM.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsService.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsVM1014.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels VM 10.14.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsVM.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels VM.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsDesktop.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app" - sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsDesktop.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app" - sign_cmd "${PDFM_TMP_DIR}/Install.app" + sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsService.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" + sign_cmd --entitlements "${ROOT_PATH}/entitlements/ParallelsDesktop/ParallelsService.entitlements" "${PDFM_TMP_DIR}/Parallels Desktop.app/Contents/MacOS/Parallels Service.app/Contents/MacOS/prl_disp_service" } function set_pdfm_app_hide() { diff --git a/scripts/rebuild.sh b/scripts/rebuild.sh deleted file mode 100644 index edaa333..0000000 --- a/scripts/rebuild.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -CUR_PATH=$(cd "$(dirname $(readlink -f "$0"))" && pwd) -ROOT_PATH=$(cd "${CUR_PATH}/../" && pwd) - -if [ -d "${ROOT_PATH}/build" ]; then - rm -rf "${ROOT_PATH}/build" > /dev/null -fi - -exec "${CUR_PATH}/build.sh" diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 2b0abe0..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,336 +0,0 @@ - -// hack to use objc_msgSend -#define _OBJC_MESSAGE_H - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#define JM_XORSTR_DISABLE_AVX_INTRINSICS -#include "xorstr.hpp" - - -OBJC_EXPORT id _Nullable -objc_msgSend(id _Nullable self, SEL _Nonnull op, ...) - OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); - - -#if defined(_M_X64) || defined(__x86_64__) -#define TARGET_ARCH_X64 1 -#elif defined(__AARCH64EL__) -#define TARGET_ARCH_ARM64 1 -#else -#error unsupported arch -#endif - -// #define ENABLE_DLOG 1 - -#if defined(ENABLE_DLOG) -#define dlog(format, ...) { os_log(OS_LOG_DEFAULT, "[PARALLELS_PATCH_LOG] " format, ##__VA_ARGS__); } -#else -#define dlog(format, ...) -#endif - -id vars_g_static_class = nullptr; - -bool str_ends_with(const char* a1, const char* a2) { - auto a1_len = strlen(a1); - auto a2_len = strlen(a2); - if (a1_len < a2_len) return false; - return 0 == strcmp(a1 + a1_len - a2_len, a2); -} - -void func_write_fake_license() -{ - unsigned char fake_license_data[829] = { - 0xA1, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xB6, 0xB3, 0xB9, 0xBF, 0xB4, 0xA9, 0xBF, 0xF8, 0xE0, - 0xFA, 0xF8, 0xA1, 0x86, 0xF8, 0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, 0xB6, - 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, 0xAF, 0xB3, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, - 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB6, 0xB3, 0xB9, 0x85, 0xB1, 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, - 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x85, - 0xAC, 0xBF, 0xA8, 0xA9, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xEB, 0xE2, 0xF4, - 0xF0, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAF, 0xAA, 0xBD, 0xA8, 0xBB, 0xBE, - 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, - 0x85, 0xA9, 0xAF, 0xB8, 0xB6, 0xB3, 0xB9, 0xBF, 0xB4, 0xA9, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, - 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xBB, 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xB1, - 0xBF, 0xA3, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, 0xB6, 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xBB, - 0xA8, 0xBF, 0xB4, 0xAE, 0x85, 0xAF, 0xAF, 0xB3, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xB4, 0xAF, 0xB6, - 0xB6, 0xF6, 0xFA, 0x86, 0xF8, 0xB7, 0xBB, 0xB3, 0xB4, 0x85, 0xAA, 0xBF, 0xA8, 0xB3, 0xB5, 0xBE, - 0x85, 0xBF, 0xB4, 0xBE, 0xA9, 0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0xE8, 0xEA, - 0xE3, 0xE3, 0xF7, 0xEA, 0xE3, 0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, 0xEA, 0xE0, 0xEA, - 0xEA, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBD, 0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, - 0xB3, 0xB5, 0xBE, 0x85, 0xBF, 0xB4, 0xBE, 0xA9, 0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, - 0xF8, 0xE8, 0xEA, 0xE3, 0xE3, 0xF7, 0xEA, 0xE3, 0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, - 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBB, 0xAF, 0xAE, - 0xB5, 0x85, 0xA8, 0xBF, 0xB4, 0xBF, 0xAD, 0xBB, 0xB8, 0xB6, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, - 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB4, 0xBC, 0xA8, 0x86, 0xF8, - 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xB8, 0xBF, - 0xAE, 0xBB, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, - 0xA9, 0x85, 0xB9, 0xB2, 0xB3, 0xB4, 0xBB, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, - 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xA9, 0xAF, 0xA9, 0xAA, 0xBF, 0xB4, 0xBE, 0xBF, 0xBE, - 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, - 0xBF, 0xA2, 0xAA, 0xB3, 0xA8, 0xBF, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, - 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xBD, 0xA8, 0xBB, 0xB9, 0xBF, 0x85, 0xAA, 0xBF, 0xA8, - 0xB3, 0xB5, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, - 0xB3, 0xA9, 0x85, 0xAA, 0xAF, 0xA8, 0xB9, 0xB2, 0xBB, 0xA9, 0xBF, 0xBE, 0x85, 0xB5, 0xB4, 0xB6, - 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xF6, 0xFA, 0x86, 0xF8, - 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xEB, 0xEA, 0xF6, 0xFA, 0x86, 0xF8, 0xAF, - 0xA9, 0xBB, 0xBD, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xEB, 0xF6, 0xFA, 0x86, 0xF8, 0xBF, 0xBE, 0xB3, - 0xAE, 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, 0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xB6, 0xBB, - 0xAE, 0xBC, 0xB5, 0xA8, 0xB7, 0x86, 0xF8, 0xE0, 0xFA, 0xE9, 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, - 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xED, 0xF6, 0xFA, 0x86, 0xF8, 0xB5, 0xBC, - 0xBC, 0xB6, 0xB3, 0xB4, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, 0xAE, 0xA8, 0xAF, 0xBF, 0xF6, 0xFA, 0x86, - 0xF8, 0xB9, 0xAA, 0xAF, 0x85, 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0xE9, 0xE8, - 0xF6, 0xFA, 0x86, 0xF8, 0xA8, 0xBB, 0xB7, 0x85, 0xB6, 0xB3, 0xB7, 0xB3, 0xAE, 0x86, 0xF8, 0xE0, - 0xFA, 0xEB, 0xE9, 0xEB, 0xEA, 0xED, 0xE8, 0xF6, 0xFA, 0x86, 0xF8, 0xB2, 0xB5, 0xA9, 0xAE, 0xA9, - 0x86, 0xF8, 0xE0, 0xFA, 0x81, 0xA1, 0x86, 0xF8, 0xB4, 0xBB, 0xB7, 0xBF, 0x86, 0xF8, 0xE0, 0xFA, - 0x86, 0xF8, 0x9D, 0x9E, 0x8A, 0x88, 0x85, 0x92, 0x93, 0x9E, 0x9E, 0x9F, 0x94, 0x86, 0xF8, 0xF6, - 0xFA, 0x86, 0xF8, 0xB2, 0xAD, 0x85, 0xB3, 0xBE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, - 0xF6, 0xFA, 0x86, 0xF8, 0xAA, 0xA8, 0xB5, 0xBE, 0xAF, 0xB9, 0xAE, 0x85, 0xAC, 0xBF, 0xA8, 0xA9, - 0xB3, 0xB5, 0xB4, 0x86, 0xF8, 0xE0, 0xFA, 0x86, 0xF8, 0x86, 0xF8, 0xF6, 0xFA, 0x86, 0xF8, 0xBB, - 0xB9, 0xAE, 0xB3, 0xAC, 0xBB, 0xAE, 0xBF, 0xBE, 0x85, 0xBB, 0xAE, 0x86, 0xF8, 0xE0, 0xFA, 0x86, - 0xF8, 0xE8, 0xEA, 0xE8, 0xEB, 0xF7, 0xEA, 0xEF, 0xF7, 0xEA, 0xE3, 0xFA, 0xEA, 0xEA, 0xE0, 0xEA, - 0xEA, 0xE0, 0xEA, 0xEA, 0x86, 0xF8, 0xA7, 0x87, 0xF6, 0xFA, 0x86, 0xF8, 0xB3, 0xA9, 0x85, 0xAE, - 0xA8, 0xB3, 0xBB, 0xB6, 0x86, 0xF8, 0xE0, 0xFA, 0xBC, 0xBB, 0xB6, 0xA9, 0xBF, 0xA7, 0xF8, 0xF6, - 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xAA, 0xAF, 0xB8, 0xB6, 0xB3, 0xB9, 0x99, 0xBF, 0xA8, 0xAE, - 0xA9, 0xF8, 0xE0, 0xFA, 0xF8, 0xF8, 0xF6, 0xD0, 0xFA, 0xFA, 0xFA, 0xFA, 0xF8, 0xA9, 0xB3, 0xBD, - 0xB4, 0xBB, 0xAE, 0xAF, 0xA8, 0xBF, 0xF8, 0xE0, 0xFA, 0xF8, 0xF8, 0xD0, 0xA7 - }; - - // const char* fake_license_data = "{\n "license": "{\\"name\\": null, \\"uuid\\": \\"\\", \\"lic_key\\": \\"\\", \\"product_version\\": \\"18.*\\", \\"is_upgrade\\": false, \\"is_sublicense\\": false, \\"parent_key\\": null, \\"parent_uuid\\": null, \\"main_period_ends_at\\": \\"2099-09-09 00:00:00\\", \\"grace_period_ends_at\\": \\"2099-09-09 00:00:00\\", \\"is_auto_renewable\\": false, \\"is_nfr\\": false, \\"is_beta\\": false, \\"is_china\\": false, \\"is_suspended\\": false, \\"is_expired\\": false, \\"is_grace_period\\": false, \\"is_purchased_online\\": false, \\"limit\\": 10, \\"usage\\": 1, \\"edition\\": 2, \\"platform\\": 3, \\"product\\": 7, \\"offline\\": true, \\"cpu_limit\\": 32, \\"ram_limit\\": 131072, \\"hosts\\": [{\\"name\\": \\"GDPR_HIDDEN\\", \\"hw_id\\": \\"\\", \\"product_version\\": \\"\\", \\"activated_at\\": \\"2021-05-09 00:00:00\\"}], \\"is_trial\\": false}",\n "publicCerts": "",\n "signature": ""\n}"; - - auto file = fopen(xorstr_("/Library/Preferences/Parallels/licenses.json"), xorstr_("wb")); - if (file) - { - for(int i = 0; i < sizeof(fake_license_data); i++) - fake_license_data[i] ^= 0xda; - fseek(file, 0, 0); - fwrite(fake_license_data, sizeof(fake_license_data), 1, file); - fclose(file); - for(int i = 0; i < sizeof(fake_license_data); i++) - fake_license_data[i] = 0; - dlog("[+] write fake license to (/Library/Preferences/Parallels/licenses.json)"); - } - else - { - dlog("[-] open fail. (/Library/Preferences/Parallels/licenses.json)"); - } - -} - -void func_patch_prl_disp_service() -{ - func_write_fake_license(); -} - -void func_hook_applicationDidBecomeActive(id, SEL) -{ - dlog("[+] enter hookapplicationDidBecomeActive."); - - // @autoreleasepool { - // auto main_menu = [[NSApplication sharedApplication] mainMenu]; - // auto main_menu_count = [main_menu numberOfItems]; - // if (main_menu_count) { - // auto main_menu_last = [main_menu itemAtIndex:main_menu_count-1]; - // if ([main_menu_last hasSubmenu]) { - // auto menu_1 = [NSMenuItem separatorItem]; - // auto menu_2 = [[NSMenuItem alloc] init]; - // - // auto title = [NSString stringWithUTF8String:xorstr_("K'ed by day")]; - // [menu_2 setTitle:title]; - // - // auto sub_menu = [main_menu_last submenu]; - // [sub_menu addItem:menu_1]; - // [sub_menu addItem:menu_2]; - // } - // } - // } - - auto cls_NSApplication = (id)objc_getClass(xorstr_("NSApplication")); - if (!cls_NSApplication) { - dlog("[-] get class NSApplication fail"); - return; - } - dlog("[+] get class NSApplication success"); - auto cls_NSMenuItem = (id)objc_getClass(xorstr_("NSMenuItem")); - if (!cls_NSMenuItem) { - dlog("[-] get class NSMenuItem fail"); - return; - } - dlog("[+] get class NSMenuItem success"); - auto cls_NSString = (id)objc_getClass(xorstr_("NSString")); - if (!cls_NSString) { - dlog("[-] get class NSString fail"); - return; - } - dlog("[+] get class NSString success"); - - auto sel_sharedApplication = sel_registerName(xorstr_("sharedApplication")); - auto sel_mainMenu = sel_registerName(xorstr_("mainMenu")); - auto sel_numberOfItems = sel_registerName(xorstr_("numberOfItems")); - auto sel_itemAtIndex = sel_registerName(xorstr_("itemAtIndex:")); - auto sel_hasSubmenu = sel_registerName(xorstr_("hasSubmenu")); - auto sel_separatorItem = sel_registerName(xorstr_("separatorItem")); - auto sel_alloc = sel_registerName(xorstr_("alloc")); - auto sel_init = sel_registerName(xorstr_("init")); - auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:")); - auto sel_setTitle = sel_registerName(xorstr_("setTitle:")); - auto sel_submenu = sel_registerName(xorstr_("submenu")); - auto sel_addItem = sel_registerName(xorstr_("addItem:")); - - auto cls_sharedApplication = (id)objc_msgSend(cls_NSApplication, sel_sharedApplication); - if (!cls_sharedApplication) { - dlog("[-] [NSApplication sharedApplication] fail"); - return; - } - dlog("[+] [NSApplication sharedApplication] success"); - auto cls_mainMenu = (id)objc_msgSend(cls_sharedApplication, sel_mainMenu); - if (!cls_mainMenu) { - dlog("[-] [sharedApplication mainMenu] fail"); - return; - } - dlog("[+] [sharedApplication mainMenu] success"); - int main_menu_count = (int)(intptr_t)objc_msgSend(cls_mainMenu, sel_numberOfItems); - dlog("[*] mainMenu count: %d", main_menu_count); - if (main_menu_count > 0) { - auto cls_menu_last = (id)objc_msgSend(cls_mainMenu, sel_itemAtIndex, main_menu_count - 1); - if (!cls_menu_last) { - dlog("[-] [mainMenu itemAtIndex: %d] fail", main_menu_count - 1); - return; - } - dlog("[+] [mainMenu itemAtIndex: %d] success", main_menu_count - 1); - - bool menu_last_hassubmenu = (bool)objc_msgSend(cls_menu_last, sel_hasSubmenu); - dlog("[*] hasSubmenu: %d", menu_last_hassubmenu? 1 : 0); - if (menu_last_hassubmenu) { - auto cls_menu_1 = (id)objc_msgSend(cls_NSMenuItem, sel_separatorItem); - auto cls_menu_2 = (id)objc_msgSend((id)objc_msgSend(cls_NSMenuItem, sel_alloc), sel_init); - if (!cls_menu_1) { - dlog("[-] [NSMenuItem separatorItem] fail"); - return; - } - dlog("[+] [NSMenuItem separatorItem] success"); - if (!cls_menu_2) { - dlog("[-] [[NSMenuItem alloc] init] fail"); - return; - } - dlog("[+] [[NSMenuItem alloc] init] success"); - - auto title = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("K'ed by Day")); - if (!title) { - dlog("[-] [NSString stringWithUTF8String] fail"); - return; - } - dlog("[+] [NSString stringWithUTF8String] success"); - objc_msgSend(cls_menu_2, sel_setTitle, title); - - auto sub_menu = (id)objc_msgSend(cls_menu_last, sel_submenu); - if (!sub_menu) { - dlog("[-] [menu submenu] fail"); - return; - } - dlog("[+] [menu submenu] success"); - objc_msgSend(sub_menu, sel_addItem, cls_menu_1); - objc_msgSend(sub_menu, sel_addItem, cls_menu_2); - dlog("[+] add menu success"); - } - } - - auto file_path = xorstr_("/Library/Preferences/Parallels/licenses.json"); - auto file = fopen(file_path, xorstr_("wb")); - if (file) { - dlog("[*] write empty license data."); - auto content = xorstr_("{\n \"license\": \"\",\n \"signature\": \"\"\n}"); - fseek(file, 0, 0); - fwrite(content, strlen(content), 1, file); - fclose(file); - } -} - -void func_hook_menu() -{ - auto cls_NSObject = (id)objc_getMetaClass(xorstr_("NSObject")); - if(!cls_NSObject) { - dlog("[-] get class NSObject fail"); - return; - } - auto sel_applicationDidBecomeActive = sel_registerName(xorstr_("applicationDidBecomeActive:")); - if ( !class_addMethod((Class)cls_NSObject, sel_applicationDidBecomeActive, (IMP)func_hook_applicationDidBecomeActive, xorstr_("n")) ) { - dlog("[-] class_addMethod applicationDidBecomeActive fail."); - return; - } - dlog("[+] class_addMethod applicationDidBecomeActive success."); - - auto cls_NSNotificationCenter = (id)objc_getClass(xorstr_("NSNotificationCenter")); - if (!cls_NSNotificationCenter) { - dlog("[-] get class NSNotificationCenter fail"); - return; - } - auto cls_NSString = (id)objc_getClass(xorstr_("NSString")); - if (!cls_NSString) { - dlog("[-] get class NSString fail"); - return; - } - - auto sel_defaultCenter = sel_registerName(xorstr_("defaultCenter")); - auto sel_stringWithUTF8String = sel_registerName(xorstr_("stringWithUTF8String:")); - auto sel_addObserver = sel_registerName(xorstr_("addObserver:selector:name:object:")); - auto sel_class = sel_registerName(xorstr_("class")); - - auto cls_defaultCenter = (id)objc_msgSend(cls_NSNotificationCenter, sel_defaultCenter); - if (!cls_defaultCenter) { - dlog("[-] [NSNotificationCenter defaultCenter] fail"); - return; - } - - auto cls_name = (id)objc_msgSend(cls_NSString, sel_stringWithUTF8String, xorstr_("NSApplicationDidFinishLaunchingNotification")); - if (!cls_name) { - dlog("[-] [NSString stringWithUTF8String] fail"); - return; - } - - if (nullptr == vars_g_static_class) { - auto sel_alloc = sel_registerName(xorstr_("alloc")); - id v = (id)objc_msgSend(cls_NSObject, sel_alloc); - vars_g_static_class = v; - } - - objc_msgSend(cls_defaultCenter, sel_addObserver, vars_g_static_class, sel_applicationDidBecomeActive, cls_name, 0); - dlog("[+] addObserver success"); -} - -__attribute__((constructor)) -void func_load() -{ - const char *moduleName = _dyld_get_image_name(0); - dlog("[*] load %s", moduleName); - - if (str_ends_with(moduleName, xorstr_("prl_disp_service"))) - { - dlog("patch prl_disp_service start"); - func_patch_prl_disp_service(); - dlog("patch prl_disp_service over"); - } - - func_hook_menu(); -} diff --git a/src/xorstr.hpp b/src/xorstr.hpp deleted file mode 100644 index 50ddeec..0000000 --- a/src/xorstr.hpp +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2017 - 2021 Justas Masiulis - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef JM_XORSTR_HPP -#define JM_XORSTR_HPP - -#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) -#include -#elif defined(_M_X64) || defined(__amd64__) || defined(_M_IX86) || defined(__i386__) -#include -#else -#error Unsupported platform -#endif - -#include -#include -#include -#include - -#define xorstr(str) ::OqYAfkhl::swG([]() { return str; }, std::integral_constant{}, std::make_index_sequence<::OqYAfkhl::CtKWt::UfWL()>{}) -#define xorstr_(str) xorstr(str).Pr() - -#ifdef _MSC_VER -#define XORSTR_FORCEINLINE __forceinline -#else -#define XORSTR_FORCEINLINE __attribute__((always_inline)) inline -#endif - -namespace OqYAfkhl { - - namespace CtKWt { - - template - XORSTR_FORCEINLINE constexpr std::size_t UfWL() - { - return ((Size / 16) + (Size % 16 != 0)) * 2; - } - - template - XORSTR_FORCEINLINE constexpr std::uint32_t rY() noexcept - { - std::uint32_t value = Seed; - for(char c : __TIME__) - value = static_cast((value ^ c) * 16777619ull); - return value; - } - - template - XORSTR_FORCEINLINE constexpr std::uint64_t WL() - { - constexpr auto first_part = rY<2166136261 + S>(); - constexpr auto second_part = rY(); - return (static_cast(first_part) << 32) | second_part; - } - - // loads up to 8 characters of string into uint64 and xors it with the key - template - XORSTR_FORCEINLINE constexpr std::uint64_t - EE(std::uint64_t key, std::size_t idx, const CharT* str) noexcept - { - using cast_type = typename std::make_unsigned::type; - constexpr auto value_size = sizeof(CharT); - constexpr auto idx_offset = 8 / value_size; - - std::uint64_t value = key; - for(std::size_t i = 0; i < idx_offset && i + idx * idx_offset < N; ++i) - value ^= - (std::uint64_t{ static_cast(str[i + idx * idx_offset]) } - << ((i % idx_offset) * 8 * value_size)); - - return value; - } - - // forces compiler to use registers instead of stuffing constants in rdata - XORSTR_FORCEINLINE std::uint64_t Fw(std::uint64_t value) noexcept - { -#if defined(__clang__) || defined(__GNUC__) - asm("" : "=r"(value) : "0"(value) :); - return value; -#else - volatile std::uint64_t reg = value; - return reg; -#endif - } - - } // namespace detail - - template - class swG; - - template - class swG, std::index_sequence> { -#ifndef JM_XORSTR_DISABLE_AVX_INTRINSICS - constexpr static inline std::uint64_t alignment = ((Size > 16) ? 32 : 16); -#else - constexpr static inline std::uint64_t alignment = 16; -#endif - - alignas(alignment) std::uint64_t _storage[sizeof...(Keys)]; - - public: - using value_type = CharT; - using size_type = std::size_t; - using pointer = CharT*; - using const_pointer = const CharT*; - - template - XORSTR_FORCEINLINE swG(L l, std::integral_constant, std::index_sequence) noexcept - : _storage{ ::OqYAfkhl::CtKWt::Fw((std::integral_constant(Keys, Indices, l())>::value))... } - {} - - XORSTR_FORCEINLINE constexpr size_type size() const noexcept - { - return Size - 1; - } - - XORSTR_FORCEINLINE void fO() noexcept - { - // everything is inlined by hand because a certain compiler with a certain linker is _very_ slow -#if defined(__clang__) - alignas(alignment) - std::uint64_t arr[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; - std::uint64_t* keys = - (std::uint64_t*)::OqYAfkhl::CtKWt::Fw((std::uint64_t)arr); -#else - alignas(alignment) std::uint64_t keys[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; -#endif - -#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) -#if defined(__clang__) - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : __builtin_neon_vst1q_v( - reinterpret_cast(_storage) + Indices * 2, - veorq_u64(__builtin_neon_vld1q_v(reinterpret_cast(_storage) + Indices * 2, 51), - __builtin_neon_vld1q_v(reinterpret_cast(keys) + Indices * 2, 51)), - 51)), ...); -#else // GCC, MSVC - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : vst1q_u64( - reinterpret_cast(_storage) + Indices * 2, - veorq_u64(vld1q_u64(reinterpret_cast(_storage) + Indices * 2), - vld1q_u64(reinterpret_cast(keys) + Indices * 2)))), ...); -#endif -#elif !defined(JM_XORSTR_DISABLE_AVX_INTRINSICS) - ((Indices >= sizeof(_storage) / 32 ? static_cast(0) : _mm256_store_si256( - reinterpret_cast<__m256i*>(_storage) + Indices, - _mm256_xor_si256( - _mm256_load_si256(reinterpret_cast(_storage) + Indices), - _mm256_load_si256(reinterpret_cast(keys) + Indices)))), ...); - - if constexpr(sizeof(_storage) % 32 != 0) - _mm_store_si128( - reinterpret_cast<__m128i*>(_storage + sizeof...(Keys) - 2), - _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage + sizeof...(Keys) - 2)), - _mm_load_si128(reinterpret_cast(keys + sizeof...(Keys) - 2)))); -#else - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : _mm_store_si128( - reinterpret_cast<__m128i*>(_storage) + Indices, - _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage) + Indices), - _mm_load_si128(reinterpret_cast(keys) + Indices)))), ...); -#endif - } - - XORSTR_FORCEINLINE const_pointer Ce() const noexcept - { - return reinterpret_cast(_storage); - } - - XORSTR_FORCEINLINE pointer Ce() noexcept - { - return reinterpret_cast(_storage); - } - - XORSTR_FORCEINLINE pointer Pr() noexcept - { - // fO() is inlined by hand because a certain compiler with a certain linker is _very_ slow -#if defined(__clang__) - alignas(alignment) - std::uint64_t arr[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; - std::uint64_t* keys = - (std::uint64_t*)::OqYAfkhl::CtKWt::Fw((std::uint64_t)arr); -#else - alignas(alignment) std::uint64_t keys[]{ ::OqYAfkhl::CtKWt::Fw(Keys)... }; -#endif - -#if defined(_M_ARM64) || defined(__aarch64__) || defined(_M_ARM) || defined(__arm__) -#if defined(__clang__) - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : __builtin_neon_vst1q_v( - reinterpret_cast(_storage) + Indices * 2, - veorq_u64(__builtin_neon_vld1q_v(reinterpret_cast(_storage) + Indices * 2, 51), - __builtin_neon_vld1q_v(reinterpret_cast(keys) + Indices * 2, 51)), - 51)), ...); -#else // GCC, MSVC - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : vst1q_u64( - reinterpret_cast(_storage) + Indices * 2, - veorq_u64(vld1q_u64(reinterpret_cast(_storage) + Indices * 2), - vld1q_u64(reinterpret_cast(keys) + Indices * 2)))), ...); -#endif -#elif !defined(JM_XORSTR_DISABLE_AVX_INTRINSICS) - ((Indices >= sizeof(_storage) / 32 ? static_cast(0) : _mm256_store_si256( - reinterpret_cast<__m256i*>(_storage) + Indices, - _mm256_xor_si256( - _mm256_load_si256(reinterpret_cast(_storage) + Indices), - _mm256_load_si256(reinterpret_cast(keys) + Indices)))), ...); - - if constexpr(sizeof(_storage) % 32 != 0) - _mm_store_si128( - reinterpret_cast<__m128i*>(_storage + sizeof...(Keys) - 2), - _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage + sizeof...(Keys) - 2)), - _mm_load_si128(reinterpret_cast(keys + sizeof...(Keys) - 2)))); -#else - ((Indices >= sizeof(_storage) / 16 ? static_cast(0) : _mm_store_si128( - reinterpret_cast<__m128i*>(_storage) + Indices, - _mm_xor_si128(_mm_load_si128(reinterpret_cast(_storage) + Indices), - _mm_load_si128(reinterpret_cast(keys) + Indices)))), ...); -#endif - - return (pointer)(_storage); - } - }; - - template - swG(L l, std::integral_constant, std::index_sequence) -> swG< - std::remove_const_t>, - Size, - std::integer_sequence()...>, - std::index_sequence>; - -} // namespace jm - -#endif // include guard \ No newline at end of file