今天拿到了齐博地方门户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'; } ?>
最后还是希望大家都能支持正版软件。