ご存知のように、AndroidアプリはJavaで記述されています。Javaでは 何をするか に関係なく、コンパイルされたコードを逆コンパイルやリバースエンジニアリングから保護することは不可能です。 Stack Overflowの質問コンパイル済みのロック方法Java逆コンパイルを防ぐためのクラス?が示唆しています。
アルゴリズムの企業秘密を含むアプリをリバースエンジニアリングから保護するにはどうすればよいでしょうか?
「方法」とは、ソフトウェア技術だけでなく、他のcreativeアプローチも意味します。
私にとって最初の目的は、Androidをターゲットにしたバイトコードで動作することが知られている ProGuard でコードを最適化および難読化することです Dalvik VM =(Dex経由)。これは非常に優れたツールであり、コードのフットプリントを縮小しながらコードを「反転」する難易度を高めることができます(劇的に:最近の私のアプレットは約600 aKBから約50 KBになりました)。
他の人が言っているように、その実装がクライアントに配布されている間は、アルゴリズムの詳細の100%のセキュリティは決して得られません。そのためには、サーバー上にコードを保持する必要があります。クライアントコードのセキュリティを100%近くにしようとすると、実質的に [〜#〜] drm [〜#〜] になり、ネットワークの停止に直面してクライアントコードが脆弱になり、一般的にフラストレーションが発生します(正当なもの) )ユーザー。
Android開発者ブログには、いくつかの 有用な記事 「改ざん防止」の問題についてAndroidアプリ(また、全体的なアプローチの一部としてProGuardの使用を推奨しています)。
「創造的」アプローチに関して:一部の開発者は デバッガー検出技術 を使用してランタイム分析を防止し、これをバイナリコードの一部の暗号化と組み合わせて(静的分析を抑止します)、正直なところ、十分な攻撃者が 迂回 これらを決定できる一方で、Windows KB記事に示されているように正当なユーザーのフラストレーションを引き起こす可能性があります ゲーム:エラーメッセージ:デバッガーが実行されました検出:デバッガーをアンロードして再試行。私のガールフレンドの「運転を学ぶ」DVDソフトウェアは、この理由で VirtualBox では実行されませんが、もちろんLinuxを非難します!
OpenRCE および 難読化されたコードに関するウィキペディアの記事 は、これをさらに調べたい場合に適した出発点です。ただし、リバースエンジニアリングによる企業秘密の損失よりも、ユーザーを苛立たせるこれらの手法を熱心に使用することで、損失が増える可能性があることに注意してください。 Anton Sの言う のように、おそらく最も「創造的な」アプローチは、テクノロジーではなくビジネスモデルを微調整することにあります。
最新のAndroid SDK更新 2010年12月6日(Android 2.3 Gingerbreadリリースと一致):
統合されたProGuardサポート:ProGuardがSDKツールにパッケージ化されました。開発者は、リリースビルドの統合部分としてコードを難読化できるようになりました。
可能性がある場合:リモートプロシージャが適切に保護されたサーバーを呼び出します(サーバーには保護したいコードがあります)。
気にかけることをとても安くし、クライアント側で実行される秘密の上にビジネスモデルを構築しないでください。言い換えれば、あなたの秘密を共有しないでください。
クライアント側のコードをリバースエンジニアリングから保護することは不可能です。コードを難読化する方法は、多かれ少なかれ効率的です。また、最適化されたx86アセンブラーは、かなり良い難読化です。
したがって、アルゴリズムの秘密がある場合は、サーバー側に配置します。
コンパイル済みJavaクラスをロック解除して逆コンパイルを防ぐ方法
できません。どんなスキームも、十分なスキル、時間、およびモチベーションを持つ誰かに負ける可能性があります。
(ちなみに、これはバイナリにコンパイルされるソフトウェアにも当てはまります。唯一の違いは、逆コンパイルにかかる労力にあります。)
私の質問は、アルゴリズムの企業秘密を含むアプリをリバースエンジニアリングから保護する方法です。
ユーザーの電話にアプリをインストールしないでください。または(より便利なことに)、リモート(適切に保護された)サーバーで企業秘密を含むコードを実行します。
アプリケーションを完全に保護することはできません。常にそれをクラックする人がいるからです...
ただし、アプリケーションを無料にすることでこれを行うことを妨げる可能性があります。または、少なくとも汚れが少なくなるため、ユーザーが煩わされることはありません。
あるいは、バックエンドサーバー上のすべての秘密のビジネスロジックを保持するように、Androidアプリケーションを「ダム」のままにして、公開されたサービスの何らかの形式を使用してデータを表示するようにしてください。
あなたが何をしても、少なくともあなたは逆コンパイルを非常に難しくすることができますが、プログラムで何かが実行/計算された場合、アルゴリズムに関する情報がそこになければならず、常に発見する可能性がありますそれを得る方法(相手側の十分なスキルとモチベーションを想定)。常に。
リバースエンジニアリングからのコードを100%保護することはできません。Androidリバースエンジニアリングからのコード。キーを保護する場合は、Webサービスの呼び出し中に暗号化キーを提供する統合サーバーの助けを借りて使用できますコードにキー入力します。
創造的なアプローチが必要な場合は、次のとおりです。
今日、逆コンパイルされていない電話のメインプログラムは何ですか?無線ファームウェア。どうして?スマートフォンのARMチップセットでは実行されませんが、代わりに個別の Qualcomm Hexagon スマートフォンに存在します。x86ではなく、x86ではありませんARM、クアルコム独自のアーキテクチャと命令を使用します。
Javaの逆コンパイルは簡単です。
ARMの逆コンパイルはより難しくなります(Hex-Rays Decompilerライセンスは1129 USDから始まります...そして、サムコードと標準のARMバイナリコードの組み合わせは苦痛です)=>でコンパイルを試すことができますAndroid NDK
現在、Hexagonの逆コンパイラはありません!また、QDSP仕様は、海賊版であっても公開されていません。
質問は、独立系ソフトウェアベンダーは、大衆市場の電話に含まれるHexagonファームウェアを使用できますか?クアルコムの方向性のようです。彼らのウェブサイトとSnapDragon製品をご覧ください。
注意:私はプロクアルコムでもプロクローズドソースでもありません。しかし、このスレッドはこの種のソリューションに魅力を感じています。
サーバー上にアルゴリズムを持ち、スマートフォンアプリからそのサービスを呼び出します。加害者は、スマートフォンアプリをリバースエンジニアリングして、サーバーのプロトコルを確認できます。アルゴリズムは保護できますが、サービスの不正使用からは保護できません。私は解決策なしにこの現実を受け入れなければなりません。私は自分のサービスでお金を稼いでいる限り、他の人が私のサービスを吸い上げる可能性を持って生きなければならないことに満足しなければなりません。