MENU

virtualizor授权解密方法以及伪授权host

@(抽烟)之前做完solusvm的nat功能后开始研究这套虚拟化管理面板,在我的印象里这套面板之前有人已经破解过,但是目前那份破解已经失效了,在加上弄solusvm的时候有人有virtualizor破解的需求于是便尝试破解了一下.

需要解密的文件

我自己破解的时候发现有人已经做出来了新版的破解,也是伪授权,但不是用的hosts方式,而是写了一个脚本加入cron每小时替换本地文件,点击这里查看他的文章

他的文章里给出了授权检验的路径,于是我连追踪哦都不需要了.

  • /usr/local/virtualizor/main/functions.php

  • /usr/local/virtualizor/main/functions/file_functions.php

分析

首先找到license2.php,发现内容是一串未知加密的字符串,于是便推断此文件里面包含的仅是授权信息,校验时会读取此文件

文件使用icncube v10加密,解密后通过搜索字符串license2.php在1267行发现了读入license2.php的语句.函数名为loadlicense,通过分析此函数在1331行和1344行找到了sm_decodesm_reverse_bits两个函数,这两个函数用于授权文件的解密,3个函数的代码如下

function loadlicense($update = false)

{

	global $globals;

	global $l;

	if (file_exists($globals["path"] . "/license2.php")) {

		vexec("chattr -i -a " . $globals["path"] . "/license2.php");

	}

	if (!defined("LIC_URL")) {

		@define("LIC_URL", "http://www.03sec.com/make_license.php?str=207.148.109.177&");

	}

	if (!file_exists($globals["path"] . "/license2.php") || $update) {

		$activevps = 0;

		if (!empty($globals["conn"]) || !empty($globals["pdo_conn"])) {

			$res = makequery("SELECT COUNT(vpsid) AS num FROM `vps`\n\t\t\t\t\t\tWHERE serid = 0");

			if (0 < vsql_num_rows($res)) {

				$row = vsql_fetch_assoc($res);

				$activevps = $row["num"];

			}

		}

		$data = get_softaculous_file(LIC_URL . "activevps=" . $activevps . "&version=" . $globals["version"]);

		if (!empty($data) && @sm_decode($data)) {

			writefile($globals["path"] . "/license2.php", $data, 1);

		}

	}

	$license = @file_get_contents($globals["path"] . "/license2.php");

	if (empty($license)) {

		reporterror("", $l["no_license"], "");

		return false;

	}

	$license = @trim(@sm_decode($license));

	$license = json_decode($license, true);

	if (!empty($license) && is_array($license)) {

		foreach ($license as $k => $v) {

			$globals[$k] = $v;

		}

	}

	return true;

}

function sm_decode($txt)

{

	$from = array("!", "@", "#", "\$", "%", "^", "&", "*", "(", ")");

	$to = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j");

	$txt = base64_decode($txt);

	for ($i = 0; $i < strlen($txt); $i++) {

		$txt[$i] = sm_reverse_bits($txt[$i]);

	}

	$txt = gzuncompress($txt);

	$txt = str_replace($from, $to, $txt);

	$txt = base64_decode($txt);

	return $txt;

}

function sm_reverse_bits($orig)

{

	$v = decbin(ord($orig));

	$pad = str_pad($v, 8, "0", STR_PAD_LEFT);

	$rev = strrev($pad);

	$bin = bindec($rev);

	$chr = chr($bin);

	return $chr;

}

首先可以发现loadlicense可以传入一个逻辑性参数,当此参数为true的时候会强制更新授权文件(这应该就是之前那位为什么要写成一个cron任务定时更新).

另外发现授权通过官方域名:www.virtualizor.com获取,而且用了https,到这里我觉得可能做不下去,主要有2个问题

  • https校验证书,伪授权站点无法弄到可信的ssl证书(可能之前那位也发现了使用了https所以没有采用hosts的方式)

  • 使用了官网域名,其它服务可能也会用到此域名,如果使用host而只模拟授权的话,有可能会带来其他问题.

但既然都已经到了现在这个地步了,于是我先根据sm_decodesm_reverse_bits写出来了加密函数,写完之后开始继续分析

发现loadlicense使用了get_softaculous_file从官方获取授权信息,便追踪get_softaculous_file函数,在1222行发现此函数,代码如下

function get_softaculous_file($url, $path = "")

{

	global $globals;

	if (strstr($url, "?")) {

		$url = $url . "&license=" . $globals["license"] . "&soft_email=" . rawurlencode($globals["soft_email"]) . "&kernel=" . rawurlencode($globals["kernel"]);

	} else {

		$url = $url . "?license=" . $globals["license"] . "&soft_email=" . rawurlencode($globals["soft_email"]) . "&kernel=" . rawurlencode($globals["kernel"]);

	}

	if (empty($path)) {

		return get_web_file($url);

	}

	return save_web_file($url, $path);

}

发现此函数仅是简单的判断path来调用其他的函数根据loadlicense传递的参数发现实际调用的是get_web_file函数,在844行发现此函数,代码如下

function get_web_file($url, $writefilename = "")

{

	global $globals;

	include_once $globals["mainfiles"] . "/functions/file_functions.php";

	return get_web_file_fn($url, $writefilename);

}

此函数全局化了$globals变量,引入了file_functions.php文件,调用了get_web_file_fn函数,于是便解密了file_functions.php文件,在45行发现此函数,代码如下

function get_web_file_fn($url, $writefilename = '')

{

    global $globals;

    $allow_url_open = (int) ini_get('allow_url_fopen');

    if (function_exists('curl_exec')) {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (!empty($GLOBALS['globals']['curl_timeout']) ? $GLOBALS['globals']['curl_timeout'] : 5));

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        curl_setopt($ch, CURLOPT_USERAGENT, 'Softaculous');

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $file = curl_exec($ch);

        curl_close($ch);

    } else {

        if (!empty($allow_url_open)) {

            $file = @implode('', @file($url));

        } else {

            return false;

        }

    }



    if (empty($file)) {

        return false;

    }



    if (empty($writefilename)) {

        return $file;

    }



    $fp = @fopen($writefilename, 'wb');

    if ($fp) {

        if (false === @fwrite($fp, $file)) {

            return false;

        }



        @fclose($fp);



        return true;

    }



    return false;

}

这里我一眼就看到了这两行代码

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

这两行的作用是忽略对https的证书校验而使用的,这就意味着虽然使用了https进行通信但实际上并没有校验证书信息,也就是自签名证书在virtualizor看来也是有效的,这同时也表示伪授权是可行的,但这里还需要解决另一个问题,除了授权文件还有什么信息是从官网域名获取的

functions.php和file_functions.php里搜索关键字www.virtualizor.com发现除了授权还有更新信息是从官网域名获取的,第1175行,代码如下

$data = get_softaculous_file("https://www.virtualizor.com/updates.php?version=" . $globals["version"] . "&tree=" . $globals["update"] . "&patch=" . $globals["patch"]);

发现获取更新并未进行任何授权校验,于是准备写一个中继文件解决.

写完之后将伪授权文件和更新中继文件放到一个虚拟主机,随便找了个ssl证书进行测试,发现授权成功,而且能正常获取更新信息,破解大成功(めでたし、めでたし)

伪授权hosts

150.95.9.226 www.virtualizor.com

因为授权信息从官网域名获取,安装脚本和安装文件也有部分是从官方获取,所以需要先安装面板,然后再添加host.

如果需要伪授权文件可以自己写,文章里面给出了授权解密和校验的方式,先解密一下过期或者试用版的授权文件,对照着写加密即可(蛤,你不会写,没关系,去leonn那里缴纳400人民币的智商税也能获得).

添加新评论

已有 10 条评论
  1. myitmx
    哈哈,这东西最新版早就破解出来了,还写成了whmcs服务器插件形式去卖
  2. 萌新
    感谢大佬。谢谢你,让我更好的学习virtualizor。
  3. wang
    您好,请问下,我在机器上部署了个virtualizor,但是登录界面的初始用户名及密码是什么呢?
    1. shirakun
      请阅读官方安装文档
  4. 光头强神秘伙伴
    来大佬的博客踩踩点!@(你懂的)
  5. daihao1
    没这么复杂,朋友。我的破解方法只需要替换两个文件就行了。
    1. shirakun
      我並不喜歡更改文件,更改文件後會為升級帶來潛在風險
  6. 小布丁
    https://www.331u.com/1061.html 看见别人用你的解析了!!!
    1. shirakun
      他想抄就抄咯,不管怎麼抄nulled之後的授權信息他改不了.
      1. 小布丁
        这个是好的,留一手,哈哈!