ホームページ >バックエンド開発 >PHPチュートリアル >PHPの難読化文字+evalの復号化の考え方についてお聞きしたいです。 xuzuning や他の専門家が私を助けてくれることを願っています。
最近、難読化 + eval を使用しているように見える、うんざりするほど暗号化された 2 つの PHP ファイルに遭遇しました。
この混乱は 0|o の違いとは異なります。エンコードがめちゃくちゃで関数名がASCIIでエンコードされているようです。
専門家にアイデアを教えてもらえませんか?
あまりナンセンスではなく、コードにアクセスしてください
<?php global $?????;$?????=array('?????'=>__FILE__);if(!defined('FEEAABFAA')){define("FEEAABFAA",1395120187);function ?????($?????,$?????=""){global $?????;$?????=base64_decode($?????);if(empty($?????)) return "";if($?????==""){return ~$?????;}else{$?????=$?????['?????']($?????);$?????=$?????['?????']($?????,$?????,$?????);return $?????^$?????;}}}$?????['?????']=?????('jIuNk5qR','');$?????['?????']=?????('mpKPi4Y=','');$?????['?????']=?????('nZ6MmsnLoJua?JCbmg==','');$?????['?????']=?????('jIuN?I+emw==','');$?????['?????']=?????('AgYIDg==','gpibl4mKhJ8=');$?????['?????']=?????('GStOLDVHHCA?OEgu','iY+Kj5yP');$?????['?????']=?????('0MvIzsfMm?rPmsmex8+encnJyczM?8rGmcrKnsfHnsjO?Jo=','');eval($?????['?????'](' 写不下了,这里省略…………'));return;?>4861704e7c6c38ed5439414665b9adb0
<?php if(!defined('BCCEFFAFDBEC')){define("BCCEFFAFDBEC",1377408872);function ?????($?????,$?????=""){global $?????;$?????=base64_decode($?????);if(empty($?????)) return "";if($?????==""){return ~$?????;}else{$侗?????$?????['侗?????]($?????);$?????=$?????['船???豹']($?????,$侗?????$?????);return $?????^$?????;}}}global $?????;$?????=array('?酣????=>__FILE__);$?????['?????']=?????('nZ6Mm?nLoJuan?Cbmg==','');$?????['侗?????]=?????('jIuNk5qR','');$?????['?????']=?????('mpKPi4Y=','');$?????['船???豹']=?????('jIuNoI+emw?=','');$?????['辜脯千?羌']=?????('0J2cz5?amZn?nsaZx?nLzJv?y53H?5qcy8?JzMjOys?H0Jo=','');$?????['?『???']=?????('CDomNQ==','mLGYqYGhx6M=');$?????['噶????']=?????('GChXHzBKKh?YVEwj','hZ2xo8Odt5/FoQ==');$?????['?????']=?????('/K73993Zn?b0kA==','k4qfiY+Vw7M=');@$?????['噶????']($?????['辜脯千?羌'],$?????['?『???'].'('.$?????['?????'].'('.$?????['?????'].'(\'这里省略…………写不下了');return;?>616df3258c3d0520a46c2829342b76be
链接: http://pan.baidu.com/s/1tNVxs 密码: gtip
ファイルを実行すると、「問題がありますか?」というプロンプトが表示されますが、単独で実行しても問題はありませんが、エラーは報告されません。ダウンロードしてください、Baidu Netdisk
見た目が悪いと思う場合は、自分で文字に変更してください。原理は同じです。
変更を加えてみましたが、問題なく変更できました。
あなたのdadadi.phpはあなたによって変更されましたか?
rreee
これは問題ないはずです。
さらに、私は plugin.class.php を自分でクラックしようとして、次の 2 つの php を思いつきました
しかし、それが循環しているように見えることがわかり、コアアルゴリズムは
链接: http://pan.baidu.com/s/1qWLLFDa 密码: 4372
//function 在上面//定义了一个fun($var1,$var2='');大体意思是先先把$var1 base64还原 然后reutren ~取补数。再判断var2是否有值,下面那个好像没读懂 最后是 rerun aaa^bbb;(互斥)//下面加密了一串变量//放在一个数组中//数组的话,我后面的压缩包里面有个detempb可以弄出来,好像显示正确preg_match('正则表达式(我没有还原出来,还是还原错了感觉不对)',eval(gzuncompress(base64_decode(加密字符串穿))), ‘这里好像是一串数字’)
初めて出たときは eval はありません
手動復号化の方法は、eval で変数の値を確認することです。それでも eval が出てくる可能性があるので、それを繰り返します。とにかく肉体労働です。
ああ?当然のこととして考えてください
初めて出てくるときは eval はありません
手動による復号化の方法は、eval で変数の値を調べることです。それでも eval が出てくる可能性があり、そうする必要があります。これを繰り返します。とにかく肉体労働です。
私はそれが可能であると述べただけで、このコードを最初のパスで解決できる人がいるはずだとは言いませんでした。 1 つの問題を解決し、最終的に理解するまでに 3 ~ 4 回繰り返したという理由だけで、それは可能です。
ああ?当然のこととして考えてください
初めて出てくるときは eval はありません
手動の復号化方法は、eval で変数の値を調べることです。それでも eval が出てくる可能性があり、繰り返す必要があります。これ。とにかく肉体労働です。
これを実行すると、2回実行されるようです @gzuncompress(base64_decode( code....))
2番目の eval は前の配列に存在するようです
しかし、2回目では @gzuncompress(base64_decode( code...) ...)) 実行後にデータエラーが表示されますが、どうやって実行したのかわかりません。アイデアを教えていただけますか?
構造はもっと複雑です
第一層
链接: http://pan.baidu.com/s/1u3Tgy 密码: j15w第二層
Array( [?????] => plugin.class.php.php [?????] => strlen [?????] => empty [?????] => base64_decode [?????] => str_pad [?????] => eval [?????] => preg_replace [?????] => /47183fe0e6a80ab66633459f55a88a71/e)と第三層は eval を直接使用します
preg_replace (通常の追加属性 e) によって駆動されるため、インターセプトするのは困難です
で eval する必要があります配列をカスタム関数に変更します
解決されたコードは、最初に前のパラメータ設定を実行してから、後続の自己復号コードを処理する必要があります
彼の構造はより複雑です
最初の層は
Array( [?????] => plugin.class.php.php [?????] => strlen [?????] => empty [?????] => base64_decode [?????] => str_pad [?????] => eval [?????] => preg_replace [?????] => /47183fe0e6a80ab66633459f55a88a71/e [?????] => time [?????] => basename [?????] => die [?????] => ????? [?????] => explode [?????] => in_array [?????] => gethostbyname)2層目
Array( [?????] => plugin.class.php.php [?????] => strlen [?????] => empty [?????] => base64_decode [?????] => str_pad [?????] => eval [?????] => preg_replace [?????] => /47183fe0e6a80ab66633459f55a88a71/e)3層目はevalを直接利用しています
preg_replace(通常の追加属性e)で駆動されているためインターセプトが困難です
配列内のevalをカスタム関数に変更する必要があります
解決したコード分割する必要があります。最初に前のパラメータ設定を実行してから、後続の自己復号化コードを処理します
配列内の eval (元の暗号化) が元の位置の echo に置き換えられています 分割するにはどうすればよいですか?
他的结构比较复杂
第一层
Array( [?????] => plugin.class.php.php [?????] => strlen [?????] => empty [?????] => base64_decode [?????] => str_pad [?????] => eval [?????] => preg_replace [?????] => /47183fe0e6a80ab66633459f55a88a71/e)
Array( [?????] => plugin.class.php.php [?????] => strlen [?????] => empty [?????] => base64_decode [?????] => str_pad [?????] => eval [?????] => preg_replace [?????] => /47183fe0e6a80ab66633459f55a88a71/e [?????] => time [?????] => basename [?????] => die [?????] => ????? [?????] => explode [?????] => in_array [?????] => gethostbyname)第三层又直接使用了 eval
preg_replace('\b777fb918ffda23fb0979c4ca77ab814\e',eval(gzuncompress(base64_decode($code))),'??b777fb918ffda23fb0979c4ca77ab814???');
代码是这样的
应该是思路有点问题,做不下去了
$filename = __DIR__ . '/plugin.class.php';$gl = '';$old_vars = '';$c = explode('eval', file_get_contents($filename));file_put_contents($filename.'_0.php', $c[0]);$old_vars = get_defined_vars();include $filename.'_0.php';$new_vars = array_diff_key(get_defined_vars(), $old_vars);//print_r($new_vars);$gl = key($new_vars);$ev = array_search('eval', $$gl);${$gl}[$ev] = '$code';$code = create_function('$s', <<< CODEglobal \$$gl;echo \$s,PHP_EOL;eval(explode('@', \$s)[0]);file_put_contents('t_2.php', '<?php '. explode('@', \$s)[1]);CODE);file_put_contents($filename.'_1.php', '<?php eval'.$c[1]);include $filename.'_1.php';//include 't_2.php';print_r($$gl);
调整了一下思路,应该是解开了
$filename = __DIR__ . '/plugin.class.php';function code($s) { $v = $GLOBALS['gl']; $$v =& $GLOBALS[$v]; echo $s . PHP_EOL; $s = str_replace('eval(', 'code(', $s); eval($s);}$gl = '';$old_vars = '';$c = explode('eval', file_get_contents($filename));file_put_contents($filename.'_0.php', $c[0]);$old_vars = get_defined_vars();include $filename.'_0.php';$new_vars = array_diff_key(get_defined_vars(), $old_vars);$gl = key($new_vars);$ev = array_search('eval', $$gl);${$gl}[$ev] = 'code';file_put_contents($filename.'_1.php', '<?php eval'.$c[1]);include $filename.'_1.php';print_r($$gl);输出的最后一行就是最后执行的代码