Thomas717 发表于 2021-11-28 14:00

Typora 1.x 加密密钥

Typora 1.x版本开始收费了,多年以来我一直认为这个翻译都是社区支持的软件应该是开源软件。

asar unpack之后,文件被加密了,base64解码后去掉前16字节就是密文,密钥如下:

算法:AES-256 CBC模式
密钥:4EE1B382949A024B802F52B4B4FE57F1BEF40853109256E2C20DECA3DD8DD56D
IV:文件前16字节

可以使用openssl解密文件:
openssl enc-aes-256-cbc -d -in enc.bin -out dec.js -iv xxxxxxxxxx -K 4EE1B382949A024B802F52B4B4FE57F1BEF40853109256E2C20DECA3DD8DD56D

最近超级忙,遇到了顺手做了一下分析,欢迎大家继续研究。

iokeyz 发表于 2021-11-29 23:37

太强了,感谢楼主分享!
一个一个的调用 openssl 解密太麻烦了,写了个 python 脚本,放在目录里执行自动解密
import os
from base64 import b64decode
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding


def dec(filename):
    with open(filename, 'rb') as file:
      fileb = b64decode(file.read())
      iv = fileb[:16]
      key = bytes.fromhex('4EE1B382949A024B802F52B4B4FE57F1BEF40853109256E2C20DECA3DD8DD56D')
      cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
      decryptor = cipher.decryptor()
      filed = decryptor.update(fileb) + decryptor.finalize()
      dest = open(filename+'-dec.js', 'wb')
      unpadder = padding.PKCS7(128).unpadder()
      data = unpadder.update(filed) + unpadder.finalize()
      dest.write(data)
      dest.close()


point = os.walk('.')
for pwd, dirl, filel in point:
    for filename in filel:
      if filename.endswith('js'):
            dec(filename)
            

Ursule 发表于 2021-11-30 15:37

改无限试用,去除弹窗,License.js

- 修改 License.js 试用期时间的相关代码

- ```js
    getTrailRemains = (e, n) => {
            n = n || 15;
            var t = Math.floor((new Date - installDate) / 864e5),
                    i = Math.max(0, n - t);
            return e && (i > n || isNaN(i)) && (i = n), i
    }, validateTrail = async () => {
            var e = (installDate = getInstallDate(!global.devVersion)) ? getTrailRemains(!1) : 100;
            (e > 15 || isNaN(e)) && (console.log(" Read from incorrupted InstallDate"), await writeInstallDate(!0), e = 15), console.log(` installDate is ${installDate.toLocaleDateString("en-US")}, trail remains: ${e} days`)
    };
    ```

- ```js
    getTrailRemains = (e, n) => {
            n = n || 15;
            var t = Math.floor((1000) / 864e5),
                    i = Math.max(0, n - t);
            return e && (i > n || isNaN(i)) && (i = n), i
    }, validateTrail = async () => {
            var e = (installDate = getInstallDate(!global.devVersion)) ? getTrailRemains(!1) : 100;
            (e > 15 || isNaN(e)) && (console.log(" Read from incorrupted InstallDate"), await writeInstallDate(!0), e = 15), console.log(` installDate is ${installDate.toLocaleDateString("en-US")}, trail remains: ${e} days`)
    };
    ```

- 修改试用期弹窗

- ```js
    showLicensePanelIfNeeded = function() {
                    shouldShowNoLicenseHint(!0) && !app.setting.inFirstShow && (isLinux && Math.random() < .95 || (!lastShown || new Date - lastShown > 36e5 * (isLinux ? 4 : 2) || getTrailRemains(!0, 20) <= 0) && showLicensePanel())
            };
    ```

- ```js
    showLicensePanelIfNeeded = function() {
                    1! && !app.setting.inFirstShow && (isLinux && Math.random() < .95 || (!lastShown || new Date - lastShown > 36e5 * (isLinux ? 4 : 2) || getTrailRemains(!0, 20) <= 0))
            };
    ```

