C ++アプリケーションコードを難読化することは重要ですか?


11

Javaの世界では、それが時々問題となるようですが、C ++はどうですか?異なる解決策はありますか?

誰かが特定のOSのC ++ライブラリを同じライブラリの異なるバージョンで置き換えることができるという事実について考えていましたが、私のコードが何をしているかを理解するためのデバッグシンボルでいっぱいです。標準または一般的なライブラリを使用するのは良いことですか?

これは、Windowsの一部のdllライブラリがそのライブラリの「デバッグバージョン」に置き換えられた場合にも発生する可能性があります。静的コンパイルを優先する方が良いですか?商用アプリケーションでは、アプリのコアとしてすべてを静的にコンパイルし、ほとんどの場合、dll(一般に動的ライブラリ)を使用して、海賊版対策ソリューションなどのサードパーティのテクノロジーを提供しています(多くのゲームでこれを確認しています) )、GUIライブラリ(Qtのような)、OSライブラリなど

静的コンパイルは、Javaの世界における難読化と同等ですか?より良い意味で、それはあなたのコードを保護するための最良で最も手頃なソリューションですか?


4
あなたが何をしても、時間がかかりすぎる人はそれを解読/逆コンパイルすることができます
Zavior

13
多くのコンパイラには/O難読化スイッチが付いています。中には、難読化のレベルが複数あるものもあります(最大/O3;)
MSalters

@MSaltersいいえ、g ++には-O3;)
BЈовићAug

@Zaviorまたは単純でリバースエンジニアリングします。バイナリ自体も必要ありません。ソフトウェアを徹底的に分析するだけです。
John Weisz 2017

回答:


27

負けた戦いに時間を無駄にしないでください

C ++および他の言語に関する他の多くの同様の回答で述べたように、これはほとんど役に立たない

参考文献

トピックの選択された読み取り(すべてがC ++固有ではありませんが、一般的な原則が適用されます):

StackExchange Answers

論文

難読化に関する有名な引用:

そして最後に、コードのプライバシーの問題があります。これは失われた原因です。熱心なハッカーがプログラムを理解するのを妨げるような変化はありません。これは、すべての言語のすべてのプログラムに当てはまりますが、JavaScriptの場合はソース形式で提供されるため、JavaScriptの場合はさらに当てはまります。難読化によって提供されるプライバシーの利点は幻想です。他の人にプログラムを見せたくない場合は、サーバーのプラグを抜いてください。- ダグラス・クロックフォード


決して?

決して難読化してはならず、そのための正当な理由はないと言っているわけではありませんが、ほとんどの場合、その必要性とその費用対効果に真剣に疑問を投げかけています。

さらに、難読化が事実上の要件である状況もあります。たとえば、ウイルスを作成する場合、明らかに難読化(および動的なもの)は、複製する能力と同じくらいプログラムの存続にとって良いことです。ただし、これは「一般的な」ケースを構成することはほとんどありません...


私たちはかつて、すべてのドングル関数呼び出しを難読化するためのライセンス要件があったハードウェアドングルを使用しました-彼らはそれを行うためのツールを提供しました。いつも私は彼らの「保護」の質に少し疑惑を抱かせました!
マーティンベケット

@MartinBeckett:確かに少し変。
ヘイレム2012

3

いいえ、これは努力に値するものではなく、私はそれは完全に不必要だと思います。呼び出す関数は、おそらく提供する機能によって推測できます。

Javaに難読化ツールが存在する理由は、JavaバイトコードとJavaソースコード間のマッピングがかなり明確に定義されており、すべての関数とメンバー変数の名前がバイトコードに格納されているためです(パブリック、プライベート、または保護されているかどうかは関係ありません)。 )そのため、Javaバイトコードインタープリターは、難読化されていないソースに対してかなり適切に元のソースの構造を示すいくつかの一般的なJavaを提示できます。

C ++は直接機械語にコンパイルされます。逆アセンブルすることはできますが、アセンブリ言語を扱うのはかなり退屈です。コンパイル中にオプティマイザがコードに加えるすべての変更のため、逆コンパイルははるかにトリッキーです。


0

これを考えると、難読化にはいくつかの異なるタイプがあります。まず、ソースコードの難読化から始めましょう。これは時間の浪費です。それなしでは理解するのは難しいです!そこで、代わりに、配信パッケージの難読化、つまりコードがユーザーに配信される方法に焦点を当てましょう。

マイナー難読化

マイナーな難読化は、カジュアルなユーザーが指を突っ込んで物を簡単に壊すのを防ぐために存在します。それは決定的なハッカーを締め出しませんが、サポートするように求められているものがあなたが実際に提供したものであることを保証するのを助けるのに価値があります。この種のものに必要な保護のレベルは非常に低いです。配信パッケージが単にないために持って見て(専門家のツールなし)読み取りおよび編集可能な、それはかなり良い十分です。

Javascriptの縮小化はこの例ですが、そのように販売されていません。十分に決定された/永続的である場合に技術的に可能であるとしても、縮小されたJSファイルを読み、編集することを望んでいる人はいないでしょう。

同様に、Javaアプリケーションを配信する場合も同様です。コードを実行可能JARにパッケージ化するだけで、都市公園での「草の立入禁止」の丁寧な力がすべて備わっていても、大部分の愚かさを止めることができます。

C ++コードを配信する場合でも、実行可能ファイルから不要なシンボルを取り除くだけで、マイナー難読化と見なすことができます。重要なのは、ユーザーとして結果を読み取るのは面倒ですが、コンピューターとして実行するのに問題はないということです。

主な難読化

主な難読化は、決定的知識豊富なユーザーを締め出すことです。また、完全に負けたゲームでもあります。コンピュータがそれを実行できるなら、人はそれをバラバラにして、それが何をするかを理解することができます。あなたが得ることができる最も近いのは、プログラムを継続的に復号化して、一度にそれが行うことを、別の時にそれを行う完全に異なるものに変換することです。そのようなものを作成することはかなり困難であり、それでも本当に優れたハッカーを締め出すことはできません(ただし、すべての自己変更コードを解読するのに必要な労力で、ハッカーの終わりまでに本当に完全にあなたと交差するでしょう)。

他のソリューションの観点から考える方がはるかに優れています。たとえば、制御するサーバーにコードの「宝石」を保持し、コードへのサービス呼び出しのみを許可することで、クライアントを本質的に無料のプレゼントとして、貴重なビットのフロントエンドにすることができます。または、より契約/法的手段を講じて、実行可能ファイルを正式にコード内をあちこちに持ち回らないことに同意する組織に引き渡すか、そうする場合は補償することもできます(そのため、ある種のNDAになります)。目的は、ハッカーがハッキングしないように強力なインセンティブを作成し、ユーザーが契約に拘束されないハッカーからコードを遠ざけることです。

ただし、コードがクラックされないことを想定してはなりません。仮想化を使用すると、実行のプログラム状態を検査および追跡できます。これを無効にしようとするもの(たとえば、外部のタイムソースへのクロック追跡)は、ハッカーよりも正当なユーザーに問題を引き起こす可能性が高くなります。(非常に断固とした情報の発行者でさえ、コードが相手の手に渡った後はシステムを安全に保つことができない方法については、DRMの歴史を参照してください。)実際に正当なユーザーを満足させることに集中する方がはるかに良いです。時折発生する亀裂による損失は、顧客を適切に満足させることによってもたらされる余分なお金に比べれば何もないでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.