本文编写于 781 天前,最后修改于 734 天前,其中某些信息可能已经过时。

严正申明

本文参考自 吾爱破解论坛帖子的一则回复 并进行了实际上手

本文仅供学习讨论使用,请支持正版可道云,严禁将本文所介绍内容用于违法用途。
本文不会提供任何文件下载,伸手党绕道.

侵删。

准备环境

本次作为测试的是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-vipverKey,稍微看了眼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.phpcheckUserLimit函数。

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部分还没搞定,所以出错了...

停坑一会..