逆向解除TextNut内购限制

看到少数派的微博上推荐了一款markdown编辑器,体验了一下觉得不错,但是有未内购只能创建2个文件夹的限制,遂尝试通过逆向解除限制。

半年前写这篇文章的时候,因为软件作者的抗议和谐了文章内容,现在将内容放出。 -20161216

使用工具:Hopper Disassembler,
逆向App:TextNut

首先看一下applicationWillFinishLaunching方法,一般这里会有注册状态的相关逻辑:

1
2
3
4
5
6
7
8
9
if ([rbx areYouSponsor] == 0x1) {
r12 = [[ESPurchaseManager sharedPurchaseManager] retain];
rbx = [[SKPaymentQueue defaultQueue] retain];
rdx = r12;
[rbx addTransactionObserver:rdx];
rdi = rbx;
[rdi release];
[r12 release];
}

猜测是用areYouSponsor来存放注册状态,分析这个变量的相关引用:

可以看到如果注册成功,areYouSponsor会被设置为0x1,继续看这个变量对创建文件夹的控制:
ETDocumentController validateMenuItem方法中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ([r12->settings areYouSponsor] == 0x0) {
if ((_objc_msgSend(r13, rbx) == 0x1772) && ([ESCoreDataUtil countLibraries:0x1] > 0x3)) {
r15 = 0x0;
}
else {
if (_objc_msgSend(r13, rbx) == 0x1776) {
if ([ESCoreDataUtil countLibraries:0xa] <= 0x1) {
r15 = 0x1;
}
else {
r15 = 0x0;
}
}
else {
r15 = 0x1;
}
}
}
else {
r15 = 0x1;
}

这段代码通过countLibraries来计算当前library数量和判断areYouSponsor来控制新建Library菜单的是否只读。
尝试将判断条件置反,即将if ([r12->settings areYouSponsor] == 0x0) {跳转的逻辑和else {跳转的逻辑对调:

7566改为7466

解除限制成功: