齐博地方门户3.0授权文件解密-授权破解-算法分析

今天拿到了齐博地方门户3.0的升级文件,由于之前我修改了齐博一些系统函数,所以升级前要检查下是否可以兼容。无奈一些重要文件却被加密。

花了半小时解出明文,这个算法写的还是很不错的,比我以前碰到的此类型加密要难很多,以下是个示例代码:

<?php /* Powered by www.qibosoft.com */$ll1l1l1l11l1l1l1=__FILE__;

$ll1l111l1llllll11l1=base64_decode("Zmc2c2JlaHByYTRjb190bmQ=s");

省略多行...;

eval($l1111l1l1l1ll11l('JGxsbGxsMTFsbDExMWwxbGwoJGxsbDExMWxsMWxsMWwxbGwsMTkpO2V2YWwoJGwxMTExbDFsMWwxbGwxMWwoJGxsbGxsMTFsbDExMWwxbGwoJGxsbDExMWxsMWxsMWwxbGwsMjMyKSkpOw=='));

return ;?>

ZGliZ2NhbWlzc2dldGE2bjQ0bzlfamlkeXRla3Njem9vMmtkYWJlCWJuVmFhWFp0ZUhvNWFIbDNibkphZUdoWGVtZzBkemM5CWQyeGFiM3B0ZW1ka01EbHNabkprZUdSSWNHSk5hSGs5CWFYTmFZbXR1ZUdWS09HRnNNM0paYW5OW 省略...


 

下面分析下算法,小弟没有学过PHP,PHP高手还请微微一笑,轻轻飘过..

有人也许会说,此类加密我2分钟就可以解开,我之前也是这么想的,但是却用了半小时。

由于此算法需要读取文件本身,所以解密前需要复制一份,并修改__FILE__为复制好的文件名。

我们破解此类加密一般都用exit法(暂且这么叫吧),前边写了多少写了什么不在意,找到最后一个eval改为exit输出为:

$lllll11ll111l1ll($lll111ll1ll1l1ll,19);eval($l1111l1l1l1ll11l($lllll11ll111l1ll($lll111ll1ll1l1ll,232)));

替换代码后继续将eval改为exit输出:

eval($l1111l1l1l1ll11l('JGxsbGxsMTFsbDExMWwxbGwoJGxsbDExMWxsMWxsMWwxbGwsMTkpO2V2YWwoJGwxMTExbDFsMWwxbGwxMWwoJGxsbGxsMTFsbDExMWwxbGwoJGxsbDExMWxsMWxsMWwxbGwsMjMyKSkpOw

 你会发现,这和你第一次解的eval代码一样

再继续替换eval为exit:

$lllll11ll111l1ll($lll111ll1ll1l1ll,19);eval($l1111l1l1l1ll11l($lllll11ll111l1ll($lll111ll1ll1l1ll,232)));

也许你发现规律了,这样继续解下去的话这辈子都解不开。永远是个循环,这也是此算法的巧妙之处。

我在这里停了很长时间不能前进,其实以上代码是一个读文件的操作,读取19个字符不进行操作然后再读取232个字符解码执行,解码后的代码也会是这样一个操作,但是读取文件的起始位置却应该是19+232,所有我们要想手动去解密,就需要修改每次exit出的eval里的代码。

将以上代码改为:

$lllll11ll111l1ll($lll111ll1ll1l1ll,19);
$lllll11ll111l1ll($lll111ll1ll1l1ll,232);

 ....

 
   

  直到读取到有用代码为止

以上的19,232开始的几个是固定的,以后会发生变化,不断重复上边的步骤最终可解出明文,但是这个过程却是相当费时间的,解密多个文件就要耗费大量的时间。

 

这里我们总结一下加密算法:

从指定位置读取某长度字符丢弃,再继续读取某长度字符解码执行,在这个执行的过程中又是上边的一个重复

我们不难发现,有用的代码编码肯定是在文件最末的。通过分析以上代码我们可以发现一个共同点,代码都是以");"结尾,所以base64编码就以Ts=结尾。有了这个特征我们可以总结出每段代码的base64编码前都是十几个无用字符开头Ts=结尾。

所以我们找出了更加便捷的解密方法,在文件编辑器中以Ts=分割base64编码,只需要找到倒数第二段base64编码,就是我们需要的明文编码,但是这个编码的开头却有十几个无用字符,我们只需要在本地base64解码软件中不断删除开头字符后解码,最终可以找出明文。我在本地使用的是一个抓包软件Fidder的解码功能,每删除一个字符自动就会进行一次解码,所以很方便就可以解出明文。

 

这种方法无需懂得程序逻辑,无需调试,而且速度非常快,30秒一个文件。

 

这也再一次说明了程序员的通病,把大多注意力放在了功能实现上,而忽略一些细小但是却很重要的东西。

这个加密算法无疑是一个非常精巧的算法,可见程序作者花了很长时间才实现。但是我们却可以绕过算法,直接从base64编码中很方便的读出明文。

 

最后来一个解密后的代码

<?php

if(defined('SYS_TYPE') && SYS_TYPE!='f'){

    die('err 01');

}



die( var_dump(function_exists('LIFE2_CK') ) ); 



if(!function_exists('LIFE2_CK')||!defined('BIZ_PATH')){

    die('授权文件不存在,或者是授权文件太旧,需要更新!');

}

else{

    LIFE_CK('fenlei');

}





/**

*获取模板的函数

**/

function getTpl($html,$tplpath=''){

    global $STYLE;

    if($tplpath&&file_exists($tplpath)){

        return $tplpath;

    }elseif($tplpath&&file_exists(Mpath.$tplpath)){

        return Mpath.$tplpath;

    }elseif(file_exists(Mpath."template/$STYLE/$html.htm")){

        return Mpath."template/$STYLE/$html.htm";

    }else{

        return Mpath."template/default/$html.htm";

    }

}



function modules_f(){

    global $_pre;

    return $_pre.'module';

}



?>

 

最后还是希望大家都能支持正版软件。

 

 

崇礼  崇礼吧

你可能感兴趣的:(算法)