最近作成した.NETツールで難読化を施したのですが、完了させるまでに3日程苦戦したので備忘録的な意味も込めて手順を纏めておこうと思います。
- 目次 -
難読化とは
まず『ソースコードの難読化』とはなにか。
という所からですが、簡単に言えば「プログラムのソースコードを読み難くする」という行為です。そのままです。
プログラムにおける難読化は、そのロジックを同業者に読みづらくさせる事で改竄や盗用を防ぐ目的で利用されます。具体的にどういった処理が施されるのか、「Dotfuscator」と呼ばれるソフトの機能概要から一部引用してみます。
■名前変更
難読化により名前を変更すると、メソッドや変数などの名前が変更され、ソースコードの理解が難しくなります。Dotfuscator は、PreEmptive Solutions 社によって開発され特許を取得した、オーバーロード誘導(Overload Induction™)と呼ばれるより強力な難読化技術を使用します。オーバーロード誘導は、名前ごとに1つの新しい名前を使用するのではなく、できるだけ多くのメソッドの名前を同じ名前に変更します。この強力な難読化の後、ロジックは破壊されないが、理解できなくなります。以下の簡単な例は、オーバーロード誘導技術の効果を示しています。
■制御フローの難読化
従来の制御フロー難読化では、逆コンパイラを混乱させたり停止させるために、条件文や誤解を招くような誤った構文が挿入されていました。このプロセスは、正しく実行可能なロジックを生成する分岐、条件付分岐および繰り返し構文を合成しますが、逆コンパイルが試行されるときに決定できない結果をもたらします。制御フローの難読化は、人間が分析するのに非常に難しいスパゲティロジックを生成します。
Dotfuscator は、従来よりもさらに高度な制御フロー難読化技術を採用しております。Dotfuscator は、コードを追加するだけでなく、逆コンパイラがソースコードを復元するために使用するコードパターンを破棄させることによって機能します。最終的な結果は、元のコードと意味的には同じですが、元のコードが記述された内容の手掛かりは含まれていません。高度な逆コンパイラが開発されても、その出力は推測になります。
AG-TECH Corporation.様
Dotfuscator 機能概要より引用
製品ページ
他にも様々な難読化技術が存在しますが、上記2つを組み合わせるだけでもかなり読み難いコードが出来上がる事が想像できますよね。解析しようとするエンジニアの気力を削ぐには十分だと思います。
この様な技術の事を総称して「難読化」と呼びます。
経緯
私は元々「ConfuserEx」と呼ばれる難読化ツールを使用していたのですが、今回自作したツールとは特に相性が悪かったのか、難読化後のツールを起動すると以下の様なエラーが発生してしまい、一部の処理を全く動かせなくなってしまいました。
自動的に文字列を置き換えた事で、準拠すべき書き方から外れてしまった・・・という事ですかね。CLS = Common Language Specification(共通言語仕様)
影響の出ていそうな部分を除外設定にしてみたり、難読化レベルを変えてみたりと色々試してみたのですが結果は変わらず。結局今回はConfuserExでの難読化を諦めざるをえませんでした。
他の難読化ツールを試してみる
とは言っても統一性の無い恥ずかしいメソッド名やら細かい仕様を見られたくは無いので、難読化は外せない!
という事で他の難読化ツールを試してみる事に。
今回試したツールは、ConfuserExを含めて以下の6種類です。
- ConfuserEx(無料)
- Eazfuscator.NET(有料 – 試用版有り)
- Phoenix Protector(無料)
- Dotfuscator(有料 – CE版有り)※CE版 = 簡易版的なもの
- NanDoKu(無料)
- babelfor.net(Babel)(有料 – 試用版有り)
とりあえず全部使ってみた上で、使いやすさなどの観点から個人的にランク付けしてみます。※有料ツールについては全て試用版を使っています。
- Eazfuscator.NET
- ConfuserEx
- Phoenix Protector
- NanDoKu
- babelfor.net(Babel)
- Dotfuscator
それぞれの使い方や難読化結果については後日別記事に纏めるつもりですが、まずは簡単に紹介していきます。
ちなみに難読化後のコードを見る逆コンパイラツールはILSpyを使用しています。
Eazfuscator.NET
まず使ってみて一番良かったのは「Eazfuscator.NET」でした。
URL:https://www.gapotchenko.com/eazfuscator.net
使い方がとにかく簡単で、exeファイルを右側の緑色のウィンドウにドラッグ&ドロップするだけ。難読化後にエラーも出ず難読化性能も申し分無しという、個人的にはパーフェクトなツール。
ただし試用版で難読化したツールは配布する事ができないという本当に「試すだけ」のツールなので、自分のPCでうまく動いたからと安心して配布しない様に注意して下さい。
正直「有料版を買ってでも使いたい!」と思いましたが、価格が$399(1$=109円で約43,000円)だったので泣く泣く断念。1万円位だったら即決だったんですけどね・・・
ConfuserEx
続いて普段使用している「ConfuserEx」。
URL:https://yck1509.github.io/ConfuserEx/
「Eazfuscator.NET」に比べると一手間掛かりますが、気にならないレベルですね。
このツールは、難読化の設定を5段階のレベルから選択できるという他のツールにはあまり無い※1特徴を持っています。「難読化の設定とか正直どうすれば良いか分からない」という方でも簡単にレベルの高い難読化を施せるので、個人的に気に入っています。
ただ今回このツールでは相性が悪いのかエラーが出てしまい使え無かったため2位。
難読化レベル5(最大)ではエラーが出てしまう場合でも2か3に落とすと動く様になったりする事もあるので、今後も積極的に使っていきたい。
※1
BABELではレベル調整に加えて細かいカスタマイズが出来る機能が存在します。
Phoenix Protector
続いて「Phoenix Protector」。
URL:https://ntcore.com/?page_id=384
シンプルな見た目が良いですね。
こちらは上のスペースにexe実行ファイルをドラッグ&ドロップし、鍵マークを押すだけで難読化する事ができます。
このツールで良かったのは、「このメソッドは難読化しない」という除外設定を簡単に行う事ができた点です。
ただこちらは特に相性が悪かったのか、難読化後のファイルは実行時にエラーが出る所か起動すらしない状態でした。原因は分かりませんでしたが今回は見送りという事で。今後使うかどうかは・・・うーん。
NanDoKu
そして次は国産フリーソフト「NanDoKu」。
HP:うーわー Project Produced by Toki 様
メニューや設定内容が日本語で記述されているため分かりやすいです。
こちらの難読化ツールはクラスやメソッド、プロパティなど、名称の暗号化のみに対応している感じですね。他の難読化ツールの中には制御フロー自体の構成を変えたり(結果は同じ)、ダミー処理を追加したりといった事までしてくれるものがあったりします。
ただサイトの方に掲載されている「変換サンプル」を見る限り、読み難さは十分じゃないでしょうか。
処理への影響もほとんど無さそうなので、他のツールでエラーになってしまった場合にこちらで代用するというケースが出てくるかもしれません。
ちなみにこちらのツールで難読化しましたが、やはり「CLSに準拠していません」と怒られてしまい使えず。残念。
babelfor.net(通称Babel)
そして今回唯一難読化後もエラーにならず、まぁまぁ満足な結果を出す事ができたBabelです。(その割には5位ですが)
今回使ってみた無料版6ツールの中では、恐らく一番細かく難読化ルールを設定する事が可能です。細かく設定できるのは嬉しいのですが、全部英語なのでどういう意味か分かりづらい所があるのが難点。デフォルト設定で十分だと思いますが、ちょっと取っ付きにくい感がありますね。
デモ版の難読化性能はNanDoKuと同じく文字列の置換がメインです。
例としてはこんな感じ。
メソッド名は割とバッチリ残ってますが、至る所が記号?の様なよく分からない文字列に置き換えられており、詳しい内容は全く読み取れない状態になっています。よくこれで動きますよね。
こちらのツールはEazfuscator.NETと違い配布してもエラーになる事はありませんでした。正直他のツールと何がどう違ってエラーにならないのかは分かりませんが、難読化後も正常に動作する事が確認出来たので今回はこちらのツールを採用しました。
難読化のレベルを上げたい場合は有料版もあります。なんと私が見た中では最も安い「115ユーロ(1ユーロ125円の場合約15,000円)」でした。
今回はデモ版で問題無かったですが、この価格なら購入もアリですね。
詳細記事はこちら↓
Dotfuscator
最後にDotfuscatorです。
こちらはVisualStudioのProfessional版に同梱されているのと、VisualStudio2017のCE版以降でもインストールできるので一番有名な難読化ソフトと言っていいんじゃ無いでしょうか。
まぁでも結論から言うと、このDotfuscatorCE版が一番使えなかったです。とりあえずデフォルト設定でそのまま難読化してみましたが、難読化されている箇所が少なすぎて大分丸見えでした。Pro版だと違うんでしょうけどね。
一応「評価版」というPro版と同等の機能を使えるバージョンもあるみたいですが、処理後の実行ファイルの配布が出来ないみたいなので今回はパスしました。
で、どれを使えば良いの?
今回の私のケースの様に、難読化を行う事でアプリケーションが動かなくなるという現象はよくある様です。なので『とりあえず順番に使ってみて、動作に影響が出ないソフトを確認する』というのが最初にやる事だと思います。
使用するソフトによってエラーの内容が変わりますし、その原因を特定したりするのは非常に時間が掛かります。エラーの箇所を難読化対象から外しても今度は違う場所でエラーになったり・・・
場合によっては元のソースコードに手を加えないといけないなんて事に・・・!
(流石に無いか)
あまりこの言葉で片付けるのは好きではありませんが、難読化ソフトとソースコードとの「相性」というのはあると思いますので、その時々に応じて難読化ソフトを使い分けるのが良いんじゃ無いかと。