Typora 无限试用探索:通过修改配置文件日期实现 "续杯"

· 默认分类

本文仅用于学习和研究,不建议绕过 Typora 的正版授权机制。请合理使用,支持优秀的软件开发者!

一、项目背景

Typora 是一款极致优雅的 Markdown 文档编辑器,并提供手写样台体高度达成的手写组织体验。

Typora 原本是免费软件,但在进入正式发布版本后,已改为付费软件,无论是 Windows 还是 macOS,都有试用时间限制。

在试用期结束后,Typora 需要正版授权才能继续使用。那么,还有没有可能通过保留试用状态,实现同样效果的方法呢?

2025-04-07T14:07:58.png

二、Typora 配置文件分析

Typora 在 Windows 上会把用户配置存储在

%APPDATA%\Typora\profile.data

该文件本质是一个被 UTF-8 编码后再转换为 16 进制的 JSON 文件,我们可以将其转为 JSON,分析其中包含如下样的日期字段:

"_iD": "3/18/2025"

非常明显,这是用于记录试用开始时间的字段。而 Typora 同步上下没有与服务器校验,那么,我们只需要修改这个日期,就有可能重新启动试用。


三、Python 脚本实现“日期重置试用”

import os
import json
from datetime import datetime

def hex_to_json(hex_str):
    return json.loads(bytes.fromhex(hex_str).decode('utf-8'))

def json_to_hex(data):
    json_str = json.dumps(data, separators=(',', ':'))
    return json_str.encode('utf-8').hex()

def get_today_date_str():
    today = datetime.today()
    return f"{today.month}/{today.day}/{today.year}"  # M/D/YYYY

def fix_path(path: str):
    return path.replace("\\", "\\\\")

def main():
    file_path = os.path.expandvars(r"%APPDATA%\\Typora\\profile.data")

    if not os.path.exists(file_path):
        print(f"\u6587\u4ef6\u4e0d\u5b58\u5728\uff1a{file_path}")
        return

    with open(file_path, "r", encoding="utf-8") as f:
        hex_input = f.read().strip()

    try:
        data = hex_to_json(hex_input)
    except Exception as e:
        print("\u89e3\u6790\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4\u6587\u4ef6\u5185\u5bb9\u662f hex \u7f16\u7801\u7684 JSON\u3002")
        print("\u9519\u8bef\u4fe1\u606f\uff1a", e)
        return

    today_str = get_today_date_str()
    data["_iD"] = today_str
    print(f"\u5df2\u5c06 _iD \u66f4\u65b0\u4e3a\uff1a{today_str}")

    if "pinFolder" in data:
        data["pinFolder"] = fix_path(data["pinFolder"])

    modified_hex = json_to_hex(data)
    with open(file_path, "w", encoding="utf-8") as f:
        f.write(modified_hex)

    print("\u4fee\u6539\u6210\u529f \u2705")
    print(f"\u65b0\u5185\u5bb9\u5199\u5165\uff1a{file_path}")

if __name__ == "__main__":
    main()

四、实验效果


五、结论 & 提示