【2026最新】Typora 1.14.X激活攻略,亲测有效!

📅 2026/8/18 11:40:23
【2026最新】Typora 1.14.X激活攻略,亲测有效!
Typora 是一款非常优秀的 Markdown 编辑器但新版本的激活机制比旧版本复杂不少。本文记录了一种可行的激活方法经测试在 Windows 11 系统、Typora 1.14.9版本上可用。准备工作在开始之前请确认以下几点操作系统Windows本文以 Windows 11 为例Typora 版本1.14.9安装路径Typora 不能安装到 C 盘否则破解可能失败一、安装 Typora1. 下载安装包从官方网站下载 Typora 安装包官网下载https://typora.ioWindows 64位直链https://downloads.typoraio.cn/windows/typora-setup-x64-1.14.9.exe进入Typora官网点击All / History Releases进行历史版本页按照电脑系统选择安装程序进行安装。2. 安装 Typora运行安装包务必将安装路径选择到非系统盘如 E 盘。本文以E:\Typora为例。1.选择安装模式该步骤用于选择软件的使用范围两个选项区别如下Install for all users (recommended) / 为所有用户安装推荐需要管理员权限安装后电脑上所有 Windows 账户都可以使用该软件默认安装路径为C:\Program Files\Typora后续可自定义修改Install for me only / 仅为当前用户安装无需管理员权限仅当前登录的 Windows 账号可见、可用默认安装在用户目录下的AppData文件夹中操作建议个人自用电脑且拥有管理员权限选择第一项即可。2.选择安装位置此处可自定义软件安装目录点击右侧Browse...即可选择其他磁盘或文件夹示例中修改为了E:\Typora。页面底部会标注最低磁盘空间要求确保目标磁盘有至少 605.9MB 可用空间。注意事项安装路径不要包含中文、空格或特殊符号否则可能引发后续功能异常、插件不兼容等问题。操作建议确认路径无误后点击Next 继续。3.附加任务设置仅包含一个选项Create a desktop shortcut创建桌面快捷方式勾选后安装完成会在桌面生成 Typora 启动图标方便日常快速打开软件。操作建议保持勾选状态点击Next 继续。4.确认安装信息此页面会汇总前面的所有配置安装目标位置、附加任务选项。确认信息无误点击Install开始正式安装若需要修改配置点击 Back返回调整。5.完成安装安装进度走完后进入收尾页面Launch Typora选项勾选后点击Finish会立即启动软件。如果需要先进行其他配置、暂不启动软件可取消勾选后再点击Finish。安装完成后先不要着急操作先打开 Typora 软件。3. 复制机器码打开 Typora 后按照以下路径操作帮助→我的许可证→输入序列号→离线激活→复制机器码将机器码复制出来保存到记事本中备用。这个机器码是后续激活的关键。二、安装 Node.js 并创建脚本文件1. 安装 Node.js以管理员身份打开cmd执行以下命令安装 Node.js LTS 版本winget install OpenJS.NodeJS.LTS安装完成后验证是否安装成功node -v # 查看 Node.js 版本 npm -v # 查看 npm 版本如果一切正常会显示对应的版本号。2. 解决 npm 执行策略问题如遇报错如果运行npm -v时出现以下报错npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本。执行以下命令解决Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned然后再次查看版本应该就没有问题了。3. 创建 pj.js 文件在 Typora 安装目录的resources文件夹下创建pj.js文件。例如E:\Typora\resources\pj.js重要打开pj.js文件找到以下代码行将路径替换为你自己的 Typora 安装路径使用vscode打开左侧搜索按钮输入Typora_Installation_Path找到路径位置输入你的Typora安装位置。const Typora_Installation_Path E:\\Typora;注意路径中的反斜杠要写成双反斜杠\\pj.js的完整代码见本文附录。三、开始激活1. 打开命令行窗口在E:\Typora\resources路径下打开命令行窗口E: cd \Typora\resources2. 安装依赖执行以下命令安装所需的 npm 包npm install chalk4 asar readline-sync winreg electron/fuses3. 运行脚本node pj.js4. 按提示操作脚本运行后会依次提示输入机器码粘贴第一步复制的机器码输入邮箱随便输入一个格式正确的邮箱即可是否开启备份建议输入Y开启备份方便恢复是否开启调试建议输入N关闭调试按回车继续。5. 安装 native-reg回到命令行执行npm install native-reg6. 完成激活再次打开 Typora查看「我的许可证」即可看到已经激活成功四、常见问题Q为什么 Typora 不能安装到 C 盘A经验证Typora 安装到 C 盘可能导致破解失败。建议安装到 D 盘或其他非系统盘。Qnpm安装依赖时卡住了怎么办A可以尝试使用国内镜像源npm config set registry https://registry.npmmirror.comQ脚本运行报错怎么办A请确认Typora 安装路径正确且不含中文字符已关闭所有 Typora 进程后再运行脚本Q激活后还能正常更新吗A不建议更新。新版本可能会修复此激活方法。附录pj.js 完整代码以下是pj.js的完整代码请根据实际情况修改Typora_Installation_Path变量const asar require(asar); const chalk require(chalk); const fs require(fs); const path require(path); const { execSync } require(child_process); const readlineSync require(readline-sync); const WinReg require(winreg); const { flipFuses, FuseV1Options, FuseVersion } require(electron/fuses); function getInsertCode(EnableHookDebug, atobMachineCode, email, nowDateStr) { return /** Hook破解开始 */ const electron require(electron); // 是否启用劫持调试 const HookDebug ${EnableHookDebug ? true : false}; // 调试日志定义 const LOG_PATH .\\\\Typora_Hook_Log.txt; //fs.rmSync(LOG_PATH, { force: true }); function writeLog(...data) {} // 开启调试窗口阻止关闭 app.quit 调用 // Hook Electron 模块监控 BrowserWindow 实例化及阻止 app.quit 调用 // Node模块require后会进行缓存即使再次require会指向同一个对象 if (HookDebug) { Object.defineProperty(electron.app, quit, { value: function () { writeLog([️ 拦截] 程序试图调用 app.quit()已阻止。); }, writable: true, configurable: true, }); electron.app.on(browser-window-created, (_event, win) { writeLog(〖 监控〗检测到 BrowserWindow 实例化); // 确保dom-ready后再打开DevTools 否则第一个窗口可能会无法打开 win.webContents.once(dom-ready, () { writeLog(〖〗打开 DevTools...); win.webContents.openDevTools({ mode: detach }); }); }); } // Hook fs 模块重定向对 resources/app 目录的访问 // resources/app/ → resources/app.bak/ const fsPathFrom /resources[\\\\/]app[\\\\/]/i; const fsPathTo resources\\\\app.bak\\\\; const fsHook {}; [ readFileSync, readFile, statSync, stat, Stats, StatsFs, open, openSync, ].forEach((property) { fsHook[property] fs[property]; fs[property] function (filePath, ...args) { if (typeof filePath string fsPathFrom.test(filePath)) { const redirectPath filePath.replace(fsPathFrom, fsPathTo); writeLog(\[️ fsHook] 程序试图 fs.\${property} 重定向 \${filePath} -- \${redirectPath}\); return fsHook[property].call(this, redirectPath, ...args); } writeLog(\[️ fsHook] 程序试图 fs.\${property} \${filePath}\); return fsHook[property].call(this, filePath, ...args); }; }); const fsPromisesHook {}; [readFile, open, stat].forEach((property) { fsPromisesHook[property] fs.promises[property]; fs.promises[property] async function (filePath, ...args) { if (typeof filePath string fsPathFrom.test(filePath)) { const redirectPath filePath.replace(fsPathFrom, fsPathTo); writeLog( \[️ fsHook/Promises] 程序试图 fs.promises.\${property} 重定向 \${filePath} -- \${redirectPath}\ ); return fsPromisesHook[property].call(this, redirectPath, ...args); } writeLog( \[️ fsHook/Promises] 程序试图 fs.promises.\${property} \${filePath}\ ); return fsPromisesHook[property].call(this, filePath, ...args); }; }); // IPC 通信进行监控 if (HookDebug) { const invokeFilter [document.addSnapAndLastSync, document.setContent]; const originalIpcMainHandle electron.ipcMain.handle; electron.ipcMain.handle function (channel, listener) { const filter !invokeFilter.includes(channel); return originalIpcMainHandle.call(this, channel, async (event, ...args) { filter writeLog( \[IPC 请求] 收到 .invoke(\${channel}) 参数:\, JSON.stringify(args) ); try { const result await listener(event, ...args); filter writeLog( \[IPC 响应] .handle(\${channel}) 返回结果:\, JSON.stringify(result) ); return result; } catch (error) { filter writeLog(\[IPC 错误] .handle(\${channel}) 执行出错:\, error); throw error; } }); }; } const crypto require(crypto); const originalPublicDecrypt crypto.publicDecrypt; crypto.publicDecrypt function (key, buffer) { if (HookDebug) { writeLog(-------------------------------------------); writeLog(〖 监控〗 crypto.publicDecrypt 被调用); writeLog(Key:, key); writeLog(Buffer (Hex):, buffer.toString(hex)); } // return originalPublicDecrypt.call(this, key, buffer); // 直接返回伪造的明文 Buffer return Buffer.from( JSON.stringify({ deviceId: ${atobMachineCode.l}, fingerprint: ${atobMachineCode.i}, email: ${email}, license: Cracked_By_DreamNya, version: ${atobMachineCode.v}, date: ${nowDateStr}, type: DreamNya, }) ); }; // 劫持联网验证 electron.app.whenReady().then(() { electron.protocol.handle(https, async (request) { writeLog(\[electron.net Request] \${request.method} \${request.url}\); writeLog(request.url typeof:, typeof request.url, value:, request.url); // 拦截目标请求伪造响应 if (request.url https://store.typora.io/api/client/renew) { if (HookDebug){ writeLog(\[️ 拦截] 伪造激活验证响应: {success:true, msg: \${btoa(DreamNya)}}\); } return new Response( JSON.stringify({ success: true, msg: btoa(DreamNya) }), { status: 200, headers: { content-type: application/json } }, ); } if (HookDebug) { // 尝试打印 Request Body try { const reqClone request.clone(); const reqBody await reqClone.text(); if (reqBody) { writeLog([electron.net Request Body]:, reqBody); } } catch { } // 其他请求正常转发 const response await electron.net.fetch(request, { bypassCustomProtocolHandlers: true }); // 克隆响应用于日志 const resClone response.clone(); resClone.text().then((resText) { writeLog(\[electron.net Response] \${response.status} \${request.url}\); writeLog([electron.net Response Body]:, resText.substring(0, 500)); }).catch((err) { console.error([electron.net Response Error]:, err); }); return response; } }); }); /** Hook破解结束 */ ; } let EnableBackup false; let EnableHookDebug false; const Typora_Installation_Path D:\\Software\\Typora; // ⚠️ 请修改为你的实际路径 const resourcesPath path.join(Typora_Installation_Path, resources); const asarPath path.join(resourcesPath, app.asar); const appDir path.join(resourcesPath, app); const appBakDir path.join(resourcesPath, app.bak); const asarBakPath path.join(resourcesPath, app.asar.bak); const TyporaEXE path.join(Typora_Installation_Path, Typora.exe); const LaunchDistJS path.join(appDir, launch.dist.js); // 随机生成一个符合前端验证格式的注册码 function generateRegCode() { const chars ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789; let code ; for (let i 0; i 8; i) { code chars.charAt(Math.floor(Math.random() * chars.length)); } code #; return code; } function closeTyporaProcesses() { try { execSync(taskkill /F /IM Typora.exe); console.log(chalk.green(已关闭所有 Typora.exe 进程)); } catch (e) { console.log(chalk.red(Typora.exe 未运行或关闭失败,请手动关闭后继续。)); } console.log(chalk.yellow(已尝试自动关闭所有 Typora.exe 进程如果未关闭请手动关闭后再运行此程序。)); console.log(chalk.cyan(请按回车键继续...)); readlineSync.question(); } function setRegValue(regKey, name, value) { return new Promise((resolve, reject) { regKey.set(name, WinReg.REG_SZ, value, function (err) { if (err) reject(err); else resolve(); }); }); } function getNowDateStr() { const now new Date(); const dd String(now.getDate()).padStart(2, 0); const mm String(now.getMonth() 1).padStart(2, 0); const yyyy now.getFullYear(); return ${mm}/${dd}/${yyyy}; } const nowDateStr getNowDateStr(); // 要求输入机器码和邮箱 console.log(chalk.cyan(请输入机器码: )); const machineCode readlineSync.question(); console.log(chalk.cyan(请输入邮箱: )); const email readlineSync.question(); // 询问是否开启备份默认开启与调试默认关闭 console.log(chalk.cyan(请选择是否开启备份与调试选项:)); console.log(chalk.cyan(〖建议开启〗是否开启备份(Y/N): )); const backupAnswer readlineSync.question(); console.log(chalk.cyan(〖建议关闭〗是否开启调试(Y/N): )); const debugAnswer readlineSync.question(); EnableBackup backupAnswer.toLowerCase() y; EnableHookDebug debugAnswer.toLowerCase() y; // Base64 解码 function atob(str) { return Buffer.from(str, base64).toString(utf-8); } const atobMachineCode JSON.parse(atob(machineCode)); console.log(chalk.yellow(deviceId: atobMachineCode.l)); console.log(chalk.yellow(fingerprint: atobMachineCode.i)); console.log(chalk.yellow(version: atobMachineCode.v)); // 关闭所有 Typora.exe 进程 closeTyporaProcesses(); console.log(chalk.green( 开始破解... )); async function main() { // 一、反反调试 console.log(chalk.yellow(一、正在进行反反调试操作...)); console.log(chalk.yellow(解包 asar)); await asar.extractAll(asarPath, appDir); console.log(chalk.yellow(复制 app 到 app.bak递归复制〖应对完整性校验〗)); // 2. 复制 app 到 app.bak递归复制 function copyDir(src, dest) { if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true }); for (const entry of fs.readdirSync(src, { withFileTypes: true })) { const srcPath path.join(src, entry.name); const destPath path.join(dest, entry.name); if (entry.isDirectory()) { copyDir(srcPath, destPath); } else { fs.copyFileSync(srcPath, destPath); } } } copyDir(appDir, appBakDir); console.log(chalk.yellow(移除 app.asar 文件)); // 3. 重命名 app.asar 为 app.asar.bak if (EnableBackup) { fs.renameSync(asarPath, asarBakPath); } else { fs.rmSync(asarPath, { force: true }); } console.log(chalk.yellow(修改 Typora.exe 的 fuse 配置允许加载未打包的 app 目录)); if (EnableBackup) { // 修改前先备份 fs.copyFileSync(TyporaEXE, ${TyporaEXE}.bak); } // 修改fuse配置同时会修改程序hash flipFuses(TyporaEXE, { version: FuseVersion.V1, [FuseV1Options.OnlyLoadAppFromAsar]: false, }); console.log(chalk.green(反反调试操作完成)); // 二、注入破解代码 console.log(chalk.yellow(二、正在注入破解代码到 launch.dist.js...)); // 读取原文件内容 let content fs.readFileSync(LaunchDistJS, utf-8); // 查找第一个require语句后的分号 const requireRegex /require\([^)]\);/; const match requireRegex.exec(content); if (match) { const insertPos match.index match[0].length; const insertCode getInsertCode(EnableHookDebug, atobMachineCode, email, nowDateStr); // 插入代码 content content.slice(0, insertPos) insertCode content.slice(insertPos); fs.writeFileSync(LaunchDistJS, content, utf-8); console.log(chalk.green(成功插入破解代码到 launch.dist.js)); } else { console.log(chalk.red(未找到 require 语句破解代码未插入launch.dist.js。)); } console.log(chalk.green(注入破解代码完成)); // 三、修改注册表 console.log(chalk.yellow(三、正在修改注册表以关闭联网验证...)); // 修改注册表尽量关闭联网验证 const regKey new WinReg({ hive: WinReg.HKCU, key: \\Software\\Typora, }); try { await setRegValue(regKey, SLicense, RHJlYW1OeWE#0#1/1/2029); console.log(chalk.green(SLicense 注册表字段写入成功)); await setRegValue(regKey, IDate, nowDateStr); console.log(chalk.green(IDate 注册表字段写入成功)); } catch (err) { console.log(chalk.red(写入注册表失败:), err); } console.log(chalk.green( 破解完成使用愉快)); console.log(chalk.yellow(后续操作建议\n)); const regCode generateRegCode(); console.log(chalk.green(\t1.您的注册码为${regCode} 请复制并用于激活。)); } main();本文参考自 host-fun.com经测试在 Typora 1.14.9版本上可用。