• ベストアンサー

Javaプログラムをリバースエンジニアリングされない技術について

いつもお世話になっています。 Write Once Ran Anywhare に惹かれてJavaでプログラムを作ってみました。 (とても簡単な)アウトラインエディタのようなものでもっと機能を拡張していこうかなぁ、と思っていたのですが、友人が言うには、「Javaは中間にバイトコードを作っているから、簡単にリバースエンジニアリングされるよ。フリーソフトを作るならいいけど、機能を高めてフリー版と有償版を作ろうとか考えているなら、すぐにクラックされるから、まだC++で作ったほうがいいよ」とのことでした。 調べてみたところ、クラック対策として「パッキング」という技術があるようなのですが、私が見つけたのはC++についてでした。 どうやら、実行ファイル形式で存在している以上、バイナリを追えば(時間はかかるものの)必ず解析されてしまう、というのが常識のようですが、Javaで作るソフトはソースをそのまま公開しているようなものらしく、バイナリではなくソースを追って解析されてしまう、というのことのようです。Javaで有償ソフトを作ることはクラッキング対策の面から見て非現実的なのでしょうか? Vectorなどを見てみましたが、有償の高機能エディタはみなWindowsでのみ動く(≒VCで書かれていて、レジストリを使っている)ようです。 ※蛇足ですが、VBについてはなぜかリバースエンジニアリングする技術情報などは見つかりませんでした。VB製のソフトはリバースエンジニアリングをするのが難しいのでしょうか? いずれにしても、Windows上でしか動かない、というのはあまり魅力を感じない点なのですが。 できれば、OSを選ばないJavaで、高機能のソフトを作って、やがては(いつのことになるかはわかりませんが)満足のいくものになったらフリー版と有償版とを公開したいなと思っています。 もし、デバッグやソフトウェアセキュリティにお詳しい方がいらっしゃいましたら、よろしくご回答をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

Javaで作る限り、デコンパイルは避けられないと考えるべきかと。簡単に、ほとんどオリジナルのソースコードに近いものがデコンパイルされるので、ソースコードを読めればたいていの処理はわかってしまう。 対応策としては、1つは「難読化」というのがある。これは変数名だのメソッドやクラス名だのといったものを無意味な記号の羅列に変換したりして、極端にソースコードを読みにくくする技術。ソースコードが得られても、それが恐ろしく読みにくくできていれば、たいていの人間は詠むのを放棄する。 もう1つは、重要な部分をネイティブコードで実装するというもの。Javaは、C/C++などで作成したプログラムを内部から呼び出すことができる。そこで、「ここだけは見られては困る」という部分をネイティブコードで実装する。ただし、この方法だと、その部分はプラットフォーム依存になってしまうため、「どのOSでも動く」とはいかなくなる。 他、JavaのバイトコードをWindowsなどのネイティブコードに変換するソフトというのも存在する。要するに、JavaのプログラムからEXEを作るものと思えばいい。この場合も、プラットフォーム(Windowsだけでしか動かない)になる。 だいたい、対応としてはこの3通りぐらいじゃないだろうか。

miraise
質問者

お礼

ご回答ありがとうございます。 とてもわかりやすく大変ためになりました。 「難読化」は、作る私がギブアップしてしまいそうですね。完成した後に一括置換とかすればいいのでしょうか。いずれにしても、ソースは手に入ってしまうのですね。 また、「ネイティブコードにする」と、やはり「どのOSでも動く」とは行かなくなるのですね。勉強になります。 すでに十分すぎるご回答が得られているのですが、一点補足をお願いしてもよいでしょうか。 もしご存知であればでかまいません。 今回は、JavaのSwingを使ってGUIのテキストエディタ(もどき)を作ってみたのですが、いろいろ調べてみたところ、ソースを隠蔽して公開するのであれば、ANo.1様のご指摘どおり、CかC++で記述して、それぞれの環境でコンパイル(必要であればさらにパッキング)すればよい、ということがわかりました。 ただ、調べた例ではWindows環境でVC++を用いた開発をしている例ばかりでした。VC++のソースをLinuxなり他のOSに移してコンパイルしてもGUIアプリケーションにはならない・・というか、そもそもコンパイルできない気がします。 C、C++でのOSに依存しないGUI開発をするためのライブラリとしては、何かオススメ・有名なものはあるでしょうか。Amazonで書籍を調べてみたところ、OpenGLというものがあるようですが、3Dグラフィック表示などゲーム用?のライブラリのようです。 C、C++用のGUI開発用のコンポーネント郡のようなもの(JavaでいうSwingにあたるようなもの)があるのかどうか、もしご存知でしたらご教授ください。 カテ違いでしたら、改めてカテを変えて質問させていただきます。 また、ANo.1のご回答者様にはポイント20をつけさせていただきます。 この質問の締め切りは週末を予定しています。 お手数をおかけしてしまい申し訳ありませんが、よろしくお願いいたします。

miraise
質問者

補足

私の調査不足でした。調べたところ、Qt(キュート)というライブラリがあるようです。 「Windows、UNIX/Linux、Mac OS Xという複数のプラットフォームでGUIを提供するQt。一度書けばどこでもコンパイルできる。」とのことでした。 興味を持ちましたので、勉強してみようかと思います。 もし他にオススメのライブラリや「その前に一読!」というような書籍、その他アドバイスなどかありましたら、ぜひいただければ嬉しいです。 Wikipediaのリンクを貼っておきます。 Qt - Wikipedia http://ja.wikipedia.org/wiki/Qt

その他の回答 (1)

回答No.2

JavaのクラスファイルのほうがC/C++などで作られたプログラムより多くの実行時情報をを持つのは事実です。 見方によっては確かに「リバースエンジニアリングがしやすい」と捉えるかたもいるでしょうか、 ではC/C++で書かれたプログラムは本当にクラックされにくいのでしょうか? 大手ベンダの製品でさえわずかな期間で海賊版が現れるのを考えれば、 どちらもそれほど大差ないのがおわかりになるかと思います。 Javaで開発する上で気をつけなくてはならないのは、 ・かなり大きいサイズのランタイムライブラリのインストールが必要で、 しかも多くのパソコンにはそれが標準で含まれていない ・起動が遅い ・環境依存の機能が使いにくい といった点です。 それにくらべればリバースエンジニアリングのしやすさなど、それに引き換えて得られた開発効率を鑑みれば 些細なことでしかありません。 ご友人のご指摘は事実ですが、ごく些細な事実です。もっと他に考慮すべき点が多数あります。

miraise
質問者

お礼

ご回答ありがとうございます。 Javaを使えばそれなりにデメリットもあるのですね。 ユーザーの利便性と、セキュリティの確保と、その間でバランスを取ることが必要なのか、と改めて考えさせられました。 当初の私の質問から想定していなかったご回答ですが大変参考になりました。貴重なアドバイス、ありがとうございます。

関連するQ&A