重要
このプロジェクトはアーカイブされ、維持されなくなりました。
最も一般的な質問のいくつかは、FAQ とトラブルシューティングで回答されています。
Android アプリ用のブラックボックス難読化ツール。
Obfuscapkは、ソース コードを必要とせずに Android アプリを難読化するためのモジュラー Python ツールです。apktool apktool
、逆コンパイルされたsmali
コード、リソース、マニフェストに難読化手法を適用した後、元の apk ファイルを逆コンパイルし、新しいアプリケーションを構築するために使用されます。難読化されたアプリは元のアプリと同じ機能を保持しますが、内部的な違いにより、新しいアプリケーションが元のアプリとは大きく異なる場合があります (たとえば、シグネチャベースのウイルス対策ソフトウェアなど)。
Obfuscapk は、BundleDecompiler を使用して Android アプリ バンドル (aab ファイル) のサポートを追加しています (#121 を参照)。この新しい機能を使用するには、ここから入手可能な BundleDecompiler の最新バージョンをダウンロードし、 PATH
に含まれるディレクトリ (例: Ubuntu、 /usr/local/bin
または/usr/bin
) にBundleDecompiler.jar
として保存し、実行可能フラグが設定されていることを確認してください。
重要
BundleDecompiler は Windows ではまだ機能しないため、Windows プラットフォーム上の Obfuscapk ではアプリ バンドルの難読化はサポートされていません。また、アプリ バンドルのサポートはまだ開発の初期段階にあるため、問題が発生した場合、または改善に協力したい場合は、貢献を参照してください。
Obfuscapkの詳細については、論文「Obfuscapk: Android アプリ用のオープンソースブラックボックス難読化ツール」を参照してください。この論文は次のように引用できます。
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfuscapk はモジュール式で拡張しやすいように設計されているため、プラグイン システムを使用して構築されています。したがって、すべての難読化ツールは抽象基本クラスから継承するプラグインであり、メソッドobfuscate
実装する必要があります。ツールが新しい Android アプリケーション ファイルの処理を開始すると、必要なすべての情報 (例: 逆コンパイルされたsmali
コードの場所) と操作の内部状態 (例: すでに使用されている難読化ツールのリスト) を保存する難読化オブジェクトが作成されます。 。次に、難読化オブジェクトは、 obfuscate
メソッドへのパラメーターとして、処理および変更されるすべてのアクティブなプラグイン/難読化ツールに (順番に) 渡されます。アクティブなプラグインのリストと順序は、コマンド ライン オプションで指定します。
このツールは、新しい難読化ツールを使用して簡単に拡張できます。難読化手法を実装するソース コードとプラグイン メタデータ ( <obfuscator-name>.obfuscator
ファイル) をsrc/obfuscapk/obfuscators
ディレクトリに追加するだけで十分です (次のような単純な既存の難読化ツールを使用します)。 Nop
最初の例として)。このツールは新しいプラグインを自動的に検出するため、それ以上の構成は必要ありません (新しいプラグインは、ツールにバンドルされている他のすべてのプラグインと同様に扱われます)。
自分のコンピューター上で Obfuscapk の作業コピーを取得するには、Docker を使用する方法と、 Python 3
環境でソース コードを直接使用する方法の 2 つの方法があります。どちらの場合も、最初に行うことはこのリポジトリのローカル コピーを取得することなので、プロジェクトを保存するディレクトリでターミナルを開き、リポジトリのクローンを作成します。
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
唯一の要件は、最新バージョンの Docker がインストールされていることなので、これは Obfuscapk をインストールする推奨方法です。
$ docker --version
Docker version 20.10.21, build baeda1f
公式の Obfuscapk Docker イメージは、Docker Hub で入手できます (このリポジトリから自動的に構築されます)。
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Docker Hub から公式イメージをダウンロードした場合は、ツールを使用する準備ができているので、使用手順を確認してください。それ以外の場合は、以前に作成したObfuscapk/src/
ディレクトリ ( Dockerfile
を含むフォルダー) で次のコマンドを実行して、 Docker イメージ:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Docker イメージの準備ができたら、簡単なテストを実行して、すべてが正しくインストールされたことを確認します。
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk を使用する準備ができました。詳細については、使用説明を参照してください。
apktool
、 apksigner
、 zipalign
の最新バージョンがインストールされていて、コマンド ラインから使用できることを確認してください。
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
アプリバンドルの難読化をサポートするには、BundleDecompiler も必要です。そのため、ここから利用可能な最新バージョンをダウンロードし、 PATH
に含まれるディレクトリ (例: Ubuntu、 /usr/local/bin
または/usr/bin
) にBundleDecompiler.jar
として保存します。実行可能フラグが設定されていることを確認してください。
BundleDecompiler とapktool
使用するには、最新バージョンの Java も必要です。 zipalign
とapksigner
Android SDK に含まれています。実行可能ファイルの場所は、環境変数APKTOOL_PATH
、 BUNDLE_DECOMPILER_PATH
、 APKSIGNER_PATH
およびZIPALIGN_PATH
を通じて指定することもできます (たとえば、Ubuntu では、同じ端末で Obfuscapk を実行する前に、 export APKTOOL_PATH=/custom/location/apktool
実行します)。
上記のツールとは別に、このプロジェクトの唯一の要件は、動作するPython 3
(少なくとも3.7
) のインストール (およびそのパッケージ マネージャーpip
) です。
プロジェクトのメイン ディレクトリ ( Obfuscapk/
) で次のコマンドを実行して、必要な依存関係をインストールします。
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
要件がインストールされたら、簡単なテストを実行して、すべてが正しく動作することを確認します。
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
Obfuscapk を使用する準備ができました。詳細については、使用説明を参照してください。
今後、 Obfuscapk はobfuscapk
として利用可能な実行可能ファイルとみなされます。そのため、ツールのインストール方法に応じてコマンドを調整する必要があります。
Docker イメージ: 難読化するアプリケーションを含むローカル ディレクトリは、コンテナ内の/workdir
(たとえば、現在のディレクトリ"${PWD}"
) にマウントする必要があるため、コマンドは次のようになります。
$ obfuscapk [params...]
は次のようになります:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
ソースから: すべての命令はObfuscapk/src/
ディレクトリから (またはObfuscapk/src/
ディレクトリをPYTHONPATH
環境変数に追加して) 実行する必要があり、次のコマンドを実行します。
$ obfuscapk [params...]
は次のようになります:
$ python3 -m obfuscapk.cli [params...]
まずはヘルプ メッセージを見てみましょう。
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
2 つの必須パラメータがあります: <APK_OR_BUNDLE_FILE>
、難読化する apk またはアプリ バンドル ファイルへのパス (相対または絶対)、および適用する難読化技術の名前のリスト (複数使用できる-o
オプションで指定)回、たとえば、 -o Rebuild -o NewAlignment -o NewSignature
)。他のオプションの引数は次のとおりです。
-w DIR
、中間ファイル ( apktool
によって生成される) を保存する作業ディレクトリを設定するために使用されます。指定しない場合、 obfuscation_working_dir
という名前のディレクトリが入力アプリケーションと同じディレクトリに作成されます。これはデバッグ目的に便利ですが、必要ない場合は一時ディレクトリ (例: -w /tmp/
) に設定できます。
-d OUT_APK_OR_AAB
は、宛先ファイルのパスを設定するために使用されます。難読化プロセスによって生成された apk ファイル (例: -d /home/user/Desktop/obfuscated.apk
または-d /home/user/Desktop/obfuscated.aab
) )。指定しない場合、最終的な難読化されたファイルは作業ディレクトリ内に保存されます。注: 既存のファイルは警告なしに上書きされます。
-i
難読化プロセス中に既知のサードパーティ ライブラリを無視して、使用するリソースを減らし、パフォーマンスを向上させ、エラーのリスクを軽減するためのフラグです。無視するライブラリのリストは LiteRadar プロジェクトから採用されています。
-p
難読化操作中に進行状況バーを表示するためのフラグです。バッチ操作/自動ビルドでツールを使用する場合は、進行状況バーを無効にすると便利です。それ以外の場合は、難読化の進行状況を確認するためにこのフラグを有効にする必要があります。
-k VT_API_KEY
、 VirusTotal
難読化ツールを使用する場合にのみ必要で、Virus Total と通信するときに使用する API キーを設定します。
--keystore-file KEYSTORE_FILE
、 --keystore-password KEYSTORE_PASSWORD
、 --key-alias KEY_ALIAS
および--key-password KEY_PASSWORD
を使用して、カスタム キーストア (APK 署名に必要) を指定できます。 --keystore-file
使用する場合は、 --keystore-password
と--key-alias
も指定する必要があります。一方、 --key-password
、選択したキーのパスワードがキーストアのパスワードと異なる場合にのみ必要です。デフォルト ( --keystore-file
が指定されていない場合) では、Obfuscapk にバンドルされているキーストアが署名操作に使用されます。
--ignore-packages-file IGNORE_PACKAGES_FILE
無視するパッケージ名を含むファイルへのパスです。このオプションを使用しても、これらのパッケージ内のすべてのクラスは難読化されません。以下の例に示すように、ファイルには 1 行に 1 つのパッケージ名が含まれている必要があります。
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
はapktool
でアプリを再構築するときに aapt2 オプションを使用するためのフラグです。
Obfuscapk がどのように機能するかを確認するための簡単な例を考えてみましょう。
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
上記のコマンドを実行すると、バックグラウンドで次のことが起こります。
作業ディレクトリが指定されていないため、新しい作業ディレクトリ ( obfuscation_working_dir
) がoriginal.apk
と同じ場所に作成されます (これは、エラーが発生した場合にsmali
files/manifest/resources を検査するのに役立ちます)
必要なファイル/実行可能ファイルがすべて利用可能であり、使用できる状態であることを確認するためにいくつかのチェックが実行されます。
実際の難読化プロセスが開始されます。難読化ツールがなくなるまで、またはエラーが発生するまで、指定された難読化ツールが (順番に) 1 つずつ実行されます。
最初の難読化ツールを実行すると、 original.apk
がapktool
で逆コンパイルされ、結果が作業ディレクトリに保存されます。
最初の難読化ツールはRandomManifest
であるため、逆コンパイルされた Android マニフェスト内のエントリは ( xml
構造を壊すことなく) ランダムに並べ替えられます。
Rebuild
obfuscator は、 apktool
を使用してアプリケーション (変更されたマニフェストを使用して) を単純に再構築します。出力ファイルが指定されていないため、結果の apk ファイルは前に作成した作業ディレクトリに保存されます。
NewAlignment
obfuscator はzipalign
ツールを使用して、結果として得られる apk ファイルを整列します
NewSignature
obfuscator は、Obfuscapk にバンドルされているキーストアに含まれるカスタム証明書を使用して、新しく作成された apk ファイルに署名します (ただし、 --keystore-file
パラメーターで別のキーストアを指定できます)。
すべての難読化ツールがエラーなしで実行されると、結果の難読化された apk ファイルがobfuscation_working_dir/original_obfuscated.apk
に見つかり、署名され、調整され、デバイス/エミュレーターにインストールできる状態になります。
前の例で示したように、難読化操作を完了して最終的な難読化された APK をビルドするには、 Rebuild
、 NewAlignment
、およびNewSignature
難読化ツールが常に必要です。これらは実際の難読化手法ではありませんが、ビルド プロセスで必要となるため、アーキテクチャ全体をモジュール化するために難読化ツールのリストに含まれています。
期待どおりに機能しませんか?よくある質問とトラブルシューティングをご覧ください。
Obfuscapk に含まれる難読化ツールは、実行する操作に応じてさまざまなカテゴリに分類できます。
Trivial : 名前が示すように、このカテゴリには、新しい署名で apk ファイルに署名するなど、単純な操作 (元のアプリケーションをあまり変更しない) が含まれます。
Rename : 使用される識別子 (クラス、フィールド、メソッド) の名前を変更する操作。
暗号化: 暗号化されたコード/リソースをパッケージ化し、アプリの実行中にそれらを復号化します。 Obfuscapk が起動すると、暗号化に使用されるランダムな秘密キー (ASCII 文字と数字を使用した 32 文字長) が自動的に生成されます。
コード: 逆コンパイルされたソース コードの変更を伴うすべての操作。
Resources : リソース ファイルに対する操作 (マニフェストの変更など)。
他の
現在 Obfuscapk にバンドルされている難読化ツールを以下に簡単に示します (アルファベット順)。詳細については、プロジェクトのソース コードを参照してください。
ヒント
以下の難読化ツールのすべてが実際の難読化手法 ( Rebuild
、 NewAlignment
、 NewSignature
、 VirusTotal
など) に対応しているわけではありませんが、アーキテクチャをモジュール化して新しい機能で簡単に拡張できるように、難読化ツールとして実装されています。
リフレクションを使用して Android フレームワークの危険な API を呼び出します。メソッドが Android フレームワークに属しているかどうかを確認するために、Obfuscapk は Backes らによって発見されたマッピングを参照します。
? AdvancedReflection のソース コード
ジャンクコードを挿入します。この場合、ジャンク コードは算術演算とその演算結果に応じた分岐命令で構成され、決して分岐しないように作られています。
? ArithmeticBranch ソース コード
アセットファイルを暗号化します。
? AssetEncryption ソースコード
この手法は、コードのセマンティクスに影響を与えることなく、制御フロー グラフを変更します。つまり、元のメソッドを呼び出す新しいメソッドが追加されます。たとえば、メソッドm1の呼び出しは、新しいラッパー メソッドm2によって置き換えられ、呼び出されると元のメソッドm1が呼び出されます。
? CallIndirection ソースコード
パッケージ名を変更し、クラスの名前を変更します (マニフェスト ファイル内でも)。
? ClassRename ソース コード
コード内の定数文字列を暗号化します。
? ConstStringEncryption ソース コード
デバッグ情報を削除します。
? DebugRemoval ソース コード
フィールドの名前を変更します。
? FieldRenameソースコード
メソッドを指定すると、メソッドの終わりを指す
goto
命令と、最初のgoto
の後にその命令を指す別のgoto
挿入されます。 2 つの新しいノードを追加することで、制御フロー グラフを変更します。
?ソースコードに移動
ネイティブ ライブラリを暗号化します。
? LibEncryption ソース コード
Java プログラミング言語のオーバーロード機能を利用して、異なる引数を使用して異なるメソッドに同じ名前を割り当てます。既存のメソッドを指定すると、この手法は同じ名前と引数を持つ新しい void メソッドを作成しますが、新しいランダムな引数も追加します。次に、新しいメソッドの本体がランダムな算術命令で埋められます。
? MethodOverload ソース コード
メソッドの名前を変更します。
? Methodソースコードの名前を変更
アプリケーションを再調整します。
? NewAlignmentのソースコード
新しいカスタム署名を使用してアプリケーションに再署名します。
? NewSignature ソース コード
ジャンクコードを挿入します。 Nop (no-operationの略) は、何も行わない専用の命令です。この手法では、すべてのメソッド実装内にランダムな
nop
命令を挿入するだけです。
?いやソースコード
マニフェスト ファイル内のエントリをランダムに並べ替えます。
? RandomManifest のソース コード
アプリケーションを再構築します。
?ソースコードをリビルドする
この手法は、Android フレームワークへの呼び出しを無視して、既存のコードを分析してアプリのメソッド呼び出しを探します (
AdvancedReflection
参照)。適切なメソッド呼び出しを持つ命令 (つまり、コンストラクター メソッドがない、公開可視性、十分な空きレジスターなど) が見つかった場合、その呼び出しは、Reflection API を使用して元のメソッドを呼び出すカスタム メソッドにリダイレクトされます。
?リフレクションのソースコード
この手法は、コード内の基本ブロックの順序を変更することで構成されます。分岐命令が見つかると、条件が反転され (たとえば、より小さい場合は分岐、より大きい場合は分岐になります)、ターゲットの基本ブロックはそれに応じて並べ替えられます。さらに、
goto
命令を悪用してコードをランダムに再配置します。
?ソースコードを並べ替える
リソース内の文字列を暗号化します (コード内で呼び出される文字列のみ)。
? ResStringEncryption ソース コード
オリジナルのアプリケーションと難読化されたアプリケーションを Virus Total に送信します。 VT API キーを指定する必要があります (
-k
オプションを参照)。
? VirusTotal ソース コード
このコードは MIT ライセンスに基づいて自由に使用できます。
このソフトウェアは、ジェノヴァ大学 DIBRIS でホストされているコンピューター セキュリティ ラボ (CSecLab) で研究目的で開発されました。