Paste 3.0.2 破解

背景

手痒

搜索

二进制文件拖进 hopper,检索关键字 expir ,就先试试第一个函数 -[MSACAnalyticsAuthenticationProvider handleTokenUpdateWithToken: expiryDate: withCompletionHandler:]:

分析

点开伪代码,一通分析后,发现想要无限期试用,就得使逻辑进入到 loc_1000c2360,要想进入到 loc_1000c2360 就得先后进入到 loc_1000c2198loc_1000c2219

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
void -[MSACAnalyticsAuthenticationProvider handleTokenUpdateWithToken:expiryDate:withCompletionHandler:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
var_40 = [arg2 retain];
var_38 = [arg3 retain];
r12 = [arg4 retain];
rax = [self retain];
r15 = rax;
objc_sync_enter(rax);
rax = [r15 completionHandler];
rax = [rax retain];
rbx = rax;
[rax release];
if (rbx == r12) goto loc_1000c2198;

loc_1000c2182:
objc_sync_exit(r15);
[r15 release];
goto loc_1000c231e;

loc_1000c231e:
[r12 release];
[var_38 release];
[var_40 release];
return;

loc_1000c2198:
[r15 setCompletionHandler:0x0];
rax = [MSACAnalytics logTag];
rax = [rax retain];
r14 = rax;
rbx = "-[MSACAnalyticsAuthenticationProvider handleTokenUpdateWithToken:expiryDate:withCompletionHandler:]";
[MSACLogger logMessage:^ { /* block implemented at sub_1000c2435 */ } level:0x3 tag:rax file:"/Users/runner/work/1/s/AppCenterAnalytics/AppCenterAnalytics/TransmissionTarget/MSACAnalyticsAuthenticationProvider.m" function:rbx line:0x3f];
[r14 release];
if (var_40 == 0x0) goto loc_1000c2253;

loc_1000c2219:
if (var_38 == 0x0) goto loc_1000c22ad;

loc_1000c2224:
rax = [r15 type];
if (rax == 0x0) goto loc_1000c2347;

loc_1000c223d:
if (rax != 0x1) goto loc_1000c235a;

loc_1000c2247:
rdi = @"d";
goto loc_1000c234e;

loc_1000c234e:
var_30 = rdi;
[rdi retain];
goto loc_1000c2360;

loc_1000c2360:
rbx = [[MSACTicketCache sharedInstance] retain];
r13 = [[NSString stringWithFormat:@"%@:%@", var_30, var_40] retain];
rax = [r15 ticketKeyHash];
rax = [rax retain];
r14 = rax;
[rbx setTicket:r13 forKey:rax];
var_48 = rbx;
[r14 release];
[r13 release];
[var_48 release];
[r15 setExpiryDate:var_38];
[var_30 release];
goto loc_1000c2182;

loc_1000c235a:
var_30 = 0x0;
goto loc_1000c2360;

loc_1000c2347:
rdi = @"p";
goto loc_1000c234e;

loc_1000c22ad:
rax = [MSACAnalytics logTag];
rax = [rax retain];
r14 = rax;
[MSACLogger logMessage:^ { /* block implemented at sub_1000c2479 */ } level:0x6 tag:rax file:"/Users/runner/work/1/s/AppCenterAnalytics/AppCenterAnalytics/TransmissionTarget/MSACAnalyticsAuthenticationProvider.m" function:rbx line:0x45];
goto loc_1000c2305;

loc_1000c2305:
[r14 release];
objc_sync_exit(r15);
[r15 release];
goto loc_1000c231e;

loc_1000c2253:
rax = [MSACAnalytics logTag];
rax = [rax retain];
r14 = rax;
[MSACLogger logMessage:^ { /* block implemented at sub_1000c2457 */ } level:0x6 tag:rax file:"/Users/runner/work/1/s/AppCenterAnalytics/AppCenterAnalytics/TransmissionTarget/MSACAnalyticsAuthenticationProvider.m" function:rbx line:0x41];
goto loc_1000c2305;
}

loc_1000c2198

想要进入到这里,那么就要使得前面的:

1
if (rbx == r12) goto loc_1000c2198;

这里的 if 判断为真才行,而现在既然是过期了,说明肯定 rbx 和 r12 是不等的,所以直接修改成:

1
if (rbx == rbx) goto loc_1000c2198;

loc_1000c2219

同样的想要进入 loc_1000c2219 在下面这行代码里就不能使之跳转,那么改下后面的数字就可以了

1
if (var_40 == 0x0) goto loc_1000c2253;

比如改成:

1
if (var_40 == 0x1) goto loc_1000c2253;

修改

loc_1000c2198

在需要修改的地方按下 alt+a 然后输入 “cmp rbx, rbx”,观察旁边的二进制内容的变化,从原来的 4c39e3 变成了 4839db (这里一定要保证改后的长度要小于等于改前的,如果恰好相等是最好,如果少了就用 nop 指令补齐,即 90): file file

而我的 hopper 是 demo 版,无法保存,所以只能用 vi 徒手硬撸二进制文件。

vi Paste ,然后 :%!xxd ,接着点开 hopper 的十六进制模式,hopper 的旁边蓝色的行号可能跟 vi 里以十六进制模式打开的行号对不上,但是好在整数行是对齐的,所以要在 vi 里找到对应到 hopper 的位置就需要找到 “特征字符串” 用以检索。

下图演示了如何找到以 74 开头的特征字符串的方法。那么现在就直接在 vi 里输入 /: 7416 4c89 如果找到多处匹配的,那就继续多输入几个特征字符,直到只有一项匹配为止。那么这个唯一的匹配项就是我们要修改的地方了。 file

找到之后把 4c39e3 改成 4839dbfile 然后::%!xxd -r 回转成原来的二进制形式,然后 :wq

总结起来就是:

1
2
3
4
5
6
sudo vi /Applications/Paste.app/Contents/MacOS/Paste
:%!xxd # 以十六进制模式查看
/: 7416 4c89 # 找到匹配需要修改的地方
# 修改
:%!xxd -r # 回转成二进制
:wq

loc_1000c2219

找到这行代码的二进制形式: file

其实这里直接 alt+a 修改的话 hopper 会莫名其妙修改失败,不过没关系,直接分析就好了,整个指令里面也就最后一个字节是 0,那么我们是不是直接改成 48837dc001 就可以了呢?抱着试一试的态度,如法炮制在 vi 里找到这个指令的地方把 00 直接改成 01(第 000c6210 行)

启动

保存退出,重启 Paste,发现可以正常使用之前被限制的功能了,说明这次破解成功了。