前言
似乎是本地算法。。。(我也挺莫名其妙。。。)
首先是看一下注册成功后的效果:
上图左边正常使用pro
,右边显示正常“注册”,有时候会弹出过期(如下图)或者试用的窗口(如上图右下角)
PS:
虽然右下角每次都会弹窗(有时候是试用,有时候是升级pro,有时候是过期)
但是能用就好不是。。。
当然,改js
也不是不行。。。但是每次更新都要改就挺烦的,
能“正规注册”为什么要改代码(笑~)
VSCODE
恢复未激活的状态
删除用户文件夹下的.wallaby
和.quokka
文件夹即可
注:会导致vscode
中的该插件个性化配置丢失
vscode
中不是很会调试插件(需要插件的debug
模式,但是因为是打包的,不会进),
但是我们可以通过一些特征找到相关的判断(和算法)|
根据前辈的相关教程,可以找到vscode
的控制台和该插件的目录
vscode 控制台 |
插件目录 |
|
|
找判断
点开quokka的欢迎、说明、激活、新功能介绍多合一页,一顿搜索,发现了是本地进行判断的
而且看到文件名就是main.js
,格式化、搜索、翻看、猜,
一顿操作猛如虎,看到赋值的地方
很好,没混淆,可以省不少事情。
分析算法
又是根据node地常识和相关说明文档[官方&中译],
找到相关的package.json
配置,
并且根据关键词:licenseDetails
在文件夹里搜索,
即可在dist
文件夹中找到相关的函数:
(因为相关代码过长,不方便直接查看,因此这里我放上截图可能会好点(【本截图生成的网站】,感觉效果还不错)
跟着代码走,因为是插件,哪里不知道还可以打一个log
,比如t
应该是时间戳,i
就是构建的一个验证相关的对象,但是n.quokkaConfigPath
这个路径是什么这里没有,而我也不想全局搜索,完全可以通过日志打印出来
注:目前本人只知道字符串,数字布尔等基础类型可以直接通过log打印,
但是因为插件并非调试模式,因此无法打印object或者是下debugger
断点
如果有大佬们知道如何调试非调试模式的vscode
插件
还希望能不吝赐教
比如:
console.log(`n.quokkaConfigPath:${n.quokkaConfigPath},n.olp${n.olp}`);
重新加载插件,即可获得相关的数据
最终的逻辑大概是:
L43
-读取.qlc
文件
L57
-base64
解码后以\n
分割,第二行s[1]
以,
分割
- 分割后的内容:
第一行是用户名(注册人),(s[0]
)
第二行第一字段为邮箱(a
)
第二行第二字段为授权方式(o
,company
“企业”和enterprise
“商业”,这两种授权无“更新链接”)
第二行的第三四字段此处未读取,未知;
第二行第五字段为代{过}{滤}理商(r
)
第二行第六字段为试用标识(l
,1
表示试用)
第三行是日期,以/
分割,日/月/年
的顺序
由此我们拼接出我们想要的注册码:
5rab5LmL6ZuoQOWQvueIseegtOinowpjcmFja2VkIGJ5IHRhb3poaXl1LGVudGVycHJpc2UsLCwKMzAvMTIvMjk5OQ==
激活失败
此时我们还不知道有没有强制的服务器验证,
不过就算如果有的话就再改好了
因为需要确保能正常更新,所以我们甚至有可能会写个尝试写个vscode
插件,
加载的时候去动态修改代码,然后重新加载,以达到自动绕过验证的问题
结果很突兀地:
注册失败了。
找其它位置
不清楚什么原因,但是肯定方向是没错的,要不就是服务器验证,要不就是找错地方了。
继续找&搜索
通过进一步的搜索和查找,在黄框处看到了activateLicense
函数。
文件夹里搜索后,果然发现了有相关代码:
_activateLicense({ email: e, key: t }) {
if (!c.controller)
return void this._panel.webview.postMessage({
command: "activationError",
message: "VS Code has not finished loading, please try and activate again later.",
});
const i = new Date();
let s = !1;
c.controller.processLicenseChange(e || t, (e) => {
if (!s) {
s = !0;
const t = new Date() - i,
a = (e) => (t < 500 ? setTimeout(e, 500 - t) : e());
"notification" === e.type && (e = e.text),
"info" === e.type || "warning" === e.type ?
a(() =>
this._panel.webview.postMessage({
command: "activationSuccess",
message: e.text,
licenseDetails: c.getLicenseDetails(),
})
) :
a(() =>
this._panel.webview.postMessage({
command: "activationError",
message: e.text,
})
);
}
}),
e &&
setTimeout(() => {
s ||
((s = !0),
this._panel.webview.postMessage({
command: "activationError",
message: "A timeout occurred while attempting to validate your email address.",
}));
}, 25e3);
}
根据上述代码找到了processLicenseChange
的定义和其中的_parseLicenseKey
(驼峰好评,方便他人方便自己):
继续分析,发现跟之前的代码差不多,在L103
获取解析的key
,
在L111
判断改成了是否以Wallaby.js + Quokka.js
开始,
因此我们得到了新的注册码:
5rab5LmL6ZuoQOWQvueIseegtOinowpjcmFja2VkIGJ5IHRhb3poaXl1LFdhbGxhYnkuanMgKyBRdW9ra2EuanMgZW50ZXJwcmlzZSwsLDAKMzAvMTIvMjk5OQ==
written&generated BY: 涛之雨@吾爱破解
website:www.52pojie.cn
成功激活
似乎可以,录一个GIF吧,没有修改任何插件,直接输入注册码即可
不幸的是,插件的确有服务器验证,但是只有弹窗,关掉就好
(自然有可能以后会修复,但是至少现在是可以用的)
顺便说一下,如果真的那天有服务器验证了,除了每次修改代码之外,或许可以自己写个插件,然后自动判断有没有更新,如果更新了或者未对该插件代码进行修改的话就根据特征码修改这个插件然后重载(或者按照规范应该弹窗说明需要重启以重载)
PS:
价格好贵。。
sublime
等一下,似乎还支持多款软件?
JetBrains我只装了PyCharm
,应该不实用这个,又不想装了,第三个没听说过(我这里直连的话连其官网都打不开)
那我测试一下sublime
吧
可恶,难道不通用?!
打开插件目录看一下
zlib
和base64
双重编码么。直接把exec改成print输出一下
拿出来稍微替换转义符、格式化一下就得到“源码”了
甚至因为python没有“打包”概念的关系,因此解码后就是源码。
搜索注册错误提示的内容,并且找调用和判断,最终找到LicenseManager
,相关代码如下:
简要的看了一下,其实和之前分析的是一样的。不过L27
的地方多了一个判断,似乎要求是四行?但是没有其它什么特殊的要求,因此我们修改一下,重新尝试注册:
5rab5LmL6ZuoQOWQvueIseegtOinowpjcmFja2VkIGJ5IHRhb3poaXl1LFdhbGxhYnkuanMgKyBRdW9ra2EuanMgZW50ZXJwcmlzZSwsLCwwCjMwLzEyLzI5OTkK
written&generated BY: 涛之雨@吾爱破解
website:www.52pojie.cn
成功注册,并且vscode
和sublime
很贴心的同步注册上了。
回合结束。(正经人谁用sublime
撸码)
Idea测试
反正通过了,感谢 @正己 百忙中抽空帮我测试
(似乎不支持中文用户名,不过问题不大)
反正没人会看
注册码成品分享
自己想
吐槽一下
这个插件更新好快。。。