Loading... # 引言 最近接了一个PHP的小项目,为了保护代码安全,想着要加密一下代码,网上找到一篇是这样的 ```php <?php function RandAbc($length = "") { // 返回随机字符串 $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return str_shuffle($str); } function jiami($vstr) { // $filename = '123.php'; //要加密的文件 $T_k1 = RandAbc(); //随机密匙1 $T_k2 = RandAbc(); //随机密匙2 $v1 = base64_encode($vstr); $c = strtr($v1, $T_k1, $T_k2); //根据密匙替换对应字符。 $c = $T_k1 . $T_k2 . $c; $q1 = "O00O0O"; $q2 = "O0O000"; $q3 = "O0OO00"; $q4 = "OO0O00"; $q5 = "OO0000"; $q6 = "O00OO0"; $s = '$' . $q6 . '=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$' . $q1 . '=$' . $q6 . '{3}.$' . $q6 . '{6}.$' . $q6 . '{33}.$' . $q6 . '{30};$' . $q3 . '=$' . $q6 . '{33}.$' . $q6 . '{10}.$' . $q6 . '{24}.$' . $q6 . '{10}.$' . $q6 . '{24};$' . $q4 . '=$' . $q3 . '{0}.$' . $q6 . '{18}.$' . $q6 . '{3}.$' . $q3 . '{0}.$' . $q3 . '{1}.$' . $q6 . '{24};$' . $q5 . '=$' . $q6 . '{7}.$' . $q6 . '{13};$' . $q1 . '.=$' . $q6 . '{22}.$' . $q6 . '{36}.$' . $q6 . '{29}.$' . $q6 . '{26}.$' . $q6 . '{30}.$' . $q6 . '{32}.$' . $q6 . '{35}.$' . $q6 . '{26}.$' . $q6 . '{30};eval($' . $q1 . '("' . base64_encode('$' . $q2 . '="' . $c . '";eval(\'?>\'.$' . $q1 . '($' . $q3 . '($' . $q4 . '($' . $q2 . ',$' . $q5 . '*2),$' . $q4 . '($' . $q2 . ',$' . $q5 . ',$' . $q5 . '),$' . $q4 . '($' . $q2 . ',0,$' . $q5 . '))));') . '"));'; $s = '<?php ' . "\n" . $s . "\n" . ' ?>'; //echo $s; // 生成 加密后的PHP文件 // echo $s; // $fpp1 = fopen($filename, 'w'); // fwrite($fpp1, $s) or die('写文件错误'); return $s; } if (isset($_POST['data'])) { $data = jiami($_POST['data']); echo ($data); } else { echo ("失败"); } ``` 猛的一看,加密的无懈可击,但是仔细分析的话,还是可以恢复原先的代码的。 # 加密过程 比如加密前是这个 ```php <?php print_r("hello world." . "<br/>"); echo "congratulations!"; ``` 加密后变成了这样: ```php <?php $O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};eval($O00O0O("JE8wTzAwMD0iUEV5RE1ocktha1JpVUNZdlRHZ3FkQWNTZm9WWEhabUJ0V0ZJUU93dUxsZWJwSmpOc256eHBJa2ZnY1ZKYkhLUHZFakxZRFd1elpob1JycUdsdE1uRkFlbVhVZHd4c2FOeWlDVE9TUUJwZjlkYmxaSmhsaXlOU0tSaFBXUGJEcU9ORDhXejI5a05EWHdtUFp3bWZCUGhQOCtKWU9KdEFUck5rWlBqMjl3dDNpY3pscU9qR0t5TjI1UW1vbTciO2V2YWwoJz8+Jy4kTzAwTzBPKCRPME9PMDAoJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAqMiksJE9PME8wMCgkTzBPMDAwLCRPTzAwMDAsJE9PMDAwMCksJE9PME8wMCgkTzBPMDAwLDAsJE9PMDAwMCkpKSk7")); ?> ``` # 逐步分析 代码中存在一行`%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A`不太清楚是什么,但是经过url解码之后是`n1zb/ma5\vt0i28-pxuqy*6lrkdg9_ehcswo4+f37j`,看起来是杂乱无章的数据,但是修改后,加密后的数据就无法运行了,为了搞清楚原理,我们输出一下那些符号是什么意思。 经过格式化之后,代码变成了这样的 ![image.png](https://www.zunmx.top/usr/uploads/2024/03/3274652893.png) 我在eval之前,先输出一下他们的内容 ```php echo '$O00O0O = ' . $O00O0O . '</br>'; echo '$O0OO00 = ' . $O0OO00 . '</br>'; echo '$OO0O00 = ' . $OO0O00 . '</br>'; echo '$OO0000 = ' . $OO0000 . '</br>' . '</br>'; ``` 页面上得到结果: ```html $O00O0O = base64_decode $O0OO00 = strtr $OO0O00 = substr $OO0000 = 52 ``` 看一下他们的来源都是根据url解码后的那个数据,根据索引值,列出了一份字典,如下图所示。 ![image.png](https://www.zunmx.top/usr/uploads/2024/03/212720676.png) 这也就说明了为什么修改之后程序就无法运行了,这是因为你破坏了eval中的内置函数,比如说`base64_decode`是php中内置函数,然而把字典修改了,那么可能就会解码成其它“函数”,当然它也可能不是函数,而是乱码! 接下来就是解析eval里面的内容了,这里很简单,直接吧`eval`改成`echo` ![image.png](https://www.zunmx.top/usr/uploads/2024/03/356582811.png) 发现它又生成了一个变量`O0O000`,下面是一串嵌套调用,我们先解析一下嵌套调用。 ```php $O00O0O($O0OO00($OO0O00($O0O000,$OO0000*2),$OO0O00($O0O000,$OO0000,$OO0000),$OO0O00($O0O000,0,$OO0000)))) ``` 之前我们已经得到了以下结论: ```php $O00O0O = base64_decode $O0OO00 = strtr $OO0O00 = substr $OO0000 = 52 ``` 我们把其中的代码替换一下,代码最终结果为。 ```php base64_decode(strtr(substr($O0O000, 52 * 2), substr($O0O000, 52, 52), substr($O0O000, 0, 52))) ``` 我们把代码暂存一下,再输出出来。 ```php $rst = htmlspecialchars('?>' . base64_decode(strtr(substr($O0O000, 52 * 2), substr($O0O000, 52, 52), substr($O0O000, 0, 52)))); echo str_replace("\n", "</br>", $rst); ``` 最终还原了php代码 ![image.png](https://www.zunmx.top/usr/uploads/2024/03/2371654724.png) # 结语 一些加密破解方法基本上是可以把eval换成echo的,进而分析代码,得到最终的源码。 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