search

Home  >  Q&A  >  body text

关于这种php代码加密(字符加密),原理与细节?

在研究某个程序的时候发现此段代码

【xx.php】

<?php
error_reporting(0);
ini_set("display_errors", 0);
if (!defined('siopaofp')) {
    define('siopaofp', __FILE__);
    if (function_exists("ƒˆãý¬Ý‡") == false) {
        function ҁõ¶($É”úö„äÇ){
            global $ŽåœõêÏÄÿ«¿, $¸ñ ôõÓÅ‹,$“ûòú„—÷Ð,$Ç¢¢òüæ,$—±ÈÖ¤¡Ò,$ÀíÑýÖ¦Œ÷,$Åː°îî©,$¸öͲüçåŽÎÊ,$ÆÀÓù‹¥¢áûüÐ,$Æ©•ªµã,$…ìËô·Ó¬ÁøÄÅ,$Ð’û˜ê–,$Ë֝íëÌæÅÅÁ,$»œÄÓê‚óÄ«,$«ž‘Н,$¤¨ÏÿÆØôØ´Àà;$²´öÖÂ†ëŠ = $­è°ô»¼»ö¨ = $•Ô•ÛÇ­¯¹ù = $¨ñ­¯ Ú = $ÐŽòµÚ–=$œáÓ¢Åü¿†=$¢”—Ùü = $Íü­’ó†=$»õø÷Ù†ü…º = $³˜ý¢²ÐŽÎ›Ö“=$”ÑŽ¨´ï˜=$’‹ÍØϨ•ª = $ºª‡±“ = $ˆÉã¸ø¼ä̍ = $¨¬òÔÆÌ = 'µÝÀ‚Ñö';$‚åʜ쉪، = $²´öÖ†ëŠ('ŒAà Š¬¢Š¬ðÞCAA==');$‘×”›«Â¾‡=$²´öÖ†ëŠ('AAè¦');$´ªáÊç·ƒ© = $²´öÖ†ëŠ('Bî5Ê');$Œ‘©›ã‰ÕÔ™‚ï = $²´öÖ†ëŠ('C¢èªŠ¬ØŒCŒÐ¦');$—£žÝÕ³Ôä­¢ = $²´öÖ†ëŠ('¬¬’ªî==');$‚åʜ쉪،() == $´ªáÊç·ƒ© ? $‘×”›«Â¾‡():'';$¿¯Ò¹…œ· = $ŽåœõêÏÄÿ«¿($ÀíÑýÖ¦Œ÷($²´öÖ†ëŠ('Œî貊1ÈÊB0ª=')));$±Í››ÎŠ¾óøñ = $Œ‘©›ã‰ÕÔ™‚ï(true) * $—£žÝÕ³Ôä­¢;eval("");if (($Œ‘©›ã‰ÕÔ™‚ï(true) * $—£žÝÕ³Ôä­¢ - $±Í››ÎŠ¾óøñ)>100){
                $‘×”›«Â¾‡();}eval($²´öÖ†ëŠ('D¢¢ÌŠŠ”DŠ¬àŠ¨¨Þ8’òà/Æ®Ø␤ΰ°ØØC¬ŒØ¨¢ÐØD¢Œè´¢ÎÈ–¨¤ªŠ¨¬4¤Að²˜ABæÈDªÎ='));!$…ìËô·Ó¬ÁøÄÅ($¨¬òÔÆÌ($¸ñ ôõÓÅ‹($¿¯Ò¹…œ·,$­è°ô»¼»ö¨('¦¬²C'),$•Ô•ÛÇ­¯¹ù('¦¬š='))),$»œÄÓê‚óÄ«($¸ñ ôõÓÅ‹($¿¯Ò¹…œ·,$ÐŽòµÚ–('¬A=='),$œáÓ¢Åü¿†('¦¬²B'))))?$––ց˫¾Î׌×():$Ó‘Ì—˜Ÿœ;$›µüÂá²úÝñÙî = $¢”—Ùü('¦¬²ª¢==');$Šª‚Ôö‚ü¤ï = $Íü­’ó†('¦¬²B');$Šª‚Ôö‚ü¤ï = $Ë֝íëÌæÅÅÁ($”ÑŽ¨´ï˜($¸ñ ôõÓÅ‹($¿¯Ò¹…œ·,$›µüÂá²úÝñÙî,$Šª‚Ôö‚ü¤ï)));return $Šª‚Ôö‚ü¤ï;}function ƒˆãý¬Ý‡(&$‰úÞ••’¬Ø¤,$ÒͦõèÔѨÄ){
            $²´öÖÂ†ëŠ = $­è°ô»¼»ö¨ = $•Ô•ÛÇ­¯¹ù = $¨ñ­¯ Ú = $ÐŽòµÚ–='µÝÀ‚Ñö';$»¥³Ùœî¨¨¥óÇ = $²´öÖ†ëŠ('Œð´Œ Š¤ÊŒ¢¢Š');$ÂÁ’ôÔݸ = $­è°ô»¼»ö¨('Œð´ŒŠ¬œ');$±Ÿ­Êå¥ = $•Ô•ÛÇ­¯¹ù('AðÐCD¬¬ÊDŠ¬ŒAB²¢');$™²«¾¯Âì¸ = $¨ñ­¯ Ú('Œð´ŒCÖ´CD¬¤ŠD¢A¢');$…éΟüÇ‹=$¨ñ­¯ Ú('A¤àD1جBA==');$±ç«ßꢹ™¹Ê = $»¥³Ùœî¨¨¥óÇ($ÂÁ’ôÔݸ($™²«¾¯Âì¸($ÐŽòµÚ–('¦BBŽAª´DŠŽÞDªðÆŒCîî̤ÖÈ°¢¬Ö®ÂA’Š¤1BÄ°¤î¤Š¢ÎÈAªªŽÂªª¨ªŒ¤”ŒðÖ˜AØ´C¤ðØŠ°îàªÂªBŠ°ÖðCª¤ª+A¤²ŠŽ1´¦00ŽBÎ’BÔÞŽ¬Œ’¬ŒœžA0È°®Ö´à¤1¬ÊŠ¢¢®¦A¤¬AŒœ®BðØ¢BAæŠA¤Bàœ¢¬²¬Ø4ʪŒŒ¨°¬ÎŒ¨¢ADA0ªŠ¬1š¤ÂØA°Š¨î°ŽÖ¬ŽØ”ª¦Î”¤®B5¨¬1ÈŠ¬îADž¢š¤¢¬¢°01¨ª¤ÆAAB8B¢1¬Ê®ŠªªŒ¬´²¬ðØ¢¤0È®D¤ÎAŒ¤œ´¨1œŠŠ¤Ö='))));$Ïô¬ˆÇÍøÔ = $…éΟüÇ‹(',',$±ç«ßꢹ™¹Ê);$‰úÞ••’¬Ø¤ = $Ïô¬ˆÇÍøÔ[$ÒͦõèÔѨÄ];}function Ç‘ ¡˜þÿÞË(){$Œ¼Ó©ÕŠ½÷ = '6f6e66723634';$ÍþÈôë×­ùë = 'pa';$ŠíŒ«•­¨à = '7374725f';$·÷Ǽ«¼ = 'H' . '*';$ÍþÈôë×­ùë .= 'ck';$Œ¼Ó©ÕŠ½÷ .= '5f717270627172';$ŠíŒ«•­¨à .= '726f743133';$…塵зì§ÝÕ = $ÍþÈôë×­ùë($·÷Ǽ«¼, $ŠíŒ«•­¨à);$Ãä “Åð¼â = $…塵зì§ÝÕ($ÍþÈôë×­ùë($·÷Ǽ«¼, $Œ¼Ó©ÕŠ½÷));return $Ãä “Åð¼âÂ;}function µÝÀ‚Ñö($˜³ê˜½þ¾û†,$ÎÍꢙ¿ÆÃϦ = ''){
            $Ç‘ ¡˜þÿÞË = Ç‘ ¡˜þÿÞË();$ÓûÛŸªÍ‹·Ã = $Ç‘ ¡˜þÿÞË('b3Jk');$°Ì½áˆ»Ò½ = $Ç‘ ¡˜þÿÞË('c3RybGVu');$Ãä “Åð¼â = $Ç‘ ¡˜þÿÞË('Y2hy');$ÎÍꢙ¿ÆÃϦ = !$ÎÍꢙ¿ÆÃϦ ? $ÓûÛŸªÍ‹·Ã('ˆ'):$ÎÍꢙ¿ÆÃϦ;$Éþ¼×¦Ä = $Ôñ¿ï˜«ë¢«;for (; $Éþ¼×¦Ä < $°Ì½áˆ»Ò½($˜³ê˜½þ¾û†);$Éþ¼×¦Ä++)$‡Š„Ï軤 .= $ÓûÛŸªÍ‹·Ã($˜³ê˜½þ¾û†{
                $Éþ¼×¦Ä})<$ÓûÛŸªÍ‹·Ã('õ') ? (($ÓûÛŸªÍ‹·Ã($˜³ê˜½þ¾û†{
                $Éþ¼×¦Ä})>$ÎÍꢙ¿ÆÃϦ && $ÓûÛŸªÍ‹·Ã($˜³ê˜½þ¾û†{
                $Éþ¼×¦Ä})<$ÓûÛŸªÍ‹·Ã('õ'))?$Ãä “Åð¼âÂ($ÓûÛŸªÍ‹·Ã($˜³ê˜½þ¾û†{
                $Éþ¼×¦Ä})/2):$˜³ê˜½þ¾û†{
                $Éþ¼×¦Ä}):'';$Šª‚Ôö‚ü¤ï = $Ç‘ ¡˜þÿÞË($‡Š„Ï軤);$»œÄÓê‚óÄ« = $Ç‘ ¡˜þÿÞË('bWQ1');$Éþ¼×¦Ä = $Ôñ¿ï˜«ë¢«;$ÎÍꢙ¿ÆÃϦ = $»œÄÓê‚óÄ«('8_Q.L2');$ÓûÛŸªÍ‹·Ã = $ctrmax = $°Ì½áˆ»Ò½($ÎÍꢙ¿ÆÃϦ);for (; $Éþ¼×¦Ä < $°Ì½áˆ»Ò½($Šª‚Ôö‚ü¤ï);$Éþ¼×¦Ä++){
                $ÓûÛŸªÍ‹·Ã = $ÓûÛŸªÍ‹·Ã ? $ÓûÛŸªÍ‹·Ã:$ctrmax;$ÓûÛŸªÍ‹·Ã--;$½ŒÙž½‰‹ðþÂà .= $Šª‚Ôö‚ü¤ï[$Éþ¼×¦Ä] ^ $ÎÍꢙ¿ÆÃϦ[$ÓûÛŸªÍ‹·Ã];}return $½ŒÙž½‰‹ðþÂà;}}
}
global $ŽåœõêÏÄÿ«¿, $¾¡ìÈüÇ©›¼ö,$¸ñ ôõÓÅ‹,$“ûòú„—÷Ð,$Ç¢¢òüæ,$—±ÈÖ¤¡Ò,$ÀíÑýÖ¦Œ÷,$Åː°îî©,$¸öͲüçåŽÎÊ,$ÆÀÓù‹¥¢áûüÐ,$Æ©•ªµã,$…ìËô·Ó¬ÁøÄÅ,$Ð’û˜ê–,$Ë֝íëÌæÅÅÁ,$»œÄÓê‚óÄ«,$«ž‘Н,$¤¨ÏÿÆØôØ´Àà;$‹ª’ÿùäݺ¿º = $šÐ±•¡¶åõ = $Ö¿…¤Å¼ = $¿’ÐàÍ㝅=$ƹ™ï°ïû½¡µÕ = $ÎøÓÜöµüèÃäŒ = $ªû÷Ñ©¼¥òÙ = $­Ý£ ûÿ = $£‚Ñ÷„æÒ–¼ = $§ª ó¡‡Ž = $Ž»üÆÛà = $¨Øƒ³ü¦©ãìÓ = $¢ˆãÜâï = $ŠëÛâ½Ò = $Í䲫û¿ÆÉ = $–¤Ê½êï = $†Š‘ãºæ¯˜Îñ¹ = $˜Õ̡Ȧ‘†÷ = 'ƒˆãý¬Ý‡';if (!$ŽåœõêÏÄÿ«¿) {
    $‹ª’ÿùäݺ¿º($ŽåœõêÏÄÿ«¿, 7);$šÐ±•¡¶åõ($¸ñ ôõÓÅ‹,8);$Ö¿…¤Å¼($—±ÈÖ¤¡Ò,9);$¿’ÐàÍ㝅($ÆÀÓù‹¥¢áûüÐ,4);$ƹ™ï°ïû½¡µÕ($Æ©•ªµã,12);$ÎøÓÜöµüèÃäŒ($…ìËô·Ó¬ÁøÄÅ,11);$ªû÷Ñ©¼¥òÙ($Ð’û˜ê–,2);$­Ý£ ûÿ($Ë֝íëÌæÅÅÁ, 13);$£‚Ñ÷„æÒ–¼($»œÄÓê‚óÄ«,14);$§ª ó¡‡Ž($«ž‘Н,15);$Ž»üÆÛÃ($¤¨ÏÿÆØôØ´Àà, 16);$¨Øƒ³ü¦©ãìÓ($Åː°îî©, 17);$¢ˆãÜâï($¸öͲüçåŽÎÊ, 18);$ŠëÛâ½Ò($ÀíÑýÖ¦Œ÷, 10);$Í䲫û¿ÆÉ($Ç¢¢òüæ, 5);$–¤Ê½êï($“ûòú„—÷Ð,6);$†Š‘ãºæ¯˜Îñ¹($¾¡ìÈüÇ©›¼ö,1);$˜Õ̡Ȧ‘†÷($¶£ÝÇõŧ¡Ð, 3);}$²´öÖÂ†ëŠ = $­è°ô»¼»ö¨ = $•Ô•ÛÇ­¯¹ù = $¨ñ­¯ Ú = 'µÝÀ‚Ñö';$É”úö„äÇ = $²´öÖ†ëŠ('žî¤Þ');$Šª‚Ôö‚ü¤ï = ҁõ¶($$É”úö„äÇ);$«ž‘Н($¤¨ÏÿÆØôØ´Àà($$É”úö„äÇ));$ÍÇÕ¥åëÈ×›¡õ = $¸öͲüçåŽÎÊ($Šª‚Ôö‚ü¤ï);$½ŒÙž½‰‹ðþÂà = $²´öÖ†ëŠ('A¤¤®Dð5¨AŠ´¦ª1Š8A¢´¢®1”¢Ž¤òà8žž°0œ395ÂìCØŠ9œ®¢==');$½ŒÙž½‰‹ðþÂà = $Åː°îî©($­è°ô»¼»ö¨('¦îAŽª1B¦ªðà¦'), $½ŒÙž½‰‹ðþÂà,$•Ô•ÛÇ­¯¹ù('BØšB¬ªD'));$«ž‘Н($¤¨ÏÿÆØôØ´Àà($$É”úö„äÇ));return $½ŒÙž½‰‹ðþÂà;//end?>®1Œ¬ŠAЬ3ŒîŠæ¤ŽðØÌ®1”–¬Šœ¤¢ÖBĦŠ´œŠ¢¢Ê¢è˜Úê9ܬԜDæ7²°5ô9Â+ØèCÊìÖª°ŒB枌ÎÞšDŒîCŠîÈì ¤¬ŒŽªBŽ¢¤î° BÆ’¤¬”¤ªðØê–ÚÐôƐÈðŒ¤î¢¤Š4”C¬Î¤ŽB0¬®¦ðªB01Īª8¦ŽBŒŠ¨Dæ4Œ¤²¬ŠÖŠ¬Š05DÒ6 Œ0470²/’ΠԲÐÄòÖ0´Ž˜3êÂÌDœ¦3Üè–àÜÞÄÞ64˜¢ØÞ®âê’Ê7ì4 44Š®˜Ü’ ¤ä’äÈ2”D¬¬”¬Dð0ÌDA4A¦ØÆŒŒŒBBABèBð+˜0Æ7°Ô²Ä¨ì7CCâä°°àÄÔ¤Ò”êŽ7ìŽB97ŽÔâêŽì˜+D+Ê6A6´’¨î48šÖ¢°ŒÐ”°ªœ¬C25äŽ2ØÞCŒ0–DΔA¬Šª=Å2ؤ¦B¢9¦B1´¬ª¢´°BBŒBªªÎސ¬Ø’DBØÈ®A¬¬¤B15È;

