投稿アップデート情報 追記2(2017/1/24)
発端はまたまたScottなんだが,プラグインの初レビューをもらったとかつぶやいていた。Twitterの日付は12日になっているけど,お盆で忙しかったし,読んだのは15日くらい。で,そのページを見に行ったら, WPFMP を褒めてるのは勿論として,その前ふりにハッカーのことをぶつぶつ書いている。早い話が,それに手を焼いてWPFMPを導入という話なわけ。
その文章にハッカーが置いていったファイルの中に「This file is protected by copyright law and provided under license. Reverse engineering of this file is strictly prohibited.」ってのを見つけたと書いてあった。笑っちゃったよ。だって,よそさんに悪いことしに入って,警察に行っちゃだめよとか,書くのに似てるジャン。で,よくあるのかなぁとこの英文(ダブルクォートで括ってだよ)でググってみたら,なんと10000以上あった。でも,日本語だけにしてみたら,全く引っかからなくなった。それで,関連のところを見ていくと,どれを見ても$OOO000000=urldecode(‘%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64’)というのが,入っている。そうすると,次は,これはなんだとなるのが,自然というもの。
今度は,これでググってみた。大分数は減ったけど,2000ばかりある。日本語だけにしてみたら,たった1個だけ残った。これには,初めのキーワードにした英文は入っていなかった。日本語の制限を外して見てみると,最初の英文は入っているのやら入っていないのやらいろいろある。
調べていってわかったんだけど,「PHP LockIt!」というアプリがあって,これを使うと,今回調べたようなものができるらしい。米ドルで29.99とか書いてある。PHP Scriptを暗号化するアプリらしい。
デモ版を落とし,hello.phpを作って暗号化してみた。もとのhello.phpの中身はよくあるこんなの。
<?php
$hello = ‘Hello world!’;
echo $hello;
?>
これが,次のようなのに化ける。ページの都合上改行を入れているが,実際は,長い長い1行になる。
<?php /* This file is protected by copyright law and provided under license. Reverse engineering of this file is strictly prohibited. */$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.=$OOO00
00O0{3}.$OOO000000{11}.$OOO000000{12}.$OOO0000O0{7}.$OOO000000{5};$OOO000O00=$
OOO000000{0}.$OOO000000{12}.$OOO000000{7}.$OOO000000{5}.$OOO000000{15};$O0O000
O00=$OOO000000{0}.$OOO000000{1}.$OOO000000{5}.$OOO000000{14};$O0O000O0O=$O0O00
0O00.$OOO000000{11};$O0O000O00=$O0O000O00.$OOO000000{3};$O0O00OO00=$OOO00000
0{0}.$OOO000000{8}.$OOO000000{5}.$OOO000000{9}.$OOO000000{16};$OOO00000O=$OOO0
00000{3}.$OOO000000{14}.$OOO000000{8}.$OOO000000{14}.$OOO000000{8};$OOO0O0O00=
__FILE__;$OO00O0000=0x48;
eval($OOO0000O0(‘JE8wMDBPME8wMD0kT09PMDAwTzAwKCRPT08wTzBPMDAsJ3JiJyk7JE8wTz
AwT08wMCgkTzAwME8wTzAwLDB4NGY3KTskT08wME8wME8wPSRPT08wMDAwTzAoJE9PTzAwMD
AwTygkTzBPMDBPTzAwKCRPMDAwTzBPMDAsMHgxN2MpLCdFbnRlcnlvdXdraFJIWUtOV09VVEFhQ
mJDY0RkRmZHZ0lpSmpMbE1tUHBRcVNzVnZYeFp6MDEyMzQ1Njc4OSsvPScsJ0FCQ0RFRkdISUp
LTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nK
Sk7ZXZhbCgkT08wME8wME8wKTs=’));return;?>
~Dkr9NHenNHenNHe1zfukgFMaXdoyjcUImb19oUAxyb18mRtwmwJ4LT09NHr8XTzEXRJwmwJXLT
09NHeEXHr8XhtONT08XHeEXHr8Pkr8XTzEXT08XHtILTzEXHr8XTzEXRtONTzEXTzEXHeEpRtfy
dmOlFmlvfbfqDykwBAsKa09aaryiWMkeC0OLOMcuc0lpUMpHdr1sAunOFaYzamcCGyp6HerZHzW
1YjF4KUSvNUFSk0ytW0OyOLfwUApRTr1KT1nOAlYAaacbBylDCBkjcoaMc2ipDMsSdB5vFuyZF3
O1fmf4GbPXHTwzYeA2YzI5hZ8mhULpK2cjdo9zcUILTzEXHr8XTzEXhTslfMyShtONTzEXTzEXT
zEpKX==tJOkUAlkUAlkUAlkUALINUEmUoaSdo8If29ZdoWikzShcBYPdZELUAlkUAlkUAlkUAlk
KXP7alVnRPIq
もとは,47バイトだったものが,1,731バイトになる。へえっと,思ったんだが,調べている途中でわかったことによると「PHP LockIt!」って評判よくないんだな。誰にでもすぐにデコードできるとか書いてある。暗号化したものが,誰にでもすぐに復号できるようじゃお金を払う意味がないよね。でもって,誰にでもっていうのがどの程度なのか,試してみたくなるのは人情でしょ。
最初にキーワードにした英文には,デコードしてはいけませんと書いてあるけど,ハッカーにさえ利用されているくらいだから,どのくらい役に立つものか確認のためにやってみてからじゃないと,購入もできないじゃん。というわけで,ネットの記事を手掛かりにデコードをやってみた。ネット上には,はっきり書いたところはなかった。やはり,営業妨害とかにあたる恐れがあるんだろう。まぁ,私の検索の腕が悪かっただけという落ちもあるが。
しかし,それだけあやふやな手がかりしかなかったにもかかわらず,大してPHPにも暗号にも詳しくない私にデコードできてしまった。これは,まずいよ。
というわけで,よそ様の営業の妨害をするつもりはないけど,ハッカーには利用されるは大して知識のない私にでもデコードはできるはと,「PHP LockIt!」は踏んだり蹴ったりだということになってしまった(溜息)。
追記:
早速の追記。単純に「PHP LockIt!」をやっただけの状態では,暗号化(encrypted)とは言わないらしい。難読化(obfuscated)という呼び方をするようだ。読みにくくするということでは,意味があるね。簡単には読めなくなるのは確かだ。
追記(8/25):
「$OOO0000O0 デコード」などの検索ワードでここに来る方がいるので,やはりマルスクリプトは流行っているのだと思う。日本語サイトでは,今のところうちしか引っかからないようだから,営業妨害にならない程度でデコードの手順を書いておこうかな。自サイトに読めないファイルが勝手に置かれていたら,何をやられているのか知る必要があるだろうから。
【注意】自サーバ上に自分の知らないphpファイルがあってこれについて調べるわけだから,これを不用意にオンラインで実行してはいけない。該当ファイルはダウンロードし,ローカルにPHPをインストールしてオフラインでテストを行なうのがいいと思う。さらに言えば,ローカルかつオフラインであまり悪さをするscriptはない(大体の目的がオンラインでのデータ飛ばしとかみたいなので)と思うが,メイン機で試すのは避けるべきだろう。
- urldecode(‘%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64′);がどんな文字列か確認。→’fg6sbehpra4co_tnd’
- これをキーに,$OOO000000{4}や$OOO000000{14}などをアルファベットに直す。→$OOO000000{4}はb,$OOO000000{14}はt これで,元ファイルの初めの部分が,PHPのファンクションに直せる。直したものは,別ファイルにしておく(1)。
- 元ファイルには,難読化したものを元に戻す部分と実際の実行部分が含まれているわけだが,元に戻す部分を別ファイルのしてやるとうまくいく。まず,元ファイルのevalをechoに変えて,()内の文字列をPHPコードとして評価・実行する代わりに出力してやる。
$O000O0O00=$OOO000O00($OOO0O0O00,’rb’);~eval($OO00O00O0); が得られる。
- これを先ほどの(1)の情報を使ってデコードしてやる。2種の変数名関連が,$O000O0O00なんちゃらで残るので,日頃使い慣れている変数名に直す。ここで出てきたevalもechoにしておく。
デコードしたものをphpにして走らせるわけだが,このときの注意は__FILE__を元ファイル名に直すこと。元々一つのものを2つにしているわけだから,これを直し忘れるとうまくいかない。
- 出力結果として,$OO00O00O0=str_replace~eval($OO00O00O0);が得られる。これも同じように,デコードしてphpにして走らせる。ここのevalもechoにする。__FILE__を元ファイル名に直すことと,ここまでに出てきた複数のfreadの扱いに気をつければ,うまくいく。
追記(8/28):
デコードしたときにscope となる場合があるが,ecodeと読みかえれば,O.K.
追記2(2017/1/24):
WordPress File Monitor Plus(WPFMP) は開発終了の模様。 Fork として WordPress File Monitor があるのでそちらを使うといいと思う。