難読化とはコードを分かりにくい形に変換し、読み手に理解し辛くする事です。難読化しても変換前のコードと同じように動作します。そのためプログラム自体の機能は変かわりません。

難読化の必要性

かつて、こんな記事を書きました。

ゲームのランキング偽装するのがチョロすぎて草な件

ウェブブラウザーで F12キーを押すと、ウェブページの検証画面が表示されます。そしてコンソールから値の書き換えをすることができます。

ためしにこんなページを作りました。変数 score の値を表示するだけです。

F12キーを押してコンソールに以下を入力してみます。

これでスコアを変更することができます。

またF12キーを押してコンソールに以下を入力すると関数の定義を変更することもできてしまいます。

function ~ という書き方は改ざんされる危険性があります。アロー関数にすると関数の書き換えを防ぐことはできます。

これだと上記の方法でshowScore関数を書き換えようとしてもエラーが出てうまくいきません。ただ変数 score が改ざん可能であるという事実はかわりません。

そこで不正な改ざんをさせないために難読化で対抗します。難読化は読んで字のごとし、改ざんをしようとする者にとってコードを読みづらくする事です。だから100%防ぐことはできません。

JavaScript Obfuscator Toolを使ってみる

JavaScript Obfuscator Toolは難読化をするのに役立ちます。

JavaScript Obfuscator Tool

設定を変更しないで以下を難読化してみます。

するといい感じに難読化してくれます。

ただよく見ると関数hi()を呼び出していることがわかります。

どのように難読化されるかを検証するためには「String Array」とCompactは外しておいたほうがいいかもしれません。

以下を難読化してみましょう。

すると以下のようになります。文字列に関する操作をややこしくしていただけでほとんどなにも変わっていません。

そこでRename Globalsのオプションを有効にします。

関数名が置き換わったので解読が難しくなったように思えます。

Rename Propertiesのオプションを有効にするとライブラリを使用している場合、うまく動かなくなるので選択しないほうがよいでしょう。

document[‘getElementById’](‘score’)となっていると、ここにスコアが表示されることがわかるので、

これだと難読化したときバレにくいと思います。