いつもお世話になっています。
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
テキストの折り返し処理について
-
GUIプログラミングはガワを作っ...
-
×じゃない消し方
-
パーレー法のプログラムについて
-
例外処理があまり使われない理...
-
クリップボードを排他的に利用...
-
あるプログラムのコマンドライ...
-
Bluestacks内でダウンロードし...
-
排他的論理和 BCC(水平パリテ...
-
正しい五十音順について
-
65536は2の何乗なのでしょうか?
-
excelのexe化について
-
読み込み中にアクセス違反が発...
-
VBAの再計算が反映されない件に...
-
セルフイメージを高める21日...
-
0除算して、落ちるプログラムと...
-
Excelで4096点以上のFFTの方法
-
C++ で、「)」が必要 というエ...
-
main関数を先頭に置くデメリット
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
C言語(gcc), Linux, FTPプログ...
-
空elseの有無
-
プログラミングのコード量に関...
-
きれいなコード vba vbaを勉強...
-
1~1000,1001~2000の間に素数が...
-
プログラム動作時のCPU処理時間...
-
クリップボードを排他的に利用...
-
C言語について教えてください。
-
他人の作ったソースの見方(どこ...
-
逆フーリエ変換のプログラムに...
-
良いプログラムを書くためには
-
立脚期の識別ができません…
-
C++ソースからUMLの設計書を作...
-
ノベルゲームを作成中なのですが、
-
他人が作ったプログラムのメン...
-
COBOLのCALL文がいまいちつかめ...
-
VBからシャットダウンさせる方法
-
「ルーチン」という言葉の意味
-
変数・オブジェクト名に漢字使用
おすすめ情報