夜泉 发表于 2021-11-30 04:40

本帖最后由 FleTime 于 2021-11-30 09:14 编辑

iokeyz 发表于 2021-11-29 23:37
太强了,感谢楼主分享!
一个一个的调用 openssl 解密太麻烦了,写了个 python 脚本,放在目录里执行自动 ...
只需要解密 License.js 就可以了。。。

删除

侠骨留香喵 发表于 2021-11-29 16:44

涛之雨 发表于 2021-11-29 16:13
是不是有什么特殊的操作,我咋没尝试成功啊。。。
bad decrypt
428 ...

根据大佬们的说明,操作了下。版本1.0.2,asar unpack之后,base64解码后去掉前16字节就是密文。
比如 License.js 这个文件,先对文件进行base64解码,将解码后的文件存储为enc.bin,然后取enc.bin的前16字节作为IV,把enc.bin的前十六字节删掉保存下,然后去用openssl解密。
openssl enc -aes-256-cbc -d -in enc.bin -out dec.js -iv C5FB9AB8FF74A684417F9A00153F3B0C -K 4EE1B382949A024B802F52B4B4FE57F1BEF40853109256E2C20DECA3DD8DD56D
IV 是 C5FB9AB8FF74A684417F9A00153F3B0C ,解密是可以得到 js 文件的。

Thomas717 发表于 2021-11-29 18:36

涛之雨 发表于 2021-11-29 09:06
强啊,我只找到了开源库,然后dump到了js
开源库:https://github.com/toyobayashi/electron-asar-encrypt ...

看了一下好像就是这个库,这个密钥就是js加密用的密钥了,测试已经可以解密出源码了。
这个可以对control flow做启发式分析,自动dump出key的,特征非常非常明显。
版主大大如果习惯写Electron,有时间的话要不用这个密钥重写打包一个给大伙用呗哈哈哈哈。

Hack3rHan 发表于 2021-11-29 09:35

Vvvvvoid 发表于 2021-11-29 09:23
尴尬了, 寻求 MarkDown 跨平台替代品

开源跨平台替代品,Mark Text

clanna 发表于 2021-11-29 14:28

好家伙, 刚收费, 就开始了, 不愧是吾爱

涛之雨 发表于 2021-11-29 09:46

云烟成雨 发表于 2021-11-29 09:34
这个密钥是干嘛用的,有了这个密钥还不能注册吧,期待大佬继续努力

就可以解密出js,然后自己改{:301_1001:}
其实最理想的状态是dll注入,包更新那种

涛之雨 发表于 2021-11-29 09:06

本帖最后由 涛之雨 于 2021-11-29 09:13 编辑

强啊,我只找到了开源库,然后dump到了js
开源库:https://github.com/toyobayashi/electron-asar-encrypt-demo
其实我一直想找一个通用爆破点,
比如植入js或者劫持js等等,反正就是不需要更新重新解包了。。。
不然多麻烦啊
(俗称通用破解补丁)

神幻静 发表于 2021-11-29 09:18

居然还收费了,还好我一直没更新过。。。。

Vvvvvoid 发表于 2021-11-29 09:23

尴尬了, 寻求 MarkDown 跨平台替代品

kotlyne 发表于 2021-11-29 09:25

不更新还能用,哈哈

云烟成雨 发表于 2021-11-29 09:34

这个密钥是干嘛用的,有了这个密钥还不能注册吧,期待大佬继续努力

Andy6ro 发表于 2021-11-29 09:50

感谢分享~

云烟成雨 发表于 2021-11-29 09:58

涛之雨 发表于 2021-11-29 09:46
就可以解密出js,然后自己改
其实最理想的状态是dll注入,包更新那种

哦豁,不过我觉得现在1.0版本刚出,跟之前的免费版本也没多少变化,我还是直接用以前免费版本算了,等他更新多了再看看
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Typora 1.x 加密密钥