前言

Typora自正式版1.0.0发布后,需要付费获取激活码才能使用,beta版仍可继续免费使用。

以下方法采用非常规方法在1.0.4版本亲测激活成功,特别声明:该方法仅供学习交流,切勿用于任何商业用途。

如果你是非开发人员,也可以忽略下面的步骤,直接使用我提供的app.asar替换你本地安装目录的同名文件即可,但我仅在1.0.4版本下测试成功。

  • app.asar下载地址:百度云
  • 激活码:TFP5MW-EMUM2B-AE8UZG-BA7WT6(如激活码失效可参见步骤7自行生成)

准备

首先需要获得asar的解包和打包工具,工具的使用依赖于以下环境:

  • python环境
  • node环境(可选)

源码地址:https://github.com/Mas0nShi/typoraCracker

步骤

1.获取工具源代码,进入到工具的根目录。

2.安装工具所需依赖环境:

1
pip install -r requirements.txt

该命令需要本机安装有Visual Studio C++ Build Tools,否则安装过程会报错。

3.找到Typora安装目录下的app.asar文件,例如:C:\Program Files\Typora\resources\app.asar

4.执行工具解包命令:

1
python typora.py "C:\Program Files\Typora\resources\app.asar" workstation\outfile\

app.asar解包后的文件存储在workstation\outfile\dec_app目录下。

5.使用脚本文件example\path\License.js替换掉workstation\outfile\dec_app\License.js文件。

6.再次用工具打包app.asar文件,添加了-u参数:

1
python typora.py -u workstation\outfile\dec_app workstation\outappasar

成功之后在workstation\outappasar目录下能找到新的app.asar文件,将该文件替换至typora安装目录下的原始文件(替换之前最好先备份)。

7.激活码生成,用nodejs执行:

1
node example/keygen.js

执行完毕会得到一串验证码,使用用该验证码激活Typora

F&Q

启动Typora报错

如果替换app.asar文件后,启动typora报出了如下错误:

解决办法,在打包app.asar前,先将typora安装目录下的resources\app.asar.unpacked\main.node文件也放置在打包目录中,再执行打包命令。

key-gen的python版本

如果本地没有node环境,也可以用如下python代码生成激活码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*-coding:utf-8 -*-
import random

rand_char_set = 'L23456789ABCDEFGHJKMNPQRSTUVWXYZ'
def rand_string(size=22, chars=rand_char_set):
return ''.join((random.choice(chars) for _ in range(size)))

def calc_char(input_str:str, chars=rand_char_set):
return chars[sum((chars.index(c) for c in input_str)) % len(chars)]

def key_gen():
''' get random 22chars from char set and do final two chars calc:
algo: divide @serial into two set ,get char pos in @rand_char_set,
do add and get the index of new char in @rand_char_set
1, {0, 2, 4, 6, 8, 10, 12, 14}
2, {1, 3, 5, 7, 9, 11, 13, 15}'''
serial = rand_string(size=22)
return serial + calc_char(serial[0:16:2]) + calc_char(serial[1:16:2])

if __name__ == '__main__':
serial = key_gen()
print(serial[:6] + "-" + serial[6:12] + "-" + serial[12:18] + "-" + serial[18:24])
pass