難読化
読みにくくするよ
内容自体は変えないよ
解読や解析をやりにくくする目的でやるよ
簡単に書くよ
難読化(読:ナンドクカ 英:obfuscation)とは
読みにくくすること。
もう少し具体的に書くと
人間語で書いたプログラムの元ネタを「ソースコード」と言うのですけどね。ソースコードとかを(処理の内容自体は同じだけど)ぐちゃぐちゃで読みにくい書き方にすることで、解読や解析を やりにくくすること
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として「ソースコード」について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
ソースコードは「人間語で書いたプログラムの元ネタ」です。
プログラムを作って動かすまでの一般的な流れは
1.人間語でプログラムの元ネタを書く
2.元ネタを人間語から機械語に翻訳する
3.翻訳された指示に従って、コンピュータさんが お仕事する
です。
コンピュータさんは人間語が分かりません。
人間様はコンピュータさんの言葉が分かりません。
プログラムは人間様が作るものです。
そこで最初は人間様が分かる言葉でプログラムを作ります。
コンピュータさんに対する「あれをやれ」「これをやれ」な命令を人間語で書くのです。
次に人間語で書いたプログラムの元ネタをコンピュータさんが分かる言葉に翻訳します。
実際に お仕事をするのは、コンピュータさんですからね。
コンピュータさんが分かる言葉に変換する必要があるのです。
コンピュータさんが分かる言葉に翻訳したので、コンピュータさんは命令の内容を理解できます。
指示に従って、お仕事をしてくれるでしょう。
かなり簡略化した説明ですけどね。
これがプログラムを作るときの流れです。
この話で登場した
人間語で書いたプログラムの元ネタ
を「ソースコード」と言います。
以上を踏まえて
ソースコードとかを、パッと見で処理の内容が分からないように、ぐちゃぐちゃで読みにくい書き方にする
のが「難読化」です。
なんで わざわざ そんなことをするかというと、中身を見て勝手にパクったり、あるいは好き勝手に改造したりされるのを防ぐためです。
身も蓋もない言い方をすれば「悪い人に対する嫌がらせ」ですね。
もちろん、難読化したからといって解読されるのを完全には防げません。
ぐちゃぐちゃ状態のものを見ることは、できます。
気合の入った人であれば、ぐちゃぐちゃ状態のものを解析して悪いことをするでしょう。
そのため過信は禁物ですが、難読化することにより相手の「よっしゃ!中身を見て悪いことをしてやるぜ!」な心をへし折る効果が期待できるのです。
ぐちゃぐちゃ状態を解析するのは大変ですからね。
それでは実際に難読化の例を見てみましょう。
例えば、そうですね。
以下のようなJavaScriptで書いたソースコードがあったとします。
var num = 0; //1から10まで加算する数字の元
//1から10まで加算する
for(i = 1; i <= 10; i++){
num = num + i;
}
//1から10まで加算された数字を表示
alert(num);
これは数字を1から10まで足して、その結果を表示してくれるプログラムです。
動かすと画面に「55」と表示されます。
パッと見で何となく やっていることが分かりますよね。
これを難読化すると、例えば以下のようなソースコードになります。
function a(b,c){var g,h;g=d(b,c);h=0;h=g+h;return h;}function d(e,f){return e+f;}var k=0,l=0;for(o=1;o<=10;o++){l=a(k,o);k=l;}alert(l);
実は、これも、やっていることは さっきのコードと一緒です。
数字を1から10まで足して、その結果を表示してくれるプログラムです。
動かすと画面に「55」と表示されます。
いかがでしょう?
パッと見で、やっていることが分かりますか?
中身を理解するには「えっとー、ここで ここに値を入れてて~、あれ?こっちは何で これをやっているの?」と時間がかかるはずです。
今回は簡単な例だったので、ちょっと気合を入れれば解析できるでしょうけどね。
これが1,000行、10,000行のプログラムだったらゲンナリしますよね。
このような
中身を読みにくくすることによって悪い人をゲンナリさせる防御策
が難読化です。
あっ、そうそう。
難読化するときは読みにくくする前の元ネタを残しておいてくださいね。
残しておかないと、何か変更を加えたいときに涙目になれます。
ご注意ください。
一言でまとめるよ
まぁ「難読化」って単語が出てきたら「読みにくくして、解読しにくくするんだな~」と お考えください。






