2017/10/03

PHPソースは簡単に難読化できます

PHP 


PHPソースを難読化するための無料ツールを提供します。

簡単にできるのでぜひ試してみてください。



難読化とは

まずは難読化について今一度理解を深めてみましょう。

「四の五の言わず難読化ツールを教えて!」という人は読み飛ばしてください。

アンカーを置いておきます。簡易難読化ツールへジャンプ


難読化」とは、文字通り読みづらくすること。


ソースコードを書くときは、誰が見ても分かるようにするのが基本です。

ですが、あえてその逆をするのが難読化です。


なぜ読みづらくする必要があるのでしょうか。

それは、ソースコードを解析されるのを防ぐためです。

解析されてしまうと、ソースコードを再利用されたり、脆弱性を発見されてしまう可能性が出てきます。


あなたが販売をしているシステムが、再販されたり攻撃されてしまわないよう、難読化をする必要があります。



どうやったら難読化できるか

では、どうやったら難読化ができるでしょう?


答えは簡単です。


読みやすいコードの手法を逆手にとらえれば良いのです。


例えば、より良いコードを書く教本として話題となったリーダブルコードでは次のようなことが述べられています。

  • 変数名を分かりやすくしましょう。
  • インデントを揃えましょう。
  • 分かりやすいコメントを心がけましょう。

とあります。

他にもたくさんの手法がありますが、ここではこの3つをピックアップしてみます。


難読化するには、逆をすれば良いのです。

  • 変数名を分からないものにしましょう。
  • 改行とインデントをなくしましょう。
  • コメントをなくしましょう。

つまり、こういうことですね。


実際にサンプルを書いてみます。


難読化前のソースコードサンプル

/**
 * これは配列の合計値を計算して出力する関数です
 */
function sum($list) {
    $sum = 0;
    foreach ($list as $value) {
        $sum += $value;
    }
    return $sum;
}

上のコードを難読化すると......


難読化後のソースコードサンプル

function a($b){$c=0;foreach($b as $d){$c+=$d;}return $c;}

いかがでしょうか。読めなくはないけれど、ちょっと読みづらくなりましたね。

程度は低いですが、これも難読化です。


PHPソースを100%見せないのは不可能

PHPはインタプリンタ言語ですので、実行環境にソースコードを配置します。

そうしないと動きません。


つまり、どうやってもソースコードが見える状態になります。

どんなに高度な難読化ができたとしても、しょせんは読みづらくするだけなので、頑張れば解析できてしまうということになります。


現状、そこに技術の限界があることを頭に入れておかなければなりません。


なので、高度な難読化を頑張るより「再販禁止契約」や「ASP化してソースコードを配布しない」など別のことに注力すべきと私は考えています。

特にAPS化は、配布して後は自己責任とならなく、運用含めとてもパワーが必要となります。

そのパワーはイタチごっこの対策よりも遥かに生産性の高いものだと私は信じているからです。


これはJavaScriptなど他のインタプリンタ言語にも言えることですね。


簡易難読化ツールの紹介

とはいえ、100%見せないのは不可能でも難読化はしたい!

そんな人は多いでしょう。


ここから、この記事を見た人へ本題でしょうか。長々前置きしてすみません(笑)


実は、お金をかけずにしかもお手軽に難読化はできるのです。

やり方を紹介させていただきますね。


その1.PHPのオプションでMinify(軽量化)

PHPの実行環境を持っている方は、オプションを付けるだけで簡単に軽量化することをご存じでしょうか。

php -w [file] をコマンドラインから実行するだけです。


その2.evalとbase64を組み合わせて文字列変換

まずはソースコードをbase64_encode()します。

base64_encode()した文字列をソースファイルに書いて、base64_decode()してeval()することで簡単に難読化ができます。


先ほどのサンプルを難読化したものをサンプルとしてお見せしますね。


<?php @eval(base64_decode('LyoqCiAqID+BfT9lPz96P24/Pz8/dj9sP2Q/dj9aP4PKPz9vPz+BRT9lPz8/Pz+BRQogKi8KZnVuY3Rpb24gc3VtKCRsaXN0KSB7CiAgJHN1bSA9IDA7CiAgZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKSB7CiAgICAkc3VtICs9ICR2YWx1ZTsKICB9CiAgcmV0dXJuICRzdW07Cn0='));

パッと見でいい感じに読みづらいですね。


その3.一連の流れをスクリプト化しよう

上のやり方だと最低3つの手順があります。

PHPファイルが多いと手間がかかりますので、シェルスクリプトを作ってみます。


#! /bin/sh
# distディレクトリに難読化したファイルを格納
rm -rf dist
mkdir -p dist
# 本スクリプトと同階層以下のPHPファイルが対象
FILES=`find ./ -type f -name "*.php"`
for FILE in ${FILES}
do
    # 難読化
    STRIPPED=`php -w ${FILE} | sed -e "s/<?php//" | sed -e "s/'/\"/g"`
    ENCODED=`php -r "echo base64_encode('${STRIPPED}');"`
    OBFUSCATED=`echo "<?php @eval(base64_decode('${ENCODED}'));"`

    # ファイル生成
    DIRNAME=`dirname ${FILE}`
    FILENAME=`basename ${FILE}`
    mkdir -p dist/${DIRNAME}
    echo ${OBFUSCATED} > dist/${DIRNAME}/${FILENAME}
done

こちらのソースをコピーすれば、無料で難読化ツールをゲットできます。

あなたの環境によりフォルダパスなど変えて使ってみてください。


上のサンプルでお手軽に難読化ができますが、あくまで簡易的なものなので、簡単に解析ができます。


当たり前ですけど巷に出回っているツールはもっと固いです。

特に有料のものは手が込んでいるようで、解析に時間がかかるそうです。


強固な難読化がしたい方は、有料ツールを探してみてください。

※本当はおススメツールを紹介したいところではありますが、いかんせん私が有料ツールを使ったことがないので使い勝手がわからず紹介できません。すみません。


明日の難読化のために参考になる本を紹介

リーダブルコードは、読みやすいコードを書くための必需品です。

読みづらいコードを書くためにも必要なことは先ほど説明済みですので、ぜひ2つの観点で読んでみてください。


また、『あなたの知らない超絶技巧プログラミングの世界』という本も紹介しておきます。

こちらはまさに難読化で遊んでいる内容となっています。

IOCCC”というC言語プログラムの難読化で競い合う国際プログラミングコンテストがあり、それ自体の紹介や難読化されたソースコードの紹介がされています。

私も見てみましたがさっぱり分かりませんでした(笑)



このエントリーをはてなブックマークに追加