web-dev-qa-db-ja.com

Androidアプリをリバースエンジニアリングから保護する

アプリを100%保護し、ハッカーが内部に入らないようにします。

これらは、StackOverflowから見つけたソリューションです。

  1. アプリにProguardを統合します。

  2. コードの最も重要な部分をC/C++で保持します。

  3. NDKを使用してコードをネイティブに.Soファイルに書き込みます。

  4. MD5を使用してAPIキーを暗号化します。

それで、私のAndroidアプリをハッカーから完全に保護する他の方法、または上記の中で最良の解決策はありますか?.

これらは私が見つけた参考文献です

APKファイルのリバースエンジニアリングを回避する方法は?

コードを保護するためのAndroid APKファイルのリバースエンジニアリングを防ぐ方法は?

8
hasan_shaikh

アプリのリバースエンジニアリングを完全に防ぐ方法はありません。十分なリソースがあれば、プログラムは最終的にリバースエンジニアリングされます。それはすべてあなたの敵がどれだけやる気があるかに依存します。

アプリにProguardを統合する

リバースエンジニアリングに対する最も効率的な対策は、難読化です。それがProguardが行うことです(しかし、 あまり良くありません 私が集めたものから)。 ProguardのWebサイトには、オプティマイザーであり、REに対する最小限の保護しか提供されていないと記載されています。難読化は、リバースエンジニアリングのプロセスをより困難にするだけです。リバースエンジニアリングを妨げることはありません。

コードの最も重要な部分をC/C++で保持します。

これは、ネイティブコードでコードを書くとリバースエンジニアリングが妨げられるという一般的な誤解です。 C/C++で記述すると、コードがコンパイルされて機械語にビルドされます。機械語は、Javaバイトコードよりもリバースエンジニアリングが難しいです。しかし、それでも完全に防ぐことはできません。

また、C/C++でコードを書くと、筋金入りのシステムプログラマーでない限り、多くのバグが発生する可能性が高くなります。

これらすべてに加えて、情報の開示からバッファオーバーフローまで、アプリに多数の脆弱性が発生する可能性があります。

自分でメモリを管理できる言語(C/C++など)は非常に強力です。そのため、足を撃ちやすくなります。これが、Javaが一般的に安全であると見なされるもう1つの理由です(メモリはGCの助けを借りてJVMによって管理されるため)。

したがって、C/C++でコードを書く必要が絶対にない限り(たとえば、コーデックを書いている場合)、Cで書かないでください(リバースエンジニアリングを軽減するためだけです)。

MD5を使用したAPIキーの暗号化

MD5は、データを16バイトの文字列にハッシュするハッシュアルゴリズムです。そしてそれも壊れていると見なされます。 MD5でのみハッシュでき、暗号化はできません。

AESのようなアルゴリズムでキーを暗号化する場合でも、将来的に復号化するためにキーをどこかに保存する必要があります。攻撃者は、プログラムメモリ(実行中)または永続ストレージからキーを簡単に抽出し、それを使用してAPIキーを復号化できます。

提案

リバースエンジニアリングを防ぎたいコードの機密部分は、リモートサーバーに移動します。たとえば、リバースエンジニアリングを誰にも望まないクールなアルゴリズムを思いついたとします。

クライアントからのデータを受け入れ、アルゴリズムを実行して結果を返すサーバーでRESTAPIを構築することをお勧めします。このアルゴリズムを使用する必要があるときはいつでも、アプリからサーバーにREST呼び出しを行い、そこから得られた結果をアプリで利用できます。

APIキーなどの機密データはすべてサーバーに保存して、アプリに直接公開することはできません。

これにより、コードの機密部分が敵に開示されないようになります。

15
gtux

Mediumに関する私の記事を読むことができます プロテクトAndroidアプリをリバースエンジニアリングから保護します。

Androidアプリの盗難を防ぐ方法を紹介します。問題の全体像はアプリのデータであり、コードではないため、難読化された文字列で機能する組み込みのフレームワークがない理由は、開発者の指紋。

難読化された関数とクラス名で機能するフレームワークはProguardであることを私は知っています。アプリをハックするたびに、関数やクラス名を知る必要はありません:)

しかし、ベースデータのURLまたは画面にユーザーに表示されるすべての文字列を知る必要があります。

そのため、APKを保護する効果的な方法は、開発者のフィンガープリントを使用して文字列を難読化することです。そのため、アプリを逆コンパイルしようとすると、元のフィンガープリントがないと画面に表示されるサービスURLや重要な文字列を取得できません。

stringCare https://github.com/MostafaAnter/AndroidLibrary と呼ばれるそれを実行できるフレームワークがあります。

3
Mostafa Anter