
いつもお世話になっています。
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をつけさせていただきます。
この質問の締め切りは週末を予定しています。
お手数をおかけしてしまい申し訳ありませんが、よろしくお願いいたします。

No.2
- 回答日時:
JavaのクラスファイルのほうがC/C++などで作られたプログラムより多くの実行時情報をを持つのは事実です。
見方によっては確かに「リバースエンジニアリングがしやすい」と捉えるかたもいるでしょうか、
ではC/C++で書かれたプログラムは本当にクラックされにくいのでしょうか?
大手ベンダの製品でさえわずかな期間で海賊版が現れるのを考えれば、
どちらもそれほど大差ないのがおわかりになるかと思います。
Javaで開発する上で気をつけなくてはならないのは、
・かなり大きいサイズのランタイムライブラリのインストールが必要で、
しかも多くのパソコンにはそれが標準で含まれていない
・起動が遅い
・環境依存の機能が使いにくい
といった点です。
それにくらべればリバースエンジニアリングのしやすさなど、それに引き換えて得られた開発効率を鑑みれば
些細なことでしかありません。
ご友人のご指摘は事実ですが、ごく些細な事実です。もっと他に考慮すべき点が多数あります。
ご回答ありがとうございます。
Javaを使えばそれなりにデメリットもあるのですね。
ユーザーの利便性と、セキュリティの確保と、その間でバランスを取ることが必要なのか、と改めて考えさせられました。
当初の私の質問から想定していなかったご回答ですが大変参考になりました。貴重なアドバイス、ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- ASP・SaaS イントラネットを構築したい 2 2022/04/24 11:08
- YouTube 新しく買ったデスクトップPCを使用すると、今までのGoogleのアカウントが使えなくなった。 1 2023/01/07 00:41
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- IT・エンジニアリング プログラマの仕事内容 4 2022/08/13 00:34
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- その他(ソフトウェア) Windows10のバックアップ イメージバックアップとフリーソフトバックアップ 5 2023/02/13 17:10
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
Javaプログラムをリバースエン...
-
C言語(gcc), Linux, FTPプログ...
-
空elseの有無
-
変数・オブジェクト名に漢字使用
-
きれいなコード vba vbaを勉強...
-
あるプログラムのコマンドライ...
-
正しい五十音順について
-
VBAにてメール作成した際、一部...
-
65536は2の何乗なのでしょうか?
-
EXCELなどで「返す」という表現
-
Excelで4096点以上のFFTの方法
-
Vba UserFormを前面に出す方法...
-
バッチファイルでUSB挿入時に実行
-
ABAQUS ユーザーサブルーチン...
-
VBAで関数をつくる
-
PICマイコンのコピー(クローン...
-
C++ で、「)」が必要 というエ...
-
内税の計算式
-
排他的論理和 BCC(水平パリテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
プログラミングのコード量に関...
-
空elseの有無
-
C言語(gcc), Linux, FTPプログ...
-
「ルーチン」という言葉の意味
-
きれいなコード vba vbaを勉強...
-
C++ソースからUMLの設計書を作...
-
逆フーリエ変換のプログラムに...
-
VBからシャットダウンさせる方法
-
変数・オブジェクト名に漢字使用
-
(各種言語)自作関数化の基準...
-
1~1000,1001~2000の間に素数が...
-
他人が作ったプログラムのメン...
-
GUIプログラミングはガワを作っ...
-
ActiveXコントロールの作成(V...
-
プログラミングの読み方、書き...
-
他人の作ったソースの見方(どこ...
-
COBOLのCALL文がいまいちつかめ...
-
opencvでのエラーメッセージの...
-
テキストの折り返し処理について
おすすめ情報