Android アプリの一般的な保護方法と、それに対応する逆分析方法を知りたいですか?
この共有では、難読化されたコード、全体的な Dex 強化、分割 Dex 強化、仮想マシンの強化など、Android APP セキュリティの複数の側面について説明します。これらのコンテンツは、近年中国における Android アプリのセキュリティ保護の大きなトレンドとなっています。
Java コードは逆コンパイルが非常に簡単で、クロスプラットフォームのインタープリタ型言語として、Java ソース コードは中間の「バイトコード」にコンパイルされ、クラス ファイルに保存されます。クロスプラットフォームである必要があるため、これらのバイトコードには大量のセマンティック情報が含まれており、簡単に Java ソース コードに逆コンパイルできます。開発者は、Java ソース コードの保護を強化するために、コンパイルされたクラス ファイルを難読化することがよくあります。
難読化とは、公開されたプログラムを再編成して処理し、処理されたコードが前処理されたコードと同じ機能を完了するようにすることです。難読化されたコードは逆コンパイルが難しく、逆コンパイルが成功したとしても、非常に困難になります。プログラムの本当のセマンティクスを理解するのは困難です。 ProGuard は、バイトコードを難読化、削減、最適化できるオープンソース プロジェクトです。
Proguard の処理フローチャートを以下に示します。圧縮、最適化、難読化、事前チェックの 4 つの主要なリンクが含まれています。
圧縮 (縮小): コード内の不要なクラス、フィールド、メソッド、および属性 (属性) を検出して削除します;
最適化 (最適化): バイトコードを最適化し、不要な命令を削除します。コードを最適化します。非エントリ ノード クラスは private/static/final で追加され、未使用のパラメータは削除され、一部のメソッドはインライン コードになる可能性があります。
難読化: a、b、c、d などを使用します。短く無意味な名前、クラス、フィールド、メソッドの名前変更;
プリフライト (Preveirfy): Java プラットフォーム上で処理されたコードをプリフライトして、ロードされたクラス ファイルが実行可能であることを確認します。
共有の中で、Zhong Yaping は、Proguard を使用して Dex2jar を逆コンパイルした後の APK 効果の例を示しました。
Proguard 処理後
java.lang.String a(byte[]) -> encodeToStringjava.lang.String a(byte[],boolean,java.lang.String) -> a byte[] a(byte[],byte[]) -> encrypt byte[] b(byte[]) -> getKey byte[] b(byte[],byte[]) -> decrypt byte[] d(java.lang.String) -> getKey java.lang.String a(byte,char[]) -> a java.lang.String a(java.io.File) -> getHash java.lang.String a(java.lang.String) -> c java.lang.String b(java.lang.String) -> encode2. 全体的な Dex 強化セキュリティ技術の継続的な開発に伴い、新しい「強化技術」が登場しました。 Androidの保護強度を強化します。 DEX 強化とは、DEX ファイルが静的逆コンパイル ツールによってクラックされ、ソース コードが漏洩するのを防ぐために、DEX ファイルをパックして保護することです。最初に登場するのは、全体的な強化テクノロジ ソリューションです。
ビジネス規模がある程度大きくなると、新しい機能や新しいクラスライブラリがどんどん追加され、コードが急速に拡大する一方で、対応する apk パッケージのサイズも大きくなります。急速な増加に伴い、単純な全体補強ソリューションではセキュリティ要件を十分に満たすことができなくなり、全体補強ソリューションに加えて、分割補強技術ソリューションが登場しました。
ただし、上で示したように、dex ファイルが強化されると、欠落しているデータの一部が復号化されたデータに置き換えられます。不正確なデータにつながります。どのタイプのデータを分割するかを決定するには、dex ファイルのデータ構造を理解する必要があります。
Dex ファイルの構造は非常に複雑です。次の図は、より重要な内容を抜粋したものです。実際、dex ファイルはクラスを核として組み立てられたファイルです。最も重要な部分は、独自のインターフェイスと命令データを持つクラスデータとクラスコードです。この 2 つの部分を分割することを選択すると、たとえ分割したとしても、クラスデータやバイトコードデータが漏洩することはなく、逆コンパイルも完了しないため、セキュリティが高いです。
Dex分割強化の逆解析は、以下のようにclassdataに置き換えてアセンブルすることができます。新しい dex ファイルは元の dex ファイルと完全に一致するわけではありませんが、分割されたデータの外観もある程度復元されます。
仮想マシンの強化の硬化。以下は、仮想マシンによって強化された従来の Android システム コードです。
1 つは、クラス メンバー/静的変数の操作に関連するインターフェイスです。例:
GetStaticDoubleFieldSetStaticDoubleField GetDoubleField SetDoubleField …
(byte, object, int,long…) )
2 つ目は、次のような呼び出しクラス メソッドを反映することです。CallVoidMethodACallBooleanMethodA CallShortMethodA CallObjectMethodA…CallStaticVoidMethodACallStaticBooleanMethodA CallStaticShortMethodA CallStaticObjectMethodA…(byte, int, long, double …)
CallObjectMethodA(JNIEnv* env, jobject オブジェクト, jmethoID メソッド, …)
一方、命令オペコード マッピングを分析することによって逆分析を実行することもできます。同じ強化バージョンまたはマッピング関係を使用する場合は、次の方法を使用できます:仮想マシンの実現HOOKJNI インターフェイスによるリバース エンジニアリングの強化 分析
HOOK JNI インターフェイスを使用すると、基礎となるリバース エンジニアリングを必要とせずに、APP の一般的な呼び出しプロセスを理解できます。ただし、複雑な呼び出しプロセスの場合、または多数の仮想化メソッドがある場合、この逆分析方法はわかりにくいように見えます。算術演算や論理演算など、実行のために Java 層に反映する必要がない命令の場合、監視できません。
仮想マシンの強化逆分析 - 命令オペコード マッピングの分析
。
## オペレーティング コードに依存しないこのマッピング関係は、仮想マシンの構造にのみ関連するため、次のことを確立する必要があります。オフセット関係に基づいてマッピング関係を作成し、逆解析を実行します。
以上がAndroid APPの逆解析および保護メカニズムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。