MENU

SolusVM开发:解密客户面板的vpsid

昨日弄完了自己程序的用户登录验证之后立即就遇到了服务器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;
}
添加新评论

已有 2 条评论
  1. 大佬请问一下您是怎么还原被混淆的变量名的?#(小眼睛)

    1. @myitmx被混淆的变量名和函数名没有办法还原,但是可以批量替换变成可读的.