ホームページ  >  記事  >  バックエンド開発  >  PHPの難読化文字+evalの復号化の考え方についてお聞きしたいです。 xuzuning や他の専門家が私を助けてくれることを願っています。

PHPの難読化文字+evalの復号化の考え方についてお聞きしたいです。 xuzuning や他の専門家が私を助けてくれることを願っています。

WBOY
WBOYオリジナル
2016-06-23 13:59:471210ブラウズ

最近、難読化 + 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 


2 つのコードをまとめました
リンク: http://pan.baidu.com/s/1tNVxs パスワード: gtip


I皆さんも楽しんでくださいね アドバイスをお願いします


ディスカッション(解決策)への返信

链接: http://pan.baidu.com/s/1tNVxs 密码: gtip

アドレスを再投稿します。

ファイルを実行すると、「問題がありますか?」というプロンプトが表示されますが、単独で実行しても問題はありませんが、エラーは報告されません。ダウンロードしてください、Baidu Netdisk

見た目が悪いと思う場合は、自分で文字に変更してください。原理は同じです。

気持ち悪いと思ったら自分で文字に変えればいいだけです 原理は同じです。

変更を加えてみましたが、問題なく変更できました。

あなたのdadadi.phpはあなたによって変更されましたか?

あなたのdadadi.phpはあなたによって変更されましたか?

rreee

これは問題ないはずです。

さらに、私は plugin.class.php を自分でクラックしようとして、次の 2 つの php を思いつきました
しかし、それが循環しているように見えることがわかり、コアアルゴリズムは

链接: http://pan.baidu.com/s/1qWLLFDa 密码: 4372


さらに、私は費やしました長い間自分でやっています。生成された 2 つのファイルは、plugin.class.php を復号化したものです。実行時にエラーが発生することはありません。後どうすればいいのかわかりません
暗号化された文字列を再度出力しようと思ったら、違う気がしました。決して正しい結果が得られることはありません。アドバイスをください
//function 在上面//定义了一个fun($var1,$var2='');大体意思是先先把$var1 base64还原 然后reutren ~取补数。再判断var2是否有值,下面那个好像没读懂 最后是 rerun aaa^bbb;(互斥)//下面加密了一串变量//放在一个数组中//数组的话,我后面的压缩包里面有个detempb可以弄出来,好像显示正确preg_match('正则表达式(我没有还原出来,还是还原错了感觉不对)',eval(gzuncompress(base64_decode(加密字符串穿))), ‘这里好像是一串数字’)


手動復号化の方法は、eval の変数の値を確認することです。出てくる値には eval が含まれている可能性があります。これを繰り返し実行する必要があります。とにかく肉体労働です。

ああ?当然のこととして考えてください

初めて出たときは 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 驱动的(正则附加属性 e)拦截起来比较困难
需要把数组中的 eval 改成自定义函数

解出的代码需拆分,先执行前面的参数设置,然后处理后面的自解码代码

能不能提供一下你解密获取array的代码,我研究一下

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);
输出的最后一行就是最后执行的代码

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。