PHP解密:phpjm混淆加密

此文受下文启发,所以连标题都模仿一下

此文针对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&#65533;bqtRRkWM&#65533;”;
//全文件倒数第4个字符串,函数的第2个参数
$rpd = “ZOyQUbqDB”;
//在return “J”;}}else{global包含之内,J会变化
$str1 = “J”;
//全文件倒数第3个字符串,’和”之内(这是eval中嵌套的代码,只留有用部分)
$strM = “eNo1jkFqwzA&#65533;URK/iwoek8G&#65533;+Qkqx7hK6LI&#65533;YtQB5J0q3xLxrYcWbasWHF&#65533;kOVetNt3NMI&#65533;/HbHbbj91xf&#65533;0zS732WrD6T&#65533;”;
//全文件倒数第2个字符串,”和’之内(这是eval中嵌套的代码,只留有用部分)
$strN = “l/Z5W2&#65533;1+Z8uP6f0vI&#65533;YKwc4IN9Uj3&#65533;LvKIBR8EhzB&#65533;L/WgPELDWMe&#65533;qMQah7k9JJc&#65533;LsHkIuNc8RF&#65533;KPHoAemLULf&#65533;hSrQaOZrLHx&#65533;pAnde+dccJV&#65533;er+1JTIPOUOgoon7gLxH3h&#65533;xwi7sTNOUK1&#65533;MI+0iEF4tkf&#65533;FFPZWtbWWTv&#65533;8fbf284XrQ=&#65533;”;

//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&#65533;bqtRRkWM&#65533;”;
//全文件倒数第4个字符串,函数的第2个参数
$rpd = “ZOyQUbqDB”;
//在return “J”;}}else{global包含之内,J会变化
$str1 = “J”;
//全文件倒数第3个字符串,’和”之内(这是eval中嵌套的代码,只留有用部分)
$strM = “eNo1jkFqwzA&#65533;URK/iwoek8G&#65533;+Qkqx7hK6LI&#65533;YtQB5J0q3xLxrYcWbasWHF&#65533;kOVetNt3NMI&#65533;/HbHbbj91xf&#65533;0zS732WrD6T&#65533;”;
//全文件倒数第2个字符串,”和’之内(这是eval中嵌套的代码,只留有用部分)
$strN = “l/Z5W2&#65533;1+Z8uP6f0vI&#65533;YKwc4IN9Uj3&#65533;LvKIBR8EhzB&#65533;L/WgPELDWMe&#65533;qMQah7k9JJc&#65533;LsHkIuNc8RF&#65533;KPHoAemLULf&#65533;hSrQaOZrLHx&#65533;pAnde+dccJV&#65533;er+1JTIPOUOgoon7gLxH3h&#65533;xwi7sTNOUK1&#65533;MI+0iEF4tkf&#65533;FFPZWtbWWTv&#65533;8fbf284XrQ=&#65533;”;
}
//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 ::>_<::)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