SolusVM开发:解密客户面板的vpsid
Q(内伤)昨日弄完了自己程序的用户登录验证之后立即就遇到了服务器id的问题,计划直接改solusvm的home.tpl,加入nat设置按钮,然后跳转到自写程序进行nat设置,打开solusvm的home页面时发现链接传递的是?_v=xxxxx
,当时我就有不好的预感,解密control.php之后发现果然加密了,直到今天才弄清楚计算方式.
因研究需要分析和解密的 SolusVM 文件
- /usr/local/solusvm/www/control.php
- /usr/local/solusvm/includes/core_functions.php
分析
首先解密control.php找到这样一段
$vid_decode = explode('-', obfuscated_0D3F1F270C0E2A3423191C0B192D061004231725090D11_($_GET['_v'], session_id()));
if (!obfuscated_0D3B17052F270939092635290828053E1C112F13403D32_($_SESSION['clientid'], $vid_decode[0])) {
header('Location: systemerror.php');
exit();
}
然后解密文件引入的几个function字样的文件,最终在core_functions.php里发现了obfuscated_0D3F1F270C0E2A3423191C0B192D061004231725090D11_()
函数,函数如下
function obfuscated_0D3F1F270C0E2A3423191C0B192D061004231725090D11_($string, $key)
{
$key = sha1($key);
$obfuscated_0D100C2307133719160930371D192835400D1A3F032301_ = strlen($string);
$obfuscated_0D35351840170E1D310E36153E160617100C0418290F01_ = strlen($key);
$i = 0;
while ($i < $obfuscated_0D100C2307133719160930371D192835400D1A3F032301_) {
$obfuscated_0D1A0440350B30173D14160A1B100429261A4004211401_ = hexdec(base_convert(strrev(substr($string, $i, 2)), 36, 16));
if ($j === $obfuscated_0D35351840170E1D310E36153E160617100C0418290F01_) {
$j = 0;
}
$obfuscated_0D365B2B040523152C07333F121C11352A405B23050E32_ = ord(substr($key, $j, 1));
++$j;
$hash .= chr($obfuscated_0D1A0440350B30173D14160A1B100429261A4004211401_ - $obfuscated_0D365B2B040523152C07333F121C11352A405B23050E32_);
$i += 2;
}
return $hash;
}
这里有一个问题,$j和$hash没有预先定义,这样会抛出警告(虽然solusvm的php设置已经屏蔽了警告类型的错误),于是在上面加上$j = 0;$hash = '';
但是不知为何昨晚这样加上之后函数直接返回null,也没找出是什么问题导致的,一看时间都11点了就睡觉了,今日早上起来到公司之后弄完公司的问题又继续研究,先是联系了小伙伴tks,然后自己又测试了一下,然后还是加了$j = 0;$hash = '';
不科学的事情发生了,竟然一切正常,小伙伴那里也没有出现问题,昨晚的错误没有复现(这不科学),于是决定先发篇文章,写出现在的验证函数,晚上回去继续想办法复现昨日的错误.
vid解密函数
解密出来的源代码对变量名进行了混淆个打乱,替换变量名和函数名之后最终得到下面的代码
function vid_decode($string, $key)
{
$key = sha1($key);
$vid_str = strlen($string);
$key_str = strlen($key);
$i = 0;
$j = 0;
$hash = '';
while ($i < $vid_str) {
$ua = hexdec(base_convert(strrev(substr($string, $i, 2)), 36, 16));
if ($j === $key_str) {
$j = 0;
}
$ub = ord(substr($key, $j, 1));
++$j;
$hash .= chr($ua - $ub);
$i += 2;
}
return $hash;
}
Solusvm的变量名混淆真的是让人很无语。。。。压根没法看@(黑线)
大佬请问一下您是怎么还原被混淆的变量名的?#(小眼睛)
被混淆的变量名和函数名没有办法还原,但是可以批量替换变成可读的.