Mas0n
to be reverse engineer🐧
翻车鱼

Typora 授权解密与剖析

Typora 授权解密与剖析

11月23日,Typora 正式发布 1.0 版本,进入了收费时代。

1.0 版本是一次性付费而非订阅的,只要支付人民币 89 元,可以在 3 台设备里使用。

Typora之于我

如你所见,这一篇文章就是使用Typora所写。自搭建个人博客起,Typora就成为了我主要的写作平台。

用惯了Markdown,WordPress的古腾堡编辑器没法满足我的需求,于是开始寻找替代品,最终的结果便是typora。

当然,多数人使用的原因不外乎以下

  • 轻盈、干净
  • 所见即所得
  • 图床
  • 主题、生态
  • (beta)免费
  • ……

如今,typora进入收费阶段,不乏使用者被迫迁移至其他写作工具上。

(不扯了官方话了)下面,我们来一探究竟。

warning 敬告
请勿使用盗版,支持正版授权。 文中内容仅作学习和讨论,请不要从事任何非法行为。 由此产生的任何问题都将读者/用户(您)承担。

寻踪觅源

通过火绒剑监测行为日志

程序加载的一些模块

https://cdn.shi1011.cn/2021/11/3771571942bbe3bf941ee6a90108bd00.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

在Windows下,typora会记录日志至{UsersRoot}\AppData\Roaming\Typora\typora.log

能看到可疑的注册表操作记录

https://cdn.shi1011.cn/2021/11/860f321171f713980c055971082f8ebf.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

正版激活的注册项内容

https://cdn.shi1011.cn/2021/11/15776e7f4b16bbaef4bbae26014a89d0.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

尝试修改SLicense

https://cdn.shi1011.cn/2021/11/19442693ecbcb2c51f253ca0846fb684.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

重新运行软件后,从日志中发现调用栈暴露。

https://cdn.shi1011.cn/2021/11/1587330887a635f956a533eb020b059f.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

渐入佳境

这里关注到了app.asar

通过搜索引擎,尝试解包

npm install -g asar
asar extract {installRoot}/Typora/resources/app.asar workstation/outs

发现文件被加密

https://cdn.shi1011.cn/2021/11/2a036d6d4af1cd25eeb63fe2d48c6626.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

JavaScript不管是字节码还是明文脚本都会在运行时加载,结合模块列表寻找加载点

关注到解包得到的main.node

https://cdn.shi1011.cn/2021/11/05d548547ac90c472c81b94e538706f5.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

字符串特征

https://cdn.shi1011.cn/2021/11/4438944dcb2dd3f3370b393954ddc40c.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5
https://cdn.shi1011.cn/2021/11/d833eda9629ea0bce11290f8ed814b2a.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

通过交叉引用定位

看到一些导入函数

https://cdn.shi1011.cn/2021/11/c9154b6f15b1f571c2ddac20db9b78cf.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

由字符串联想到对加密文件进行的base64解码

导入表查找到 napi Node-API | Node.js API 文档 (nodejs.cn)

简单分析伪代码后,其实就是运行

Buffer.from(e,"base64")

刻舟求剑

尝试Findcrypt寻找算法,找到AES的Sbox和InvBox

通过交叉引用定位到可疑函数点 main.node+E440

IDA动态调试,模块加载断点

https://cdn.shi1011.cn/2021/11/fd39951569ad60c3c0fe646643b622fa.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

跑起来,直至加载main.node

https://cdn.shi1011.cn/2021/11/4a2a1136c8363c6bde1f4174aaf3e35c.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

分析模块后,定位base+offset下断,运行

看到

https://cdn.shi1011.cn/2021/11/98d6520ff594e426d90bcaeaf2e778f9.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

正好与我们的文件对应偏移16

https://cdn.shi1011.cn/2021/11/6848a27fea1455032fdf9514520b41fe.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

继续调试能看到 分组加密的形式

https://cdn.shi1011.cn/2021/11/c7685df694fab4e1af2cb6aa6e8eee7c.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

同时能够找到前16字节

https://cdn.shi1011.cn/2021/11/552efb63b5f91f918c62a92de10defc0.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

正是作为iv进行异或

https://cdn.shi1011.cn/2021/11/a25d344105c14a9ac2f2eb59b04f1b24.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

柳暗花明

分析调用函数,最终能够确定其函数功能

https://cdn.shi1011.cn/2021/11/447e66f90bc5941ee765381f53c0dd18.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

通过偏移EF19,能够确定AES轮数为13轮,对应为AES 256

偏移B510处的函数,能够得到AESKey

https://cdn.shi1011.cn/2021/11/2568ddbfb42c306266dcc40c7a1cb0ef.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

落叶归根

解密得到明文脚本,授权主逻辑在Lisence.js中

授权逻辑如下图

https://cdn.shi1011.cn/2021/11/a1b785a440a508a647ca877986e9c05c.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

本地验证->获取用户特征->网络验证授权->返回密文->RSA公钥解密->设备指纹对比

破解的思路,不多做阐述。

修改完成后,只需要按相同格式加密并打包为app.asar即可实现补丁Patch

typoraCracker

typoraCracker是一个Typora解包解密程序,也是一个打包加密程序。你可以轻松的打造独属于你的补丁,但请注意法律上的可行性。

测试

总有一种人,喜欢享受“正版”激活的感觉。而我就是……

我采用 Patch+KeyGen

补丁去除网络授权,KeyGen用于本地验证,测试成功

https://cdn.shi1011.cn/2021/11/ba74d1bdb6d5c709238be50fe92a204f.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5

尾声

typora针对electron下的源码加固仍是一片空白。

简单思考后,传统代码混淆的方式对关键逻辑的保护依然有较大的提升空间,不失为一个恰当的加固方向。

期待typora会越做越好

来自一个正版使用者
本文链接:https://blog.shi1011.cn/rev/1891
本文采用 CC BY-NC-SA 4.0 Unported 协议进行许可

Mas0n

文章作者

回复 Mas0n 取消回复

textsms
account_circle
email

  • J

    现在的新版typora使用typoraCracker好像已经不能破解了

    2年前 回复
    • Mas0n博主

      @J: 我这里1.1.3-1 for ubuntu 以及 1.1.3 for windows 测试正常

      2年前 回复
  • 那我就让时光倒流

    大佬tql,能加个好友吗

    2年前 回复
  • Jason

    大佬github的repo被DCMA 下架,不能用了。能麻烦在gitlab或者gitttee再开一个repo吗?

    2年前 回复
  • thanks

    尝试了1.3.8和1.4.8,都失败了,是改了iv,还是改了轮数呢?

    1年前 回复
    • Mas0n博主

      @thanks: 抱歉, 现在才看到你的评论。此方案依旧有效。每个版本都会随机生成Key/Iv。

      1年前 回复

翻车鱼

Typora 授权解密与剖析
11月23日,Typora 正式发布 1.0 版本,进入了收费时代。 1.0 版本是一次性付费而非订阅的,只要支付人民币 89 元,可以在 3 台设备里使用。 Typora之于我 如你所见,这一篇文章…
扫描二维码继续阅读
2021-11-30