解密一个PHP自定义加密的文件

这种自定义加密方法国外的程序很常见(个人猜测而已,因为类似解密文章都是国外的,从英、俄语、波斯文的文章都有,虽然看不懂,解密后的代码也不一样,但是加密方法大同小异,具体看文章末尾分析)
这个程序的作者简直可以用变态来形容。我先来整理一下代码。
原加密代码为:

<?php
$OOO000000=urldecode('%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64');
$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};
$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};
$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};
$OOO000O00=$OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};
$O0O000O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14}.$OOO000000{3};
$O0O00OO00=$OOO000000{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};
$OOO00000O=$OOO000000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8};
$OOO0O0O00=__FILE__;
$OO00O0000=45296;
eval($OOO0000O0('aWYoITApJE8wMDBPME8wMD0kT09PMDAwTzAwKCRPT08wTzBPMDAsJ3JiJyk7JE8wTzAwME8wMCgkTzAwME8wTzAwLDEwMjQpOyRPME8wMDBPMDAoJE8wMDBPME8wMCw0MDk2KTskT08wME8wME8wPSRPT08wMDAwTzAoJE9PTzAwMDAwTygkTzBPMDBPTzAwKCRPMDAwTzBPMDAsMzgwKSwnVnh6dytBT1BpMUZudXRnQzdIOTY1MkpSakk0LzNaZnF5MGM4TlVlTVlHUXJza2xtU29wQmhiREtYTGR2V0VhVD0nLCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJykpO2V2YWwoJE9PMDBPMDBPMCk7'));
return;
?>

先把倒数第三行的eval改成了echo
其次就是line2的urldecode用url解密得到内容为:fg6sbehpra4co_tnd

这个加密最邪恶的地方其实是变量,变量用字母o和数字0来迷惑人,让人分不清什么跟什么(这个一会儿说)

先说第一层解密后得到的内容:

<?php
$OOO000000='fg6sbehpra4co_tnd';//url解密得到的内容
$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};
$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};
$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};
$OOO000O00=$OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};
$O0O000O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14}.$OOO000000{3};
$O0O00OO00=$OOO000000{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};
$OOO00000O=$OOO000000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8};
$OOO0O0O00=__FILE__;
$OO00O0000=45296;
/*echo解密得到的内容*/
if(!0)$O000O0O00=$OOO000O00($OOO0O0O00,'rb');
$O0O000O00($O000O0O00,1024);
$O0O000O00($O000O0O00,4096);
$OO00O00O0=$OOO0000O0($OOO00000O($O0O00OO00($O000O0O00,380),'Vxzw+AOPi1FnutgC7H9652JRjI4/3Zfqy0c8NUeMYGQrsklmSopBhbDKXLdvWEaT=','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'));
eval($OO00O00O0);
return;
?>

其实看清楚变量哪个跟哪个是哪个就很容易解密了,构造一个解密文件运行:

<?php
$OOO000000='fg6sbehpra4co_tnd';
$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5}; //base
$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};
$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};
$OOO000O00=$OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};
$O0O000O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14}.$OOO000000{3};
$O0O00OO00=$OOO000000{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};
$OOO00000O=$OOO000000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8};
print_r($OOO000O00);
print_r('<br>');
print_r($O0O000O00);
print_r('<br>');
print_r($O0O00OO00);
print_r('<br>');
print_r($OOO00000O);
return;
?>

这样我们就可以清楚几个变量对应的值了

$OOO000000fg6sbehpra4co_tnd
$OOO0000O0base
$OOO000O00fopen
$O0O000O00fgets
$O0O00OO00fread
$OOO00000Ostrtr
$OOO0O0O00__FILE__
$OO00O000045296

将原代码中的变量一一替换得到:

<?php
/*定义加密部分*/
$OOO000000='fg6sbehpra4co_tnd';
$OOO0000O0=$OOO000000{4}.$OOO000000{9}.$OOO000000{3}.$OOO000000{5};//base
$OOO0000O0.=$OOO000000{2}.$OOO000000{10}.$OOO000000{13}.$OOO000000{16};
$OOO0000O0.=$OOO0000O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};
$OOO000O00=$OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};//fopen
$O0O000O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14}.$OOO000000{3};//fgets
$O0O00OO00=$OOO000000{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};//fread
$OOO00000O=$OOO000000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8};//strtr
$OOO0O0O00=__FILE__;
$OO00O0000=45296;
/*加密结束*/
/*操作开始,既原代码中二次加密的部分*/
if(!0)$test=fopen(__FILE__,'rb');
fgets($test,1024);
fgets($test,4096);
$data=base(strtr(fread($test,380),'Vxzw+AOPi1FnutgC7H9652JRjI4/3Zfqy0c8NUeMYGQrsklmSopBhbDKXLdvWEaT=','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'));
eval($data);
return;
?>

去掉一下无关代码:

<?php
if(!0)$test=fopen(__FILE__,'rb');
fgets($test,1024);
fgets($test,4096);
$data=base(strtr(fread($test,380),'Vxzw+AOPi1FnutgC7H9652JRjI4/3Zfqy0c8NUeMYGQrsklmSopBhbDKXLdvWEaT=','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'));
eval($data);
return;
?>

就这么简单

PS:原文件后面还有一堆数据,内容过长我就不贴了。。。

解密手段并不高明、高深,只要弄清变量谁是谁就很简单了。我Google了一下,国外有很多解密这个加密手段的例子,有混淆字母o和数字0的,也有混淆字母l和数字1的。虽然看不懂,但是却看不到国内解密这样加密手段的例子