代码混淆加密——虽然是雕虫小技的加密方式,但手工解出来还是蛮费时间,尤其是有一大堆加密程序的时候。
今天兴致还不错,写了个php解密程序,解密效果完美,批量解密也是一个爽!

注意:程序会在同目录生成和删除 tmp.php

<?php

/*
* by 267014855
* 2011-7-18
*/

//$file = 'global.func.php';
$hd = opendir('./');
while($f=readdir($hd)){
if($f == '.' || $f == '..') continue;

$file = $f;
$strs = file($file);
$code = $strs[1];

if(strpos($code, '$OOO0O0O00') === 0){
$arr=decode($code);
$arr = checkagain($arr);
//加密很深的话多checkagain几次
/*
//输出文件所有代码
$arr = checkagain($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
*/

//输出文件有用代码
$arr = checkagain($arr, 1);

file_put_contents('jm_'.$file, "<?php\r\n".$arr."\r\n?>");
//echo $arr;
}else
echo '无需解密';

}
//////////////////////////////////////////////////////////
function checkagain($arr, $out =0){
//没有这个函数也差不多了,保留一点,给开发者留碗饭!
}

function getrlcode($arr, $key){
$str = '<?php'."\r\n";
foreach($arr as $v){
$str.=$v;
}
$str.="?>";
file_put_contents('tmp.php', $str);
include 'tmp.php';
unlink('tmp.php');
return $$key;
}

function decode($str){
global $file;
$codearr = $tmpcodearr = array();
$arr = explode(';', trim($str));
$i=1;
foreach($arr as $v){
$v = trim($v);
$v = str_replace('__FILE__', '\''.$file.'\'', $v);
if($v=='?>')
break;
if($v=='return')
continue;
if(strpos($v, 'eval') === 0){
unset($tmpcodearr);
$tmpcodearr = $codearr;
$key = 'str'.$i;
$tmpcodearr[] = '$'.$key.'='.findstr($v).";\r\n";
$newstr = getrlcode($tmpcodearr, $key);
unset($tmpcodearr);
$tmpcodearr = explode(';', trim($newstr));
foreach($tmpcodearr as $v){
trim($v) && $codearr[] = trim($v).";\r\n";
}
$i++;
}else{
$codearr[] = $v.";\r\n";
}
}
return $codearr;
}

//gbk的文件格式
function findstr($str){
$i = 4;
while($str[$i] == '('){
$i++;
}
return substr($str, $i, strlen($str)-$i-($i-4));
}
?>

转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/1892.html