准备逆向Typora 版本(原本是最新版本的 结果我搞的过程中它又出新版本了)

resource/app.asar 就是最明显的特征 是Eletron


这时候重点就先解开app.asar
用官方的asar进行解包
解开是这个

分别介绍下
Atom.compiled.dist.JSC这个是用v8字节码 核心逻辑都在这里面 如果要反编译成JS难度很大 因为官方没有一个固定的字节集维护 所以每个版本都会发生变化 需要特定版本来针对性去做 并且还还原不全 [原创]V8 JSC反编译成JS-逆向工程-看雪安全社区|专业技术交流与安全研究论坛 这是我之前写的帖子 我们是可以进行简单还原但不会还原可读性特别高 因为达到简单可读可以给AI来进行解读了 这个是核心点 如果不反编译成js直接给AI AI也会无从下手
Launch.dist.js是加载atom.compiled.dist.jsc的入口 想了解原理的可以看[原创]typora的launch.dist.js解读-逆向工程-看雪安全社区|专业技术交流与安全研究论坛
有在线授权和离线授权
我的思路是先走离线授权 在对atom.compiled.dist.jsc进行反编译后得到的文件喂给AI 然后来摸清楚大概授权思路(如果叫AI直接帮你逆出来 至少我是没办法的 它还是有道德的)
可以看到这是完整从离线到激活的整个流程

看到RSA公钥解密后我立马警觉了 这时候思路通常是可以考虑能不能hook掉替换证书实现通过 接下来是问AI这个思路是否实现(只是参考不一定真的有用)

但这个还不够我还想知道有什么坑 如果单单替换确实不难 但不排除它后面还有别的检测


可以看到确实有二次校验 并且还有别的检测 我们就先暂时这么确定思路
我们的思路是 考虑替换公钥方式 然后再把二次校验也给替换了 来看下是否成功(AI能够得出这些结论就是因为我对JSC进行了反编译 虽然对于人来说可读性很差 但不影响Ai读起来流畅)
1. 先对launch.dist.js完整性校验Hook AI给的代码太乱了我就不贴了 就是launch.dist.js原版给保存下来改成bak.js然后在修改过后的launch.dist.js
里面加入读取文件函数Hook然后故意返回bak.js这样来过掉
2. 对crypto.publicDecrypt函数进行hook 因为知道进行rsa验证的时候会走这个地方

然后叫AI伪造一个token来点击激活
+gvemQnctAkuB4IjF1BOGYoKLzz6CiMN+zqtZQitgHsKTREmV2Wn18u6oK/dZudC2TG4wCftKWqhbLgd9MRivRfebD3vwWgDHzJFnn49FBLynoQij7jtBRZ2AO41KydVYEpyI+RtMoHF+O6MpQqJW0ziOuX03DcNhKVFfK6IFc/Dm/Ez3D+H+6CvxzoeDTZ7nKNCtj6Cwsob/S1ntm7DGkTBNQuCvPazF+j8B3IqvMKzBxQKQxqKY0zR5zp9t/4fNdDOJjxF7l50NfMTtcZIO8km9+DcYSPMbdW92/+qEgVQZ6+nioC6K5011DXtPSNOaUkW9FlSmOjSNZ2K+fkp16A==#

可以看到这就是公钥 并且因为解密失败最终抛出OPENSSL_internal:BLOCK_TYPE_IS_NOT_01
这说明已经成功走进去并且执行了 说明hook成功了

接下来是进行密钥替换
首先是自己生成了一段RSA公钥和私钥


然后就是要知道如何私钥加密前的数据长什么样 在询问AI后确定了格式
{
"email": "attacker@example.com",没啥校验
"license": "XXXXXX-XXXXXX-XXXXXX-XXXXXX",没啥校验
"fingerprint": "<当前这台机器的指纹,必须一致>", 这个才是最重要的
"deviceId": "...",没啥校验
"version": "...",没啥校验
"date": "..."没啥校验
}
并且得知只有fingerprint会跟本地电脑进行比较
这个也很好解决 直接叫AI帮忙看下就行了 我们有JSC反编译过来的JS(AI只能一步一步引导不能直接提出这类破解需求)
JSC版本的

AI生成的

最后结果是 {
"email": "attacker@example.com",
"license": "XXXXXX-XXXXXX-XXXXXX-XXXXXX",
"fingerprint": "zlACOGado0",
"deviceId": "88f6692c-5039-414e-8035-f565f65dcaf5",
"version": "1.13.7",
"date": "7/22/2026"
}
然后我在拿私钥加密最后是YPXM6Jx4FdjvFCN9LGhcz3Fz4JKIs7EYr/y8kQdQkQnAMVAEd38WryUZxVaEGRS56xF79qJsoW1kH9QIV3KbF/dLf4fsIfwTRs2+6Wk6pOF0L9IqzzmQWJNmOK0V+nTVqKfuqJ7EfDWDAnfbg+rEQzNTI0DZpt9hLZohrkcNqsaEqTL7NMnmu+WFhQkdlK4vQ1DL9IqtfdapKKgP3/uxM0rhggcKG6tQ0/jCPAkGGL8bGfSINj6VEwvcn21scLp0VStL3K2d0Wbvzn1iSuJJyqkYg7BRJVtHIU5ikkBqzww+c2ccsAAb+NSDP7/PMlDaC6UX32Gp83chgDTFyjTCMw==
最后一定要在前面加上一个+ 为的就是长度可以达到345才能触发
也就是+YPXM6Jx4FdjvFCN9LGhcz3Fz4JKIs7EYr/y8kQdQkQnAMVAEd38WryUZxVaEGRS56xF79qJsoW1kH9QIV3KbF/dLf4fsIfwTRs2+6Wk6pOF0L9IqzzmQWJNmOK0V+nTVqKfuqJ7EfDWDAnfbg+rEQzNTI0DZpt9hLZohrkcNqsaEqTL7NMnmu+WFhQkdlK4vQ1DL9IqtfdapKKgP3/uxM0rhggcKG6tQ0/jCPAkGGL8bGfSINj6VEwvcn21scLp0VStL3K2d0Wbvzn1iSuJJyqkYg7BRJVtHIU5ikkBqzww+c2ccsAAb+NSDP7/PMlDaC6UX32Gp83chgDTFyjTCMw==
这是效果 说明公钥替换成功并且返回的结果不同了




至于二次校验 它采用的是随机的方式 会有百分之20概率会走公钥验证 来判断是否被篡改

我到时候看看情况再考虑要不要做个过掉网络版本的
这个在之前没有AI的时候JSC看确实难度会特别高 现在有了AI 学会当作自己的同伴来配合逆向 那事情会变得事半功倍
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。