严正申明
本文参考自 吾爱破解论坛帖子的一则回复 并进行了实际上手
本文仅供学习讨论使用,请支持正版可道云,严禁将本文所介绍内容用于违法用途。
本文不会提供任何文件下载,伸手党绕道.
侵删。
准备环境
本次作为测试的是KodExplorer 4.4.0版本
于 Centos 下进行操作
开始折腾
*作为一款优秀的编辑器(误)
用Kod来破解Kod其实是一种非常好的选择*
安装Kod
过程不赘述...自行摸索即可
做一些探查
其实在很早之前,就有过对Kod进行一定的研究,当时的主要目的还是蹦着改版权去的(真是年少无知)
但其实版权这玩意是真不影响,但是在后来Kod升级到V4版本后,功能真的更新巨大,但是同时也迎来了完全商业化...
其中,一个很刚需的功能:用户数和群组数 就被限制了
也确实破解成功了,但是仅仅是让kod不再限制用户数,破解方法也非常简单...修改某个函数名就可以了(大佬轻点)
首先我们打开DevTools,然后访问一下我们刚刚安装好的Kod,只要你翻找过,就一定会对这一条请求感兴趣:

这里头可以看到,他做了两件事:
1,向Kod服务器携带安装的Kod的一些信息请求授权状态
2,返回过来一段js,检查是否修改了本地js里面的
core.versionType
并纠正,然后根据版本判断版权相关内容是否被包含kod的官网以此来做出版权修改的警告然后我们点开右上角的菜单,有一个"免费版",右键审查一下元素

可以看到这里的id为
version_vip_free
故名思意,这玩意是标注我是白嫖玩家的标识...稍加思考一下,这里的值肯定是后端给予或者由JS修改
根据参考的文章,我们就不做踩坑慢慢找了,直接奔向
main.js
但是在写本篇文章时,并没有在
main.js
内直接搜索到version-vip
和verKey
,稍微看了眼js内容,有被加密的痕迹故使用Kod自己来找(真是好使)

在这里吹爆这个搜索
搜索出来的文件确实和在Network里加载出来的
main.js
不一样,看了一下路径也确实是在不同的位置,所以还请大家注意一下XD在main.js
内搜索,很快就找到了我们要的东西:

- A值为free
- O为 1
- P为 2
- Q为 3
- R为 4
- S为 5
T为 6
我们试着修改一下刚才展示版本标识地方的值
手动变色(虽然不知道这个颜色对应什么版本)
但是证实刚刚我们拿到的对应值是没有问题的进而开始
好的,我们已经对Kod有一个初步的探究了,我们现在从授权开始下手。
点击我们之前显示版本的小标,会在新页面内看到左上角有一个"激活授权",点开后我们进入到这样的页面:
随便输入一段字符,随后提示
结果当然是失败,而且这个页面跳转的很快,我们不知道请求了什么,所以接下来我们要去掉这个跳转。
我们打开DevTools,转到Network选项卡,然后随便输入一段字符并确认。等到"升级失败"的提示出来后,点击network面板左上角的一个小红灯:
便可以停止捕捉(也可以把Preserve log勾选掉)然后我们找到刚刚显示升级失败的这一页,查看其源码:
这里很明显的一段跳转js,我们将该部分的任意一部分放到可到云里自己去搜索
文件在#KOD/app/template/common/showTips.html
注意,请不要改动此文件,不然可能会影响其他需要跳转功能的页面出现问题,需要改动也请进行备份
现在我们得知,授权失败的时候会跳转到showTips.html
这个页面,那我们就来寻找是谁负责跳转的。

我们看到是
show_tips
这个函数负责跳转,那我们就来搜索是那些文件调用了show_tips
。
文件很多,但是我们不难发现,
show_tips
函数的参数就是提示内容,我们回到之前那个"升级失败"的提示页面,尝试搜索其中的字符串,你会发现怎么也搜索不出来(人家当然混淆了啊...)所以我们换种思路,破坏
show_tips
函数,看看是在哪里执行的时候报的错。找到
show_tips
函数的定义位置,将他改个名请记得备份
然后重新尝试激活授权,这时你就会得到报错:

稍微接触过PHP的朋友就能看出,是在
#KOD/plugins/toolsCommon/static/pie/.pie.tif
这个文件内执行出了错,那我们就来打开这个文件
对,文件经过混淆了,这时处理起来可能会很棘手,但是我们仔细观察一下,就会发现定义的函数名还是没被混淆的(将该文件复制一份,并更改后缀名为
.php
再打开,会比较方便)先用可道云的编辑器格式化一下php代码(在此吹一下)
你会发现整个代码更清晰了(虽然并无卵用
而且,在右侧,还方便地展示出了所有定义的函数名

函数名写的这么清楚了,我们顾名思义,就应该盯上
version_install
这个函数。我们稍微来解析一下这个文件,从头开始

这里有一句
exit
需要引起注意,因为如果不满足上面if条件的话会让激活授权的过程停止,那我们来分析一下此处:首先我们看到
if
里面判断的是变量$sz
,$sz
是通过运行语句$fb(_FILE_)
得来的,_FILE_
是php的魔术变量,代表文件本身,那么$fb
在上面有定义,是base64解码过来的,那我们解一下:
是
filesize
,那我们就可以确定这段话的功能了,判断本文件大小是否在范围内,如果不是则退出。至于为什么要有这一句,你动了本文件之后当然会改动大小了啊(xd我们可以删掉这一段话。
然后我们回到 version_install
你会发现,最常见到的函数是一个名为_kstr2
的函数,也就是我们在文件开头发现定义的函数:
function _kstr2($Fбр’ђПХ–) {
$eЌиІ№©иЩ = strlen($Fбр’ђПХ–);
$BЌЄЎ…кЩщ = '';
$aЦі·є‹ЪА = ord($Fбр’ђПХ–[0]) - 30;
for ($FНциЙ™ШЅ = 1; $FНциЙ™ШЅ < $eЌиІ№©иЩ; $FНциЙ™ШЅ += 2) {
if ($FНциЙ™ШЅ + 1 < $eЌиІ№©иЩ) {
$BЌЄЎ…кЩщ .= chr(ord($Fбр’ђПХ–[$FНциЙ™ШЅ + 1]) + $aЦі·є‹ЪА);
$BЌЄЎ…кЩщ .= chr(ord($Fбр’ђПХ–[$FНциЙ™ШЅ]) + $aЦі·є‹ЪА);
} else {
$BЌЄЎ…кЩщ .= chr(ord($Fбр’ђПХ–[$FНциЙ™ШЅ]) + $aЦі·є‹ЪА);
}
}
return $BЌЄЎ…кЩщ;
}
看起来很乱?其实你会发现不可读的就是那个变量,我们直接替代一下就可以了:
function _kstr2($arg0) {
$v0 = strlen($arg0);
$v1 = '';
$v3 = ord($arg0[0]) - 30;
for ($i = 1; $i < $v0; $i += 2) {
if ($i + 1 < $v0) {
$v1 .= chr(ord($arg0[$i + 1]) + $v3);
$v1 .= chr(ord($arg0[$i]) + $v3);
} else {
$v1 .= chr(ord($arg0[$i]) + $v3);
}
}
return $v1;
}
这样还乱吗?
现在我们再用该函数,对文件内被混淆的内容进行还原,以及部分使用base64/16进制混淆的内容进行还原,便可得到一个不一样的version_install
函数

↑还原后部分内容
(tips:16进制可以直接用php输出)
变量名什么的是根据使用的位置猜想出来的,写多了也大概能猜出这个逻辑的一,二。
换种思路
函数还原出来了,也将version_install
所调用的几个函数也给还原,但是很显然,我并没有一个真正的licenseKey
而在整个激活的过程中,确实有需要服务端传过来的内容进行加密然后进行相应操作。
但是我们换种思路,可道云在对不同版本功能限制的时候肯定是留有判断代码的,所以我们试着从用户限制
入手。
阅读参考帖,得知判断用户限制的函数在于utils.php
的checkUserLimit
函数。
utils.php
位于#KOD/app/controller/
一样的,我们删掉之前已知的判断文件大小
部分,然后按照之前的方法还原checkUserLimit
函数
记得备份
tips:实测,如果直接格式化会造成一些问题导致无法正常运行,请手动将checkUserLimit
函数单独处理。
note:checkUserLimit
函数格式化后,会因为->get
部分前面有一个特殊字符导致变量不一致,请稍加注意。
还原后,还是发现不了一二,便再找找看。
感觉systemLimitData
有可能,进行还原。
结果,这里面确实存了和授权有关的内容,但是不是判断,只能继续寻找。但是我们现在可以透过代码确定一下之前的"授权版本"了
- A,也就是免费版,支持15个用户
- O,也就是团队版,支持30个用户
- Q是企业版,分为Q1-Q9
其他的应该属于开发版/公有云/定制版范畴了。
几番下来,我发现整个授权判断都依靠$GLOBALS["config"]["settingSystem"]["versionType"]
这个变量,所以我们要想办法修改它。
直接在init_version_check
的时候直接赋值,发现确实使整个请求部分能得到授权后的响应了(比如添加超过15个用户)
但是其他地方的显示还是为免费版的。这就令我犯难了,既然在.pie.tif
几个看起来的关键函数还原后似乎都没有给其他地方赋值的成分,那估计是在js内还有一套判断授权的方法。
但是我们先来确定一下整个kod的启动顺序。
因为在尝试在init_version_check
赋值的时候,发现在赋值之前$GLOBAlS['config']
里头已经有版本类型了,我们还是用删改函数名的方法来寻找。
整个$GLOBALS['config']
是在untils.php
由函数init_setting()
赋值的,尝试在此处直接设置versionType
也得到的是一样的结果"只有在php判定部分才生效"
经测试,添加用户功能可正常,但是应该是js部分还没搞定,所以出错了...
停坑一会..
通过吾爱破解的帖子已经实现破解了,可以做到不需要修改任何本地文件。
情留メ蚊子 2019-11-27 10:26
吾爱的帖子似乎没有说全,不知道您是在哪里发现了奥秘?
不介意的话可以发给我参考一下吗?
outtime 2019-11-27 12:34
后续的有没
情留メ蚊子 2019-11-21 10:51
唔,除php部分,kod在各个main.js中也埋下了判断,但是因为js本身太灵活了...加密也是令人眼花缭乱。会在后续有时间的时候继续更新的,你也可以自行研究一下js文件。期待你的好消息
outtime 2019-11-21 13:15
我这边PHP部分的加密全部解了。JS的还没有去看
情留メ蚊子 2019-11-25 15:44
嗯,剩下就是js部分了。
php部分解干净了,整体逻辑好猜,但是有些东西还是得靠服务端下发过来
解掉js就应该能解掉谜团了。
main.js挑最小的一个解就行,大家都是一样的
outtime 2019-11-25 18:31