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
最近超级忙,遇到了顺手做了一下分析,欢迎大家继续研究。 太强了,感谢楼主分享!
一个一个的调用 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)
改无限试用,去除弹窗,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))
};
``` 本帖最后由 FleTime 于 2021-11-30 09:14 编辑
iokeyz 发表于 2021-11-29 23:37
太强了,感谢楼主分享!
一个一个的调用 openssl 解密太麻烦了,写了个 python 脚本,放在目录里执行自动 ...
只需要解密 License.js 就可以了。。。
删除 涛之雨 发表于 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 文件的。 涛之雨 发表于 2021-11-29 09:06
强啊,我只找到了开源库,然后dump到了js
开源库:https://github.com/toyobayashi/electron-asar-encrypt ...
看了一下好像就是这个库,这个密钥就是js加密用的密钥了,测试已经可以解密出源码了。
这个可以对control flow做启发式分析,自动dump出key的,特征非常非常明显。
版主大大如果习惯写Electron,有时间的话要不用这个密钥重写打包一个给大伙用呗哈哈哈哈。 Vvvvvoid 发表于 2021-11-29 09:23
尴尬了, 寻求 MarkDown 跨平台替代品
开源跨平台替代品,Mark Text 好家伙, 刚收费, 就开始了, 不愧是吾爱 云烟成雨 发表于 2021-11-29 09:34
这个密钥是干嘛用的,有了这个密钥还不能注册吧,期待大佬继续努力
就可以解密出js,然后自己改{:301_1001:}
其实最理想的状态是dll注入,包更新那种 本帖最后由 涛之雨 于 2021-11-29 09:13 编辑
强啊,我只找到了开源库,然后dump到了js
开源库:https://github.com/toyobayashi/electron-asar-encrypt-demo
其实我一直想找一个通用爆破点,
比如植入js或者劫持js等等,反正就是不需要更新重新解包了。。。
不然多麻烦啊
(俗称通用破解补丁) 居然还收费了,还好我一直没更新过。。。。 尴尬了, 寻求 MarkDown 跨平台替代品 不更新还能用,哈哈 这个密钥是干嘛用的,有了这个密钥还不能注册吧,期待大佬继续努力 感谢分享~ 涛之雨 发表于 2021-11-29 09:46
就可以解密出js,然后自己改
其实最理想的状态是dll注入,包更新那种
哦豁,不过我觉得现在1.0版本刚出,跟之前的免费版本也没多少变化,我还是直接用以前免费版本算了,等他更新多了再看看