![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
いつもお世話になっています。
Write Once Ran Anywhare に惹かれてJavaでプログラムを作ってみました。
(とても簡単な)アウトラインエディタのようなものでもっと機能を拡張していこうかなぁ、と思っていたのですが、友人が言うには、「Javaは中間にバイトコードを作っているから、簡単にリバースエンジニアリングされるよ。フリーソフトを作るならいいけど、機能を高めてフリー版と有償版を作ろうとか考えているなら、すぐにクラックされるから、まだC++で作ったほうがいいよ」とのことでした。
調べてみたところ、クラック対策として「パッキング」という技術があるようなのですが、私が見つけたのはC++についてでした。
どうやら、実行ファイル形式で存在している以上、バイナリを追えば(時間はかかるものの)必ず解析されてしまう、というのが常識のようですが、Javaで作るソフトはソースをそのまま公開しているようなものらしく、バイナリではなくソースを追って解析されてしまう、というのことのようです。Javaで有償ソフトを作ることはクラッキング対策の面から見て非現実的なのでしょうか?
Vectorなどを見てみましたが、有償の高機能エディタはみなWindowsでのみ動く(≒VCで書かれていて、レジストリを使っている)ようです。
※蛇足ですが、VBについてはなぜかリバースエンジニアリングする技術情報などは見つかりませんでした。VB製のソフトはリバースエンジニアリングをするのが難しいのでしょうか?
いずれにしても、Windows上でしか動かない、というのはあまり魅力を感じない点なのですが。
できれば、OSを選ばないJavaで、高機能のソフトを作って、やがては(いつのことになるかはわかりませんが)満足のいくものになったらフリー版と有償版とを公開したいなと思っています。
もし、デバッグやソフトウェアセキュリティにお詳しい方がいらっしゃいましたら、よろしくご回答をお願いいたします。
No.1ベストアンサー
- 回答日時:
Javaで作る限り、デコンパイルは避けられないと考えるべきかと。
簡単に、ほとんどオリジナルのソースコードに近いものがデコンパイルされるので、ソースコードを読めればたいていの処理はわかってしまう。対応策としては、1つは「難読化」というのがある。これは変数名だのメソッドやクラス名だのといったものを無意味な記号の羅列に変換したりして、極端にソースコードを読みにくくする技術。ソースコードが得られても、それが恐ろしく読みにくくできていれば、たいていの人間は詠むのを放棄する。
もう1つは、重要な部分をネイティブコードで実装するというもの。Javaは、C/C++などで作成したプログラムを内部から呼び出すことができる。そこで、「ここだけは見られては困る」という部分をネイティブコードで実装する。ただし、この方法だと、その部分はプラットフォーム依存になってしまうため、「どのOSでも動く」とはいかなくなる。
他、JavaのバイトコードをWindowsなどのネイティブコードに変換するソフトというのも存在する。要するに、JavaのプログラムからEXEを作るものと思えばいい。この場合も、プラットフォーム(Windowsだけでしか動かない)になる。
だいたい、対応としてはこの3通りぐらいじゃないだろうか。
この回答への補足
私の調査不足でした。調べたところ、Qt(キュート)というライブラリがあるようです。
「Windows、UNIX/Linux、Mac OS Xという複数のプラットフォームでGUIを提供するQt。一度書けばどこでもコンパイルできる。」とのことでした。
興味を持ちましたので、勉強してみようかと思います。
もし他にオススメのライブラリや「その前に一読!」というような書籍、その他アドバイスなどかありましたら、ぜひいただければ嬉しいです。
Wikipediaのリンクを貼っておきます。
Qt - Wikipedia
http://ja.wikipedia.org/wiki/Qt
ご回答ありがとうございます。
とてもわかりやすく大変ためになりました。
「難読化」は、作る私がギブアップしてしまいそうですね。完成した後に一括置換とかすればいいのでしょうか。いずれにしても、ソースは手に入ってしまうのですね。
また、「ネイティブコードにする」と、やはり「どの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をつけさせていただきます。
この質問の締め切りは週末を予定しています。
お手数をおかけしてしまい申し訳ありませんが、よろしくお願いいたします。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?e8efa67)
No.2
- 回答日時:
JavaのクラスファイルのほうがC/C++などで作られたプログラムより多くの実行時情報をを持つのは事実です。
見方によっては確かに「リバースエンジニアリングがしやすい」と捉えるかたもいるでしょうか、
ではC/C++で書かれたプログラムは本当にクラックされにくいのでしょうか?
大手ベンダの製品でさえわずかな期間で海賊版が現れるのを考えれば、
どちらもそれほど大差ないのがおわかりになるかと思います。
Javaで開発する上で気をつけなくてはならないのは、
・かなり大きいサイズのランタイムライブラリのインストールが必要で、
しかも多くのパソコンにはそれが標準で含まれていない
・起動が遅い
・環境依存の機能が使いにくい
といった点です。
それにくらべればリバースエンジニアリングのしやすさなど、それに引き換えて得られた開発効率を鑑みれば
些細なことでしかありません。
ご友人のご指摘は事実ですが、ごく些細な事実です。もっと他に考慮すべき点が多数あります。
ご回答ありがとうございます。
Javaを使えばそれなりにデメリットもあるのですね。
ユーザーの利便性と、セキュリティの確保と、その間でバランスを取ることが必要なのか、と改めて考えさせられました。
当初の私の質問から想定していなかったご回答ですが大変参考になりました。貴重なアドバイス、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
SQLデータベースへのアクセスが...
-
ノベルゲームを作成中なのですが、
-
空elseの有無
-
あるプログラムのコマンドライ...
-
65536は2の何乗なのでしょうか?
-
Excelで4096点以上のFFTの方法
-
バッチファイルでUSB挿入時に実行
-
自動クエリとはどういうもので...
-
正しい五十音順について
-
Javascrptの0の掛け算
-
バッチファイルでウインドウを...
-
フローチャートの菱形が狭い。。。
-
VBAにてメール作成した際、一部...
-
0除算して、落ちるプログラムと...
-
Visual C++でdebugとreleaseで...
-
WORD印刷できるがEXCE...
-
Bluestacks内でダウンロードし...
-
iTunesがノートンにブロックさ...
-
BIOS.binをバイナリエディタで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
空elseの有無
-
プログラミングのコード量に関...
-
C言語(gcc), Linux, FTPプログ...
-
きれいなコード vba vbaを勉強...
-
Javaプログラムをリバースエン...
-
GUIプログラミングはガワを作っ...
-
他人が作ったプログラムのメン...
-
「ルーチン」という言葉の意味
-
他人の作ったソースの見方(どこ...
-
ソースコード改造 msペイント
-
クリップボードを排他的に利用...
-
ノベルゲームを作成中なのですが、
-
1~1000,1001~2000の間に素数が...
-
GDLでH8/3052Fのi2cプログラム...
-
FILEとfstreamどちらを使う方が...
-
(各種言語)自作関数化の基準...
-
ホワイトボックステスト と ブ...
-
変数・オブジェクト名に漢字使用
-
プログラム動作時のCPU処理時間...
おすすめ情報