
パターンベースのDalvik難読化解除ツール。限定的な実行を用いてセマンティック解析を向上させます。
パターンベースのDalvik難読化解除ツール。限定的な実行を使用してセマンティック解析を改善します。また、別のAndroid難読化解除ツールSimplifyのインスピレーションとなりました。
変換前

変換後

sha1: a68d5d2da7550d35f7dbefc21b7deebe3f4005f3
md5: 2dd2eeeda08ac8c15be8a9f2d01adbe8
あなたはエリートAndroidリバーサーなので、すでにSmaliとBaksmaliがパスに設定されていることでしょう。もし何らかの理由でインストールされていない場合は、以下の手順で始められますが、実行前に注意深く確認してください:
mkdir ~/bin || cd ~/bin
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.5.jar && mv smali-*.jar smali.jar
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.2.5.jar && mv baksmali-*.jar baksmali.jar
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/smali
curl --location -O https://bitbucket.org/JesusFreke/smali/downloads/baksmali
chmod +x ./smali ./baksmali
export PATH=$PATH:$PWD
adb がパスに設定されていることを確認してください。
gem install dex-oracle
または、ソースからビルドする場合:
git clone https://github.com/CalebFenton/dex-oracle.git
cd dex-oracle
gem install bundler
bundle install
Oracle を動作させるには、エミュレータが起動しているか、デバイスが接続されている必要があります。必要最低限のAndroidバージョンは5.0です!
Oracle は実際のAndroidシステム上でメソッドを実行する必要があります。これはデバイスまたはエミュレータ(推奨)のいずれかで行えます。デバイスの場合、潜在的に悪意のあるコードを実行しても構わないことを確認してください。
エミュレータを使用したい場合、Android SDKがすでにインストールされていれば、以下のコマンドでエミュレータイメージを作成および起動できます:
android avd
使用方法: dex-oracle [opts] <APK / DEX / Smali ディレクトリ>
-h, --help この画面を表示
-s ANDROID_SERIAL, ドライバ実行のためのデバイスID、デフォルト=""
--specific-device
-t, --timeout N ADB コマンド実行のタイムアウト(秒)、デフォルト="120"
-i, --include PATTERN パターンに一致するメソッドとクラスのみ最適化(例: Ldune;->melange\(\)V)
-e, --exclude PATTERN 最適化からこれらの種類を除外(オーバーライドを含む)
--disable-plugins STRING[,STRING]*
プラグインを無効にする(例: stringdecryptor,unreflector)
--list-plugins 利用可能なプラグインを表示
-v, --verbose 詳細モード
-V, --vverbose 非常に詳細モード
例えば、obad.apk というAPK内の Lcom/android/system/admin/CCOIoll; というクラスのメソッドのみを難読化解除するには:
dex-oracle -i com/android/system/admin/CCOIoll obad.apk
Oracle は Android アプリ(APK)、Dalvik 実行可能ファイル(DEX)、および Smali ファイルを入力として受け取ります。まず、入力が APK または DEX の場合、Smali ファイルに逆アセンブルされます。次に、Smali ファイルはさまざまなプラグインに渡され、解析と変更が行われます。プラグインは、より読みやすい形に変換できるパターンを検索します。コードの動作を理解するために、一部の Dalvik メソッドが実際に実行され、出力が収集されます。これにより、一部のメソッド呼び出しを定数に置き換えることができます。その後、すべての Smali ファイルが更新されます。最後に、入力が APK または DEX ファイルだった場合、変更された Smali ファイルが再コンパイルされ、更新された APK または DEX が作成されます。
メソッドの実行は Driver によって行われます。入力された APK、DEX、または Smali は、dexmerge を使用して Driver と結合され、単一の DEX としてデバイスまたはエミュレータにプッシュされます。プラグインは Driver を使用して、Java リフレクションを使って入力 DEX のメソッドを実行できます。戻り値は、単なるパターン認識を超えたセマンティック解析の向上に利用できます。これは、特に多くの文字列復号メソッド(通常、暗号化された文字列やバイト配列を受け取る)に有用です。制限の一つは、実行が静的メソッドに限定されることです。
Oracle には3つのプラグインが付属しています:
新しいタイプの難読化に遭遇した場合、Oracleで難読化解除できる可能性があります。Smaliを見て、コードが以下のいずれかに該当するか判断してください:
これらのいずれかに該当する場合、独自のプラグインを作成してみてください。プラグインを構築するには4つのステップがあります:
付属のプラグインはステップ#3と#4を理解するための良いガイドとなるでしょう。Driverはステップ#2を支援するように設計されています。
もちろん、遭遇した難読化を共有することはいつでも歓迎します。誰かが最終的に取り組むかもしれません。
まず、dx がパスに設定されていることを確認してください。これはAndroid SDKの一部ですが、よほどの上級者でなければパスに設定されていないでしょう。
driver フォルダはGradleで管理されているJavaプロジェクトです。EclipseやIntelliJなどにインポートして、好きなように変更を加えてください。ドライバの更新を完了するには、./update_driver を実行します。これによりドライバが再構築され、出力JARがDEXに変換されます。
エミュレータまたはデバイスでドライバコードの実行に問題がある場合、monitor(Android SDKの一部)を開いて手がかりを確認してください。エラーの意味がわからなくても、問題を作成する際に一緒に投稿すると役立ちます。
すべてのAndroidプラットフォームがdex-oracleと正常に動作するわけではありません。一部のプラットフォームでは、任意のDEXファイルを実行しようとするとクラッシュします。セグメンテーションフォールトやドライバクラッシュが発生する場合は、Android 4.4.2 APIレベル19(ARM)を使用してみてください。
プラグインが難読化と誤認したパターン(実際には実行すべきでないコード)を検出する可能性があります。難読化パターンは非常に特異なため、この可能性は低いですが、あり得ます。特定のプラグインが問題を引き起こしており、アプリがその特定の難読化ツールで保護されていないと確信できる場合、つまりアプリがDexGuardで保護されていないのにDexGuardプラグインが何かを実行しようとしている場合は、そのプラグインを無効にしてください。