インタビュー
2003/06/30 00:00:00 更新

.NETの知られざる脅威
「難読化せずに.NET向けパッケージを出してはいけない」エージーテック鈴木氏

リバースエンジニアリングに対抗するための難読化ツール「Dotfuscator」を提供するエージーテック。同社の マーケティング部の鈴木行一部長は、.NETを使ったパッケージビジネスを行うには難読化が必須となると話す。Windows系パッケージでは今後、難読化ツールの活用が欠かせなくなりそうだ。

 .NETの登場で、どのプログラミング言語を使用しても均質なソフトウェア開発できるなど、開発者にとって利便性が増している。だが、この利便性を提供するMSIL(Microsoft Intermediate Language)という中間言語の存在は、新たな脅威「リバースエンジニアリング」を引き起こす可能性がある。

 VS .NETにもライト版が搭載されている難読化ツール「Dotfuscator」を提供するエージーテックの鈴木行一氏に、リバースエンジニアリングの脅威と難読化のメリットを聞いた。

suzuki01.jpg

ZDNet ソフトウェア開発において、難読化が注目される背景には何があるのでしょう?

鈴木 やはり.NET Frameworkの登場がきっかけだと思います。もともと米PreEmptive SolutionsはJava向けの難読化ツールを出していたのですが、Javaの世界ではそれほど注目されていませんでした。ところが、Windowsというプラットフォームは、世間の大半の企業では避けて通れません。今後、リバースエンジニアリングが問題になってくると考えられます。

 また、Javaはエンタープライズなどの分野である程度浸透しているわけですが、難読化ということではまだあまり騒がれていないようです。ですが、.NETに関してはそうはならないだろうと考えています。特にパッケージビジネスではJavaよりもWindows系が圧倒的に多いと思いますので、パッケージとして今後製品を出していくにあたって、中身が見えてしまうということは非常に大きな問題となるのではないでしょうか。

 従来であればexeという形にしてしまえば、中身を見られても直接意味のあるものは見えませんでした。これに対して.NETのアプリケーションを配布するに当たっては、ソースコードとは言わないまでも、何をしようとしているかがかなり分かってしまいます。おそらく世間の大半の人は、変数名が見えてしまうということでたいてい驚くと思います。変数名を見れば何をしようとしているかを推測できてしまうのですから、変数名をまったく意味不明のものにする難読化は、重要度の高いものとして理解してもらいやすいでしょう。

ZDNet エージッテックが実際に肌で感じている注目度はどのようなものでしょう?

鈴木 イベントなどに出品した感覚では、開発者の方々は、難読化は必要だよねという認識をお持ちのようです。ですが、それ以外の方にはまだ浸透しているとはいいがたいです。ただ、これから.NET向けのパッケージ製品を販売するにあたって、難読化処理を行わずに出荷する会社はないと思います。

suzuki02.jpg

ZDNet  Dotfuscatorではリバースエンジニアリングに対抗するために、どのようなアプローチを取るのでしょうか?

鈴木 exeファイルを覗いただけで変数名が見えてしまうという中間言語での問題点のクリア、高機能なディスコンパイラなどを使った場合に見えてしまうロジックの難読化、というように、リバースエンジニアリングをして見えては困るという部分をひとつずつつぶしています。Dotfuscatorでは、他の競合製品と比べても、こうした機能が多く盛り込まれています。

 弊社で扱っている米PreEmptive SolutionsのJava向けの難読化ツールに「DashO」がありますが、この製品で培ったノウハウがDotfuscatorにも生かされています。サンマイクロシステムズがDashOを標準採用していることからも、米PreEmptive Solutionsの難読化のノウハウが評価されていることが分かると思います。

ZDNet Dotfuscatorの特徴である Overload Inductionでは、どのような処理が行われるのでしょうか?

鈴木 タイプ、メソッド、フィールドという違う種別のものについて、すべて同じ名前「a」に置き換えていきます。ですから「a.a(a)」などaがたくさん使われます。aがなくなると「b」、「c」と使っていきます。つまり、ほかのものにまたがってaから始まる、多重にロードしているという意味でオーバーロードと呼んでいるわけです。

 さらに拡張 Overload Inductionというものもあります。これは戻り値を判定して戻り値で判断できるようであれば、さらにまた同じaに置き換えるというものです。本来であれば「a,b」となるべきところを、さらにまた「a,a」とします。使い勝手からいえば、9割がたの難読化は Overload Inductionで行われているといってもいいでしょう。

ZDNet VS .NET2003に同梱のCommunity Editionとエージーテックが扱っているProfessional Editionの違いを教えてください。

鈴木 基本的に、Community Editionは Overload Inductionによるリネームだけを行います。Professional Editionには、カタログなどに書かれているこれ以外の機能がすべて搭載されているのですが、重要な機能としては、暗号化、コントロールフローの難読化があります。

 また、インクリメンタルな難読化と呼んでいるのですが、外部ファイルにルールを吐き出すことで、別のDLLなどのファイルに同じルールを適用できます。つまりプロジェクトとして複数のファイルで構成されていても、より効率的な難読化が可能になります。もし連携するプログラムどうしで相互に利用しているもの、例えばグローバル変数などがあったとして、まとめてリネームできないとすると、その部分は難読化されずに残ってしまいます。それをインクリメンタルな難読化処理で、難読化させることができるというわけです。

 そのほかに、印字不能文字を使った難読化機能があります。単純ではありますが、効果はあると思います。またプルーニング(枝狩り)という機能も搭載しています。使用されていないタイプ、メソッド、フィールドなどを取り除くというものですが、これもProfessional Editionにしかない機能です。

ZDNet Professional Editionを使うべきなのはどのような場合でしょうか?

鈴木 ライセンス的な問題から、Community Editionは個人利用に限られます。ですからパッケージビジネス、つまり販売のための製品を作っている場合、Professional Editionを使っていただく必要があります。英語版のCommunity Editionは米PreEmptive Solutionsのホームページから無償でダウンロードでき、日本語版についても弊社のWebサイトから無償ダウンロードできるようになっています。そういう意味で、Community Editionは個人利用または評価用に限らせていただいております。



関連記事
▼あなたの開発した.NETソフトウェアは、リバースエンジニアリングの脅威が存在する
▼レビュー:「Dotfuscator」による難読化の威力を試してみる
▼Windows.NETチャンネル

関連リンク
▼エージーテック

[聞き手:宮内さとる,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.