此文受下文启发,所以连标题都模仿一下
此文针对php加密实验样本来自如下网站:
PHP文件加密 – PHP在线加密平台 http://www.phpjm.net/encode.html
分析了一下此加密的思路
1、将原始文件gzcompress、base64_encode处理得到长度为X的加密串
2、将加密串按照M+4+1+N的长度进行分割,X=M+4+1+N,M和N有随机性,每次加密出来结果不一样
3、将长度为4的串加密处理,按照gzcompress、base64_encode、base64_encode、strtr(包含一个替换字典rpd)的步骤,得到加密后的串str4和替换字典rpd
4、将str4、rpd、strM、str1、strN明文显示在加密后的文件中,但自解析方法通过层层混淆加密隐藏起来。
完毕。
这么说来,思路就很清晰了。但是,获取上面的思路,需要我们先从一堆混沌中找到蛛丝马迹。
解密方法:
1、获取str4、rpd、strM、str1、strN
2、用第3步加密的逆向方法获取真正的str4
[PHP] 纯文本查看 复制代码
?
1
$str4 = gzuncompress(base64_decode(base64_decode(strtr($str4, $rpd, strrev($rpd)))));
3、拼接加密串
[PHP] 纯文本查看 复制代码
?
1
$str = $strM.$str4.$str1.$strN;
4、解密得到原始文件
[PHP] 纯文本查看 复制代码
?
1
$output = gzuncompress(base64_decode($str));
5、格式化并输出文件
初步的代码如下,可保存为utf8格式的de.php文件执行,欢迎将结果回帖告诉大家
<?php
//origenal data
//全文件倒数第5个字符串,函数的第1个参数
$str4 = “BU5vTOFFDU1ZjGdZ�bqtRRkWM�”;
//全文件倒数第4个字符串,函数的第2个参数
$rpd = “ZOyQUbqDB”;
//在return “J”;}}else{global包含之内,J会变化
$str1 = “J”;
//全文件倒数第3个字符串,’和”之内(这是eval中嵌套的代码,只留有用部分)
$strM = “eNo1jkFqwzA�URK/iwoek8G�+Qkqx7hK6LI�YtQB5J0q3xLxrYcWbasWHF�kOVetNt3NMI�/HbHbbj91xf�0zS732WrD6T�”;
//全文件倒数第2个字符串,”和’之内(这是eval中嵌套的代码,只留有用部分)
$strN = “l/Z5W2�1+Z8uP6f0vI�YKwc4IN9Uj3�LvKIBR8EhzB�L/WgPELDWMe�qMQah7k9JJc�LsHkIuNc8RF�KPHoAemLULf�hSrQaOZrLHx�pAnde+dccJV�er+1JTIPOUOgoon7gLxH3h�xwi7sTNOUK1�MI+0iEF4tkf�FFPZWtbWWTv�8fbf284XrQ=�”;
//serial data
$str4 = gzuncompress(base64_decode(base64_decode(strtr($str4, $rpd, strrev($rpd)))));
//decode data
echo “phpjm has encoded .php file as strM.str4.str1.strN<br>”;
echo “the length is:strM+str4+str1+strN=”.strlen($strM).”+”.strlen($str4).”+”.strlen($str1).”+”.strlen($strN).”<br><br>”;
$str = $strM.$str4.$str1.$strN;
$output = gzuncompress(base64_decode($str));
//output data
echo “decoded:<br>”;
highlight_string($output);
echo “<br>eval:<br>”;
eval($output);
?>
土豪接口
de.zip (931 Bytes, 下载次数: 318)
加密文件样本,结合起来看更利于学习:
3.zip (2.06 KB, 下载次数: 99)
在基础功能上增加了正则自动匹配,用法 php de.php xx.php
xx.php为需要解密的文件,将生成一个de_xx.php文件
如果不输入参数直接用php de.php或者用网页访问,与基础版一模一样。
<?php
$in_file = $argv[1];
if ($in_file) {
$out_file = ‘de_’.$argv[1];
$code = file_get_contents($in_file);
$code = explode(‘return ‘,$code);
$code = $code[3];
preg_match_all(‘/\”(.*?)\”/’, $code, $result);
$result=$result[0];
$str4 = str_replace(‘”‘,”,$result[13]);
$rpd = str_replace(‘”‘,”,$result[14]);
$str1 = str_replace(‘”‘,”,$result[0]);
$strM = substr($result[15],strpos($result[15],’\”));
$strN = substr($result[16],0,strpos($result[16],’\”));
/* preg_match_all(‘/\”.*?\’/’, $code, $result);
$strN = str_replace(‘.”‘,”,str_replace(“‘”,””,$result[0][2]));*/
}
else{
//origenal data
//全文件倒数第5个字符串,函数的第1个参数
$str4 = “BU5vTOFFDU1ZjGdZ�bqtRRkWM�”;
//全文件倒数第4个字符串,函数的第2个参数
$rpd = “ZOyQUbqDB”;
//在return “J”;}}else{global包含之内,J会变化
$str1 = “J”;
//全文件倒数第3个字符串,’和”之内(这是eval中嵌套的代码,只留有用部分)
$strM = “eNo1jkFqwzA�URK/iwoek8G�+Qkqx7hK6LI�YtQB5J0q3xLxrYcWbasWHF�kOVetNt3NMI�/HbHbbj91xf�0zS732WrD6T�”;
//全文件倒数第2个字符串,”和’之内(这是eval中嵌套的代码,只留有用部分)
$strN = “l/Z5W2�1+Z8uP6f0vI�YKwc4IN9Uj3�LvKIBR8EhzB�L/WgPELDWMe�qMQah7k9JJc�LsHkIuNc8RF�KPHoAemLULf�hSrQaOZrLHx�pAnde+dccJV�er+1JTIPOUOgoon7gLxH3h�xwi7sTNOUK1�MI+0iEF4tkf�FFPZWtbWWTv�8fbf284XrQ=�”;
}
//serial data
$str4 = gzuncompress(base64_decode(base64_decode(strtr($str4, $rpd, strrev($rpd)))));
//decode data
$str = $strM.$str4.$str1.$strN;
$output = gzuncompress(base64_decode($str));
//output data
if($in_file){
file_put_contents($out_file,$output);
echo ‘解密后文件已写入到 ‘.$out_file;
}else{
echo “phpjm has encoded .php file as strM.str4.str1.strN<br>”;
echo “the length is:strM+str4+str1+strN=”.strlen($strM).”+”.strlen($str4).”+”.strlen($str1).”+”.strlen($strN).”<br><br>”;
echo “decoded:<br>”;
highlight_string($output);
echo “<br>eval:<br>”;
eval($output);
}
?>
未完待续
下一步将补充3个方面的内容:
1、vscode+xdebug+php的调试环境安装和配置,网上的资料都不够完整,对于第一次接触的人来说不够友好和傻瓜,我来补上。(已经写好word了,完善一下格式再考虑以什么方式发上来(开贴或者发附件))
2、从零开始一步步搞定phpjm混淆加密的解密
3、破解文件de.php写好了,但自认为不够完善,后续得考虑自动格式化文件。
时间关系先写心得,截图等工作待完成。此版块不知道需不需要截图啊,看了版规貌似不明确,如果有问题请提醒我修正,谢谢。
(文章今日已有 1 人访问,总访问量 15 ::>_<::)