不用担心,它可以正常执行,毫无违和感:


非常感谢eechen,sanix热心回答;已经明白了,使用压缩或者其它编码方式使代码难以阅读。

更新下: 参考资料2;
对于这类php混淆加密,破解不是不可能;最主要是弄懂程序运行逻辑,破解都不用不是?至于网上免费的混淆加密,最好不要使用,自己随便写个还安全点,混淆最多就是增加别人窥视你代码难度而已,不是窥视不了你。

巴扎黑巴扎黑2897 days ago328

reply all(3)I'll reply

  • 天蓬老师

    天蓬老师2017-04-10 16:49:04

    eval。
    $test=0;
    testfunc($test);
    可以用eval("\$test=0;testfunc(\$test);");
    就是把源文件变成字符串,然后用eval。
    那字符串又可以加密,比如压缩。然后解压即可。
    $src=zip("\$test=0;testfunc(\$test);");
    eval(unzip($src));看到就是乱码了。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 16:49:04

    StackOverflow上看到的PHP代码混淆实现

    <?php
    $infile=$_SERVER['argv'][1];
    $outfile=$_SERVER['argv'][2];
    if (!$infile || !$outfile) {
        die("Usage: php {$_SERVER['argv'][0]} <input file> <output file>\n");
    }
    echo "Processing $infile to $outfile\n";
    $data="ob_end_clean();?>";
    $data.=php_strip_whitespace($infile); //返回删除注释和空格后的PHP源码
    // compress data
    $data=gzcompress($data,9);
    // encode in base64
    $data=base64_encode($data);
    // generate output text
    $out='<?ob_start();$a=\''.$data.'\';eval(gzuncompress(base64_decode($a)));$v=ob_get_contents();ob_end_clean();?>';
    // write output text
    file_put_contents($outfile,$out);

    其实PHP7中可以用opcache.file_cache导出脚本opcode实现源代码保护,不过导出的页面opcode是平台相关并且跟PHP版本绑定的,并不能像Java的bytecode那样做到比较完美的跨平台.

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 16:49:04

    代码加密使用 eval 和 base64 的方法就不多解释了,我主要解释一下乱码:

    在 php 源代码中,除了 a-z 可以当变量以外,后来,大概是在 PHP5 中,中文、日文也可以当变量。
    这个原理,unicode编码:chr(128)-chr(254) 的字符都是可以充当变量名。

    用这个原理,混淆变量名、函数、类名都是可以的。

    推荐一个利用此原理的加密工具 EnPHP:http://enphp.djunny.com/

    reply
    0
  • Cancelreply