背景
手痒
搜索
二进制文件拖进 hopper,检索关键字 expir
,就先试试第一个函数 -[MSACAnalyticsAuthenticationProvider
handleTokenUpdateWithToken: expiryDate: withCompletionHandler:]:
分析
点开伪代码,一通分析后,发现想要无限期试用,就得使逻辑进入到
loc_1000c2360
,要想进入到 loc_1000c2360
就得先后进入到 loc_1000c2198
和 loc_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
96void -[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):
而我的 hopper 是 demo 版,无法保存,所以只能用 vi 徒手硬撸二进制文件。
先 vi Paste
,然后 :%!xxd
,接着点开 hopper
的十六进制模式,hopper 的旁边蓝色的行号可能跟 vi
里以十六进制模式打开的行号对不上,但是好在整数行是对齐的,所以要在 vi
里找到对应到 hopper 的位置就需要找到 “特征字符串” 用以检索。
下图演示了如何找到以 74 开头的特征字符串的方法。那么现在就直接在 vi
里输入 /: 7416 4c89
如果找到多处匹配的,那就继续多输入几个特征字符,直到只有一项匹配为止。那么这个唯一的匹配项就是我们要修改的地方了。
找到之后把 4c39e3
改成 4839db
:
然后::%!xxd -r
回转成原来的二进制形式,然后
:wq
总结起来就是: 1
2
3
4
5
6sudo vi /Applications/Paste.app/Contents/MacOS/Paste
:%!xxd # 以十六进制模式查看
/: 7416 4c89 # 找到匹配需要修改的地方
修改
:%!xxd -r # 回转成二进制
:wq
loc_1000c2219
找到这行代码的二进制形式:
其实这里直接 alt+a
修改的话 hopper
会莫名其妙修改失败,不过没关系,直接分析就好了,整个指令里面也就最后一个字节是
0,那么我们是不是直接改成 48837dc001
就可以了呢?抱着试一试的态度,如法炮制在 vi 里找到这个指令的地方把 00
直接改成 01(第 000c6210 行)
启动
保存退出,重启 Paste,发现可以正常使用之前被限制的功能了,说明这次破解成功了。