diff --git a/assets/CMMX.png b/assets/CMMX.png
new file mode 100644
index 0000000..942918c
Binary files /dev/null and b/assets/CMMX.png differ
diff --git a/crack/CMMFoundation b/crack/CMMFoundation
new file mode 100755
index 0000000..37a102e
Binary files /dev/null and b/crack/CMMFoundation differ
diff --git a/crack/CleanMyMac X b/crack/CleanMyMac X
new file mode 100755
index 0000000..1889d3b
Binary files /dev/null and b/crack/CleanMyMac X differ
diff --git a/crack/CleanMyMacX.md b/crack/CleanMyMacX.md
new file mode 100644
index 0000000..e2c031f
--- /dev/null
+++ b/crack/CleanMyMacX.md
@@ -0,0 +1,169 @@
+## patch activated
+
+### 1. find -[CMMacPawAccountActivationManager isAppActivated]
+
+#### x86_64
+
+```
+__text:000000010003F067
+__text:000000010003F067 ; char __cdecl -[CMMacPawAccountActivationManager isAppActivated](CMMacPawAccountActivationManager *self, SEL)
+__text:000000010003F067 __CMMacPawAccountActivationManager_isAppActivated_ proc near
+__text:000000010003F067 ; DATA XREF: __objc_const:000000010067C6B0↓o
+__text:000000010003F067
+__text:000000010003F067 var_8 = byte ptr -8
+__text:000000010003F067
+__text:000000010003F067 55 push rbp
+__text:000000010003F068 48 89 E5 mov rbp, rsp
+__text:000000010003F06B 48 83 EC 10 sub rsp, 10h
+__text:000000010003F06F 48 8D 7D F8 lea rdi, [rbp+var_8]
+__text:000000010003F073 48 C7 07 9C FF FF FF mov qword ptr [rdi], 0FFFFFFFFFFFFFF9Ch
+__text:000000010003F07A E8 71 66 38 00 call sub_1003C56F0
+__text:000000010003F07F 84 C0 test al, al
+__text:000000010003F081 75 13 jnz short loc_10003F096
+__text:000000010003F083 BF 01 00 00 00 mov edi, 1
+__text:000000010003F088 31 F6 xor esi, esi
+__text:000000010003F08A E8 04 61 FD FF call sub_100015193
+__text:000000010003F08F 48 83 F8 09 cmp rax, 9
+__text:000000010003F093 0F 94 C0 setz al
+__text:000000010003F096
+__text:000000010003F096 loc_10003F096: ; CODE XREF: -[CMMacPawAccountActivationManager isAppActivated]+1A↑j
+__text:000000010003F096 0F BE C0 movsx eax, al
+__text:000000010003F099 48 83 C4 10 add rsp, 10h
+__text:000000010003F09D 5D pop rbp
+__text:000000010003F09E C3 retn
+__text:000000010003F09E __CMMacPawAccountActivationManager_isAppActivated_ endp
+__text:000000010003F09E
+```
+
+```
+__text:00000001003C56F0 sub_1003C56F0 proc near ; CODE XREF: sub_10002B273+28↑p
+__text:00000001003C56F0 ; +[CMLinkBuilder standardURLTrackingParametersDictionary]+21F↑p ...
+__text:00000001003C56F0
+__text:00000001003C56F0 55 push rbp
+__text:00000001003C56F1 48 89 E5 mov rbp, rsp
+__text:00000001003C56F4 48 81 EC A0 06 00 00 sub rsp, 6A0h
+__text:00000001003C56FB 48 8B 05 16 91 26 00 mov rax, cs:___stack_chk_guard_ptr
+__text:00000001003C5702 48 8B 00 mov rax, [rax]
+__text:00000001003C5705 48 89 45 F8 mov [rbp+var_8], rax
+__text:00000001003C5709 48 89 BD 18 FD FF FF mov [rbp+var_2E8], rdi
+__text:00000001003C5710 C6 85 17 FD FF FF 00 mov [rbp+var_2E9], 0
+__text:00000001003C5717 E8 FE E2 15 00 call _objc_autoreleasePoolPush
+__text:00000001003C571C 48 8B 0D ED 8D 26 00 mov rcx, cs:_NSApp_ptr
+__text:00000001003C5723 48 C7 85 08 FD FF FF 00 00 00 00 mov [rbp+var_2F8], 0
+__text:00000001003C572E 48 8B 95 08 FD FF FF mov rdx, [rbp+var_2F8]
+__text:00000001003C5735 48 89 95 00 FD FF FF mov [rbp+var_300], rdx
+__text:00000001003C573C 48 8D 95 00 FD FF FF lea rdx, [rbp+var_300]
+__text:00000001003C5743 48 89 95 60 FD FF FF mov [rbp+var_2A0], rdx
+__text:00000001003C574A 48 83 39 00 cmp qword ptr [rcx], 0
+__text:00000001003C574E 48 89 85 E8 FC FF FF mov [rbp+context], rax
+__text:00000001003C5755 0F 84 39 00 00 00 jz loc_1003C5794
+__text:00000001003C575B 48 8B 05 1E 07 41 00 mov rax, cs:qword_1007D5E80
+__text:00000001003C5762 48 8B 0D A7 8D 26 00 mov rcx, cs:_NSApp_ptr
+__text:00000001003C5769 48 8B 39 mov rdi, [rcx]
+__text:00000001003C576C 48 8D 35 B5 07 41 00 lea rsi, unk_1007D5F28
+__text:00000001003C5773 FF D0 call rax ; qword_1007D5E80
+__text:00000001003C5775 48 89 85 E0 FC FF FF mov [rbp+var_320], rax
+__text:00000001003C577C E9 00 00 00 00 jmp $+5
+```
+
+opcode
+
+```
+55 48 89 E5 48 81 EC A0 06 00 00 48 8B 05 16 91
+26 00 48 8B 00 48 89 45 F8 48 89 BD 18 FD FF FF
+C6 85 17 FD FF FF 00 E8 FE E2 15 00 48 8B 0D ED
+8D 26 00 48 C7 85 08 FD FF FF 00 00 00 00 48 8B
+95 08 FD FF FF 48 89 95 00 FD FF FF 48 8D 95 00
+FD FF FF 48 89 95 60 FD FF FF 48 83 39 00 48 89
+85 E8 FC FF FF 0F 84 39 00 00 00 48 8B 05 1E 07
+```
+
+patch
+
+```
+6A 01 58 C3
+```
+
+#### arm64
+
+```
+__text:000000010003FC30 ; bool __cdecl -[CMMacPawAccountActivationManager isAppActivated](CMMacPawAccountActivationManager *self, SEL)
+__text:000000010003FC30 __CMMacPawAccountActivationManager_isAppActivated_
+__text:000000010003FC30 ; DATA XREF: __objc_methlist:00000001004D3FD4↓o
+__text:000000010003FC30
+__text:000000010003FC30 var_8 = -8
+__text:000000010003FC30 var_s0 = 0
+__text:000000010003FC30
+__text:000000010003FC30 FF 83 00 D1 SUB SP, SP, #0x20 ; __int64
+__text:000000010003FC34 FD 7B 01 A9 STP X29, X30, [SP,#0x10+var_s0] ; __int64
+__text:000000010003FC38 FD 43 00 91 ADD X29, SP, #0x10
+__text:000000010003FC3C 68 0C 80 92 MOV X8, #0xFFFFFFFFFFFFFF9C
+__text:000000010003FC40 E8 07 00 F9 STR X8, [SP,#0x10+var_8] ; __int64
+__text:000000010003FC44 E0 23 00 91 ADD X0, SP, #0x10+var_8 ; int
+__text:000000010003FC48 2C CD 0C 94 BL sub_1003730F8
+__text:000000010003FC4C 60 00 00 36 TBZ W0, #0, loc_10003FC58
+__text:000000010003FC50 20 00 80 52 MOV W0, #1
+__text:000000010003FC54 06 00 00 14 B loc_10003FC6C
+__text:000000010003FC58 ; ---------------------------------------------------------------------------
+__text:000000010003FC58
+__text:000000010003FC58 loc_10003FC58 ; CODE XREF: -[CMMacPawAccountActivationManager isAppActivated]+1C↑j
+__text:000000010003FC58 20 00 80 52 MOV W0, #1
+__text:000000010003FC5C 01 00 80 D2 MOV X1, #0
+__text:000000010003FC60 40 64 FF 97 BL sub_100018D60
+__text:000000010003FC64 1F 24 00 F1 CMP X0, #9
+__text:000000010003FC68 E0 17 9F 1A CSET W0, EQ
+__text:000000010003FC6C
+__text:000000010003FC6C loc_10003FC6C ; CODE XREF: -[CMMacPawAccountActivationManager isAppActivated]+24↑j
+__text:000000010003FC6C FD 7B 41 A9 LDP X29, X30, [SP,#0x10+var_s0]
+__text:000000010003FC70 FF 83 00 91 ADD SP, SP, #0x20 ; ' '
+__text:000000010003FC74 C0 03 5F D6 RET
+__text:000000010003FC74 ; End of function -[CMMacPawAccountActivationManager isAppActivated]
+__text:000000010003FC74
+```
+
+
+```
+__text:00000001003730F8 sub_1003730F8 ; CODE XREF: sub_10002BCEC+28↑p
+__text:00000001003730F8 ; +[CMLinkBuilder standardURLTrackingParametersDictionary]+210↑p ...
+__text:00000001003730F8
+__text:00000001003730F8 FC 6F BE A9 STP X28, X27, [SP,#-0x10+var_10]!
+__text:00000001003730FC FD 7B 01 A9 STP X29, X30, [SP,#0x10+var_s0]
+__text:0000000100373100 FD 43 00 91 ADD X29, SP, #0x10
+__text:0000000100373104 FF 83 1B D1 SUB SP, SP, #0x6E0
+__text:0000000100373108 E8 63 11 91 ADD X8, SP, #0x6F0+var_298
+__text:000000010037310C C9 14 00 D0 ADRP X9, #_NSApp_ptr@PAGE
+__text:0000000100373110 29 61 45 F9 LDR X9, [X9,#_NSApp_ptr@PAGEOFF]
+__text:0000000100373114 AA 0F 00 90 4A 69 1D 91 ADRL X10, aDmEnableDebugL ; "DM_ENABLE_DEBUG_LOGGING_ACTIVATION"
+__text:000000010037311C 0B 00 80 D2 MOV X11, #0
+__text:0000000100373120 0C 20 00 F0 8C 21 28 91 ADRL X12, qword_100776A08
+__text:0000000100373128 4D 1C 00 F0 AD 81 2F 91 ADRL X13, selRef_stringByAppendingPathComponent_
+__text:0000000100373130 AE 1C 00 B0 CE 41 14 91 ADRL X14, classRef_NSFileManager
+__text:0000000100373138 4F 1C 00 F0 EF 01 05 91 ADRL X15, selRef_defaultManager
+__text:0000000100373140 90 1C 00 90 10 42 2E 91 ADRL X16, selRef_alloc
+__text:0000000100373148 B1 1C 00 D0 31 62 09 91 ADRL X17, classRef_NSError
+__text:0000000100373150 C1 15 00 D0 21 A0 0E 91 ADRL X1, off_10062D3A8
+__text:0000000100373158 C2 14 00 D0 ADRP X2, #___stack_chk_guard_ptr@PAGE
+__text:000000010037315C 42 E8 46 F9 LDR X2, [X2,#___stack_chk_guard_ptr@PAGEOFF]
+__text:0000000100373160 42 00 40 F9 LDR X2, [X2]
+__text:0000000100373164 A2 83 1E F8 STUR X2, [X29,#var_18]
+__text:0000000100373168 E0 FF 01 F9 STR X0, [SP,#0x6F0+var_2F8]
+__text:000000010037316C 03 00 80 52 MOV W3, #0
+```
+
+opcode
+
+```
+FC 6F BE A9 FD 7B 01 A9 FD 43 00 91 FF 83 1B D1
+E8 63 11 91 C9 14 00 D0 29 61 45 F9 AA 0F 00 90
+4A 69 1D 91 0B 00 80 D2 0C 20 00 F0 8C 21 28 91
+4D 1C 00 F0 AD 81 2F 91 AE 1C 00 B0 CE 41 14 91
+4F 1C 00 F0 EF 01 05 91 90 1C 00 90 10 42 2E 91
+B1 1C 00 D0 31 62 09 91 C1 15 00 D0 21 A0 0E 91
+```
+
+patch
+
+```
+20 00 80 D2 C0 03 5F D6
+```
+
diff --git a/crack/CleanMyMacXMenu.md b/crack/CleanMyMacXMenu.md
new file mode 100644
index 0000000..eb29c82
--- /dev/null
+++ b/crack/CleanMyMacXMenu.md
@@ -0,0 +1,158 @@
+
+## 1. patch CMMFoundation isMainAppActivated
+
+`CleanMyMac X.app/Contents/Library/LoginItems/CleanMyMac X Menu.app/Contents/Frameworks/CMMFoundation.framework/Versions/A/CMMFoundation`
+
+### x86_64
+
+```
+__text:0000000000071B20 ; char __cdecl +[CMSharedProtectedPreferencesBridge isMainAppActivated](id, SEL)
+__text:0000000000071B20 __CMSharedProtectedPreferencesBridge_isMainAppActivated_ proc near
+__text:0000000000071B20 ; DATA XREF: __objc_data:00000000001FBF08↓o
+__text:0000000000071B20 55 push rbp
+__text:0000000000071B21 48 89 E5 mov rbp, rsp
+__text:0000000000071B24 E8 17 03 00 00 call sub_71E40
+__text:0000000000071B29 0F B6 C0 movzx eax, al
+__text:0000000000071B2C 83 E0 01 and eax, 1
+__text:0000000000071B2F 5D pop rbp
+__text:0000000000071B30 C3 retn
+__text:0000000000071B30 __CMSharedProtectedPreferencesBridge_isMainAppActivated_ endp
+__text:0000000000071B30
+```
+
+```
+__text:0000000000071E40 sub_71E40 proc near ; CODE XREF: +[CMSharedProtectedPreferencesBridge isMainAppActivated]+4↑p
+__text:0000000000071E40 ; static SharedProtectedPreferencesBridge.isMainAppActivated.getter+5↑j
+__text:0000000000071E40
+__text:0000000000071E40 var_30 = qword ptr -30h
+__text:0000000000071E40
+__text:0000000000071E40 55 push rbp
+__text:0000000000071E41 48 89 E5 mov rbp, rsp
+__text:0000000000071E44 41 57 push r15
+__text:0000000000071E46 41 56 push r14
+__text:0000000000071E48 41 55 push r13
+__text:0000000000071E4A 41 54 push r12
+__text:0000000000071E4C 53 push rbx
+__text:0000000000071E4D 50 push rax
+__text:0000000000071E4E 31 FF xor edi, edi
+__text:0000000000071E50 E8 FF 21 10 00 call _$sSS10FoundationE8EncodingVMa ; type metadata accessor for String.Encoding
+__text:0000000000071E55 48 8B 40 F8 mov rax, [rax-8]
+__text:0000000000071E59 48 8B 40 40 mov rax, [rax+40h]
+__text:0000000000071E5D 48 89 E3 mov rbx, rsp
+__text:0000000000071E60 48 83 C0 0F add rax, 0Fh
+__text:0000000000071E64 48 83 E0 F0 and rax, 0FFFFFFFFFFFFFFF0h
+__text:0000000000071E68 48 29 C3 sub rbx, rax
+__text:0000000000071E6B 48 89 DC mov rsp, rbx
+__text:0000000000071E6E 48 83 3D 5A E8 18 00 FF cmp cs:qword_2006D0, 0FFFFFFFFFFFFFFFFh
+__text:0000000000071E76 0F 85 E2 00 00 00 jnz loc_71F5E
+__text:0000000000071E7C
+```
+
+opcode
+
+```
+55 48 89 E5 41 57 41 56 41 55 41 54 53 50 31 FF
+E8 FF 21 10 00 48 8B 40 F8 48 8B 40 40 48 89 E3
+48 83 C0 0F 48 83 E0 F0 48 29 C3 48 89 DC 48 83
+3D 5A E8 18 00 FF 0F 85 E2 00 00 00 4C 8B 2D 8D
+F3 18 00 4C 8B 3D 8E F3 18 00 4C 8B 35 8F F3 18
+00 4C 89 EF BE 02 00 00 00 E8 E8 2E 10 00 4C 89
+```
+
+patch
+
+```
+6A 01 58 C3
+```
+
+after
+
+```
+__text:0000000000071E40 sub_71E40 proc near ; CODE XREF: +[CMSharedProtectedPreferencesBridge isMainAppActivated]+4↑p
+__text:0000000000071E40 ; static SharedProtectedPreferencesBridge.isMainAppActivated.getter+5↑j
+__text:0000000000071E40 6A 01 push 1
+__text:0000000000071E42 58 pop rax
+__text:0000000000071E43 C3 retn
+__text:0000000000071E43 sub_71E40 endp
+__text:0000000000071E43
+```
+
+### arm64
+
+```
+__text:0000000000071E00 ; bool __cdecl +[CMSharedProtectedPreferencesBridge isMainAppActivated](id, SEL)
+__text:0000000000071E00 __CMSharedProtectedPreferencesBridge_isMainAppActivated_
+__text:0000000000071E00 ; DATA XREF: __objc_methlist:0000000000179770↓o
+__text:0000000000071E00
+__text:0000000000071E00 var_s0 = 0
+__text:0000000000071E00
+__text:0000000000071E00 FD 7B BF A9 STP X29, X30, [SP,#-0x10+var_s0]!
+__text:0000000000071E04 FD 03 00 91 MOV X29, SP
+__text:0000000000071E08 B4 00 00 94 BL _$s13CMMFoundation32SharedProtectedPreferencesBridgeC18isMainAppActivatedSbvgZ_0 ; static SharedProtectedPreferencesBridge.isMainAppActivated.getter
+__text:0000000000071E0C 00 00 00 12 AND W0, W0, #1
+__text:0000000000071E10 FD 7B C1 A8 LDP X29, X30, [SP+var_s0],#0x10
+__text:0000000000071E14 C0 03 5F D6 RET
+__text:0000000000071E14 ; End of function +[CMSharedProtectedPreferencesBridge isMainAppActivated]
+__text:0000000000071E14
+```
+
+```
+__text:00000000000720D8 ; static CMMFoundation.SharedProtectedPreferencesBridge.isMainAppActivated.getter : Swift.Bool
+__text:00000000000720D8 _$s13CMMFoundation32SharedProtectedPreferencesBridgeC18isMainAppActivatedSbvgZ_0
+__text:00000000000720D8 ; CODE XREF: +[CMSharedProtectedPreferencesBridge isMainAppActivated]+8↑p
+__text:00000000000720D8 ; static SharedProtectedPreferencesBridge.isMainAppActivated.getter↑j
+__text:00000000000720D8
+__text:00000000000720D8 var_30 = -0x30
+__text:00000000000720D8 var_20 = -0x20
+__text:00000000000720D8 var_10 = -0x10
+__text:00000000000720D8 var_s0 = 0
+__text:00000000000720D8
+__text:00000000000720D8 F8 5F BC A9 STP X24, X23, [SP,#-0x10+var_30]!
+__text:00000000000720DC F6 57 01 A9 STP X22, X21, [SP,#0x30+var_20]
+__text:00000000000720E0 F4 4F 02 A9 STP X20, X19, [SP,#0x30+var_10]
+__text:00000000000720E4 FD 7B 03 A9 STP X29, X30, [SP,#0x30+var_s0]
+__text:00000000000720E8 FD C3 00 91 ADD X29, SP, #0x30
+__text:00000000000720EC 00 00 80 D2 MOV X0, #0
+__text:00000000000720F0 54 ED 03 94 BL _$sSS10FoundationE8EncodingVMa ; type metadata accessor for String.Encoding
+__text:00000000000720F4 08 80 5F F8 LDUR X8, [X0,#-8]
+__text:00000000000720F8 08 21 40 F9 LDR X8, [X8,#0x40]
+__text:00000000000720FC E9 03 00 91 MOV X9, SP
+__text:0000000000072100 08 3D 00 91 ADD X8, X8, #0xF
+__text:0000000000072104 08 ED 7C 92 AND X8, X8, #0xFFFFFFFFFFFFFFF0
+__text:0000000000072108 35 01 08 CB SUB X21, X9, X8
+__text:000000000007210C BF 02 00 91 MOV SP, X21
+__text:0000000000072110 28 0C 00 B0 ADRP X8, #qword_1F7A28@PAGE
+__text:0000000000072114 08 15 45 F9 LDR X8, [X8,#qword_1F7A28@PAGEOFF]
+__text:0000000000072118 1F 05 00 B1 CMN X8, #1
+__text:000000000007211C A1 07 00 54 B.NE loc_72210
+__text:0000000000072120
+```
+
+opcode
+
+```
+F8 5F BC A9 F6 57 01 A9 F4 4F 02 A9 FD 7B 03 A9
+FD C3 00 91 00 00 80 D2 54 ED 03 94 08 80 5F F8
+08 21 40 F9 E9 03 00 91 08 3D 00 91 08 ED 7C 92
+35 01 08 CB BF 02 00 91 28 0C 00 B0 08 15 45 F9
+1F 05 00 B1 A1 07 00 54 28 0C 00 D0 08 81 15 91
+```
+
+patch
+
+```
+20 00 80 D2 C0 03 5F D6
+```
+
+after
+
+```
+__text:00000000000720D8 ; static CMMFoundation.SharedProtectedPreferencesBridge.isMainAppActivated.getter : Swift.Bool
+__text:00000000000720D8 _$s13CMMFoundation32SharedProtectedPreferencesBridgeC18isMainAppActivatedSbvgZ_0
+__text:00000000000720D8 ; CODE XREF: +[CMSharedProtectedPreferencesBridge isMainAppActivated]+8↑p
+__text:00000000000720D8 ; static SharedProtectedPreferencesBridge.isMainAppActivated.getter↑j
+__text:00000000000720D8 20 00 80 D2 MOV X0, #1
+__text:00000000000720DC C0 03 5F D6 RET
+__text:00000000000720DC ; End of function static SharedProtectedPreferencesBridge.isMainAppActivated.getter
+__text:00000000000720DC
+```
diff --git a/entitlements/CleanMyMac X HealthMonitor.app.entitlements b/entitlements/CleanMyMac X HealthMonitor.app.entitlements
new file mode 100644
index 0000000..b493e66
--- /dev/null
+++ b/entitlements/CleanMyMac X HealthMonitor.app.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.application-identifier
+ com.macpaw.CleanMyMac4.HealthMonitor
+
+
diff --git a/entitlements/CleanMyMac X Menu.app.entitlements b/entitlements/CleanMyMac X Menu.app.entitlements
new file mode 100644
index 0000000..3f7a7c7
--- /dev/null
+++ b/entitlements/CleanMyMac X Menu.app.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.application-identifier
+ com.macpaw.CleanMyMac4.Menu
+
+
diff --git a/entitlements/CleanMyMac X.entitlements b/entitlements/CleanMyMac X.entitlements
new file mode 100644
index 0000000..9e488d6
--- /dev/null
+++ b/entitlements/CleanMyMac X.entitlements
@@ -0,0 +1,14 @@
+
+
+
+
+ com.apple.application-identifier
+ com.macpaw.CleanMyMac4
+ com.apple.developer.aps-environment
+ production
+ com.apple.developer.associated-domains
+
+ webcredentials:my.macpaw.com
+
+
+
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..46f65d0
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,24 @@
+# CleanMyMac X for Mac Crack
+
+Crack for CleanMyMac X for Mac 4.12.1 (41201.0.2211091011)
+
+- [x] Support Intel
+- [x] Support Apple Silicon (M1 & M2)
+
+# Install
+
+Go to releases page download and install.
+
+# FAQ
+
+## Is this crack safe?
+
+It's opensource, you can use any hex file comparison tool you like to see what has been modified.
+
+## I want to crack it myself.
+
+Check the crack folder to see how I cracked it.
+
+## Where to get update?
+
+[https://git.icrack.day/somebasj/CleanMyMacXCrack](https://git.icrack.day/somebasj/CleanMyMacXCrack)
diff --git a/scripts/extra_entitlements.sh b/scripts/extra_entitlements.sh
new file mode 100755
index 0000000..4c5ac9a
--- /dev/null
+++ b/scripts/extra_entitlements.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+CUR_PATH=$(
+ cd $(dirname "$0");
+ pwd
+)
+ROOT_PATH=$(
+ cd "${CUR_PATH}/../";
+ pwd
+)
+
+function export_entitlements() {
+ codesign -d --entitlements - --xml "$1" 2>/dev/null | plutil -convert xml1 -o - - > "$2"
+ /usr/libexec/PlistBuddy -c "Delete :com.apple.security.application-groups" "$2" 2>/dev/null
+ /usr/libexec/PlistBuddy -c "Delete :com.apple.developer.team-identifier" "$2" 2>/dev/null
+ /usr/libexec/PlistBuddy -c "Delete :keychain-access-groups" "$2" 2>/dev/null
+ sed -i "" "s/S8EX82NJP6\.//g" "$2"
+}
+
+mkdir -p "${ROOT_PATH}/entitlements"
+
+export_entitlements "/Volumes/CleanMyMac X/CleanMyMac X.app" "${ROOT_PATH}/entitlements/CleanMyMac X.entitlements"
+export_entitlements "/Volumes/CleanMyMac X/CleanMyMac X.app/Contents/Library/LoginItems/CleanMyMac X HealthMonitor.app" "${ROOT_PATH}/entitlements/CleanMyMac X HealthMonitor.app.entitlements"
+export_entitlements "/Volumes/CleanMyMac X/CleanMyMac X.app/Contents/Library/LoginItems/CleanMyMac X Menu.app" "${ROOT_PATH}/entitlements/CleanMyMac X Menu.app.entitlements"
diff --git a/scripts/publish.sh b/scripts/publish.sh
new file mode 100755
index 0000000..154325d
--- /dev/null
+++ b/scripts/publish.sh
@@ -0,0 +1,147 @@
+#!/bin/bash
+
+CUR_PATH=$(
+ cd $(dirname "$0");
+ pwd
+)
+ROOT_PATH=$(
+ cd "${CUR_PATH}/../";
+ pwd
+)
+TEMP_PATH="${ROOT_PATH}/tmp"
+PUBLISH_PATH="${ROOT_PATH}/publish"
+
+APP_VERSION="41201.0.2211091011"
+#APP_VERSION="4.12.1"
+
+DMG_SHA256SUM="3867b877b3bda4e9c41ceca69b81abc3f992cb5cded7c07312f638b33ee70842"
+
+DMG_DOWNLOAD_URL="https://dl.devmate.com/com.macpaw.CleanMyMac4/CleanMyMacX.dmg"
+
+DMG_FILE="${TEMP_PATH}/download/CleanMyMacX_${APP_VERSION}.dmg"
+
+PUBLISH_FILE="${PUBLISH_PATH}/CleanMyMacX_${APP_VERSION}_Crack.dmg"
+
+CODESIGN_CERT=-
+
+if [ -n "$(security find-identity -v -p codesigning | grep 73B34EBEE504D5CEE35B113A22CEBFD381A21033)" ]; then
+ CODESIGN_CERT=73B34EBEE504D5CEE35B113A22CEBFD381A21033
+fi
+
+TMP_DIR="${TEMP_PATH}/dmg_files"
+
+function sign_cmd() {
+ NAME=$(basename $1)
+ if [ -f "${ROOT_PATH}/entitlements/${NAME}.entitlements" ]; then
+ codesign -f -s "${CODESIGN_CERT}" --timestamp=none --all-architectures --deep \
+ --entitlements "${ROOT_PATH}/entitlements/${NAME}.entitlements" \
+ "$1"
+ else
+ codesign -f -s "${CODESIGN_CERT}" --timestamp=none --all-architectures --deep "$1"
+ fi
+}
+
+function ensure_download_dmg() {
+ if [ ! -f "${DMG_FILE}" ]; then
+ echo "[*] Download ${DMG_DOWNLOAD_URL}"
+ mkdir -p $(dirname "${DMG_FILE}")
+ curl -L --progress-bar -o "${DMG_FILE}" "${DMG_DOWNLOAD_URL}"
+ fi
+ if [ -f "${DMG_FILE}" ]; then
+ echo "[*] Check hash for \"${DMG_FILE}\""
+ FILE_HASH=$(shasum -a 256 -b "${DMG_FILE}" | awk '{print $1}')
+ if [ ${FILE_HASH} != ${DMG_SHA256SUM} ]; then
+ echo "[-] ${FILE_HASH} != ${DMG_SHA256SUM}"
+ echo "[*] Delete \"${DMG_FILE}\""
+ rm -f "${DMG_FILE}"
+ fi
+ fi
+}
+
+function copy_files() {
+ echo "[*] Copy files"
+ if [ -d "${TMP_DIR}" ]; then
+ rm -rf "${TMP_DIR}" > /dev/null
+ fi
+ mkdir -p "${TMP_DIR}" > /dev/null
+
+ hdiutil attach -noverify -noautofsck -noautoopen "${DMG_FILE}"
+ cp -R -X "/Volumes/CleanMyMac X/CleanMyMac X.app" "${TMP_DIR}/" > /dev/null
+ hdiutil detach "/Volumes/CleanMyMac X"
+
+ rm -f "${TMP_DIR}/CleanMyMac X.app/Contents/embedded.provisionprofile" > /dev/null
+ chflags -R 0 "${TMP_DIR}" > /dev/null
+ xattr -cr "${TMP_DIR}" > /dev/null
+}
+
+function apply_crack() {
+ echo "[*] Apply patch"
+
+ SRC="${ROOT_PATH}/crack/CleanMyMac X"
+ DST="${TMP_DIR}/CleanMyMac X.app/Contents/MacOS/CleanMyMac X"
+
+ cp -f "${SRC}" "${DST}" > /dev/null
+ chflags -R 0 "${DST}"
+ chmod 755 "${DST}"
+
+ SRC="${ROOT_PATH}/crack/CMMFoundation"
+ DST="${TMP_DIR}/CleanMyMac X.app/Contents/Library/LoginItems/CleanMyMac X Menu.app/Contents/Frameworks/CMMFoundation.framework/Versions/A/CMMFoundation"
+
+ cp -f "${SRC}" "${DST}" > /dev/null
+ chflags -R 0 "${DST}"
+ chmod 755 "${DST}"
+}
+
+function sign_other() {
+ oldIFS=$IFS
+ IFS=$'\n'
+ for name in $(ls "${TMP_DIR}/CleanMyMac X.app/Contents/Library/LoginItems/")
+ do
+ if [ -f "${TMP_DIR}/CleanMyMac X.app/Contents/Library/LoginItems/${name}/Contents/embedded.provisionprofile" ]; then
+ rm -f "${TMP_DIR}/CleanMyMac X.app/Contents/Library/LoginItems/${name}/Contents/embedded.provisionprofile" > /dev/null
+ fi
+ sign_cmd "${TMP_DIR}/CleanMyMac X.app/Contents/Library/LoginItems/${name}"
+ done
+ IFS=oldIFS
+}
+
+function sign_app() {
+ echo "[*] Sign App"
+ sign_other
+ if [ -f "${TMP_DIR}/CleanMyMac X.app/Contents/embedded.provisionprofile" ]; then
+ rm -f "${TMP_DIR}/CleanMyMac X.app/Contents/embedded.provisionprofile" > /dev/null
+ fi
+ sign_cmd "${TMP_DIR}/CleanMyMac X.app"
+}
+
+function create_dmg() {
+ echo "[*] Create dmg ${PUBLISH_FILE}"
+ mkdir -p "${PUBLISH_PATH}"
+
+ if [ -f "${PUBLISH_FILE}" ]; then
+ rm -f "${PUBLISH_FILE}" > /dev/null
+ fi
+
+ create-dmg \
+ --volname "CleanMyMac X" \
+ --background "${ROOT_PATH}/assets/CMMX.png" \
+ --window-pos 0 0 \
+ --window-size 679 412 \
+ --text-size 14 \
+ --icon-size 128 \
+ --icon "CleanMyMac X.app" 158 130 \
+ --app-drop-link 526 130\
+ --codesign "${CODESIGN_CERT}" \
+ "${PUBLISH_FILE}" \
+ "${TMP_DIR}/"
+}
+
+function publish_crack_dmg() {
+ #ensure_download_dmg
+ #copy_files
+ #apply_crack
+ sign_app
+ create_dmg
+}
+
+publish_crack_dmg