这种自定义加密方法国外的程序很常见(个人猜测而已,因为类似解密文章都是国外的,从英、俄语、波斯文的文章都有,虽然看不懂,解密后的代码也不一样,但是加密方法大同小异,具体看文章末尾分析)
这个程序的作者简直可以用变态来形容。我先来整理一下代码。
原加密代码为:
<?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; ?>
这样我们就可以清楚几个变量对应的值了
$OOO000000 | fg6sbehpra4co_tnd |
$OOO0000O0 | base |
$OOO000O00 | fopen |
$O0O000O00 | fgets |
$O0O00OO00 | fread |
$OOO00000O | strtr |
$OOO0O0O00 | __FILE__ |
$OO00O0000 | 45296 |
将原代码中的变量一一替换得到:
<?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的。虽然看不懂,但是却看不到国内解密这样加密手段的例子