教你如何解密 “ PHP 神盾解密工具 ”
其实对神盾解密并没有那么感兴趣,只是看到了作者把工具又加密了,感觉不爽。研究了一下,其实解密没那么复杂。
利用php_apd扩展很轻松地就这把这搞定了。只有四句代码。
<?php
rename_function('gzuncompress','new_gzuncompress');
override_function('gzuncompress','$arg','print(new_gzuncompress($arg));returnnew_gzuncompress($arg);');
require_once'decryption.php';
decryption('decryption.php');
该工具的核心代码:decryption.php
<?php
functiondecryption($fileName){
/**
*解码函数
*@paramstring$str待解码字符串
*@paramstring$flg是否解析后解码
*@returnstring已解码字符串
*/
functiondecode($str,$flg=''){
if($flg===''){
$ret=$str;
}else{
$ret='ۯ';$i=0;$l=strlen($str);
while($i++<$l){
$c=ord($str[$i-1]);
$ret.=$c<245?($c>136?chr($c/2):$str[$i-1]):"";
}
}
returnbase64_decode($ret);
}
$err='解码遇到错误,请联系教主处理该文件!';
$str=file_get_contents($fileName);
$path=pathinfo($fileName);
$dirname=$path['dirname'];//文件所在目录
$baseName=$path['filename'];//文件名
if(preg_match('|IN_DECODE_(\w{32})|s',$str,$arr)){
//防止解密自己,其实方法都已经告诉你了,自己动手解码才快乐
$arr[1]==='761b5f52db6dff7ce91344e99dcedab7'&&die("err:[-1]-请勿试图用本工具解密本工具!");
}else{
die("err:[-1]-没有发现神盾特征,你确定这是神盾加密?");
}
//匹配代码主题部分
//'';@\$[\x00-\xff]+\(\\'([\x00-\xff]+?)\\'\.\(
preg_match('|\'\';@\$[\x00-\xff]+\(\\\\\'([\x00-\xff]+?)\\\\\'\.\(|s',$str,$arr)||die("err:[0]-".$err);
$code=$arr[1];
//匹配中间加密部分
preg_match('|\(\'([\x00-\xff]+)\',\'|s',$code,$arr)||die("err:[1]-".$err);
$key=base64_decode(decode($arr[1],"decode"));
$code=preg_replace('|\'\.[\x00-\xff]+\'\)\)\.\'|s',$key,$code);
//匹配尾部被加密代码
preg_match('|=\'(x[\x00-\xff]+)\'\)\);|s',$str,$arr)||die("err:[2]-".$err);
$core=$arr[1];
//匹配验证key
preg_match('|[\w+/=]{59}=|s',$arr[1],$arr)||die("err:[3]-".$err);
$key=$arr[0];
$core=str_replace($key,'',$core);//去除key
$suffix=gzuncompress($core);//得到base64的末尾部分
//解码
$code=gzuncompress(base64_decode($code.$suffix));
//匹配干净的代码
if(preg_match('|<!--<\?phpendif;\?>(<\?php[\r\n]{1,2}[\x00-\xff]+\?>)<\?php\$GLOBALS\[|s',$code,$arr)){
$code=$arr[1];
}
//写到文件
$source=$dirname.DIRECTORY_SEPARATOR.$baseName."_source.php";
file_put_contents($source,$code);
die("解密成功,已经保存为:".$source);
}