DEXファイルの高度な難読化? それともProguardの構成の問題?

先日、Baksmaliを停止させてしまう不正サンプル(Android/Mseg.A!tr.spy)に出くわしました。あまり頻繁に起こることではないので、smali/baksmaliの作成者であるJesus Frekeに連絡をすると、すぐにこの問題を解決してくれました。

このサンプルをよく見てみると、かなり興味深いものであることがわかりました。このサンプルは長く奇妙なクラス名やメソッド名を使い、高度に難読化されています(少しやり過ぎだと思いますが、その話は後ほど)。例えば、「AFHttpPacket;>」というクラス(「;」と「>」も名前の一部)が、同様に奇妙な名前空間にあるのです。

"java/util/concurrent/BlockingQueue<Lcom/adfresca/sdk/packet"

(パス内に「< Lcom」とある)。このクラス内では、「ERROR - call requestTapjoyConnect before any other Tapjoy methods」や「---------------------------」など、メソッドにも奇妙な名前がついています。

たいていのツールは、このような名前を好んで使うことはしません。

Dex2jarの場合、例外が出てクラッシュします。

~/softs/dex2jar-0.0.9.16-SNAPSHOT/d2j-dex2jar.sh ../../original/0C3AB5C5.vnd 
    dex2jar ../../original/0C3AB5C5.vnd -> 0C3AB5C5-dex2jar.jar
    java.lang.ArrayIndexOutOfBoundsException: 3
        at org.objectweb.asm.Type.a(Unknown Source)

IDA Pro(v6.3)もクラッシュします。

Androguardもどうしたら良いかわからないようですが、クラスは判別しています。

In [6]: d.get_classes_names()
    ...
   'Ljava/util/concurrent/BlockingQueue<Lcom/adfresca/sdk/packet/AFHttpPacket;>;',

奇妙なメソッド名も判別しています。

    In [12]: for current_method in methods:
            if current_method.name.startswith('ERROR'):
                print current_method.show_info()
                   ....:       
    ########## Method Information
 Ljava/util/concurrent/BlockingQueue<Lcom/adfresca/sdk/packet/AFHttpPacket;>;->ERROR -- 
call requestTapjoyConnect         before any other Tapjoy methods(deliverSelfNotifications
deliverSelfNotifications mCurItem)Lcom/flurry/android/e;     [access_flags=public]

しかし、pythonの名前空間を正しく拡張しませんので、対応するメソッドにアクセスし、調べることが困難になります。

In [18]: d.CLASS_ja
    <no completion>

この悪意のあるDEXファイルを正しく読み込めるツールはあるのでしょうか? あります。ですが、低級言語ツールを使う必要があります。

例えば、010 Editorはこれらの奇妙な名前を認識し、このDEXファイルを正しく解析します。

私のhidexスクリプトでも解析できていますね。

Class_def[1468]:
    class idx         = Ljava/util/concurrent/BlockingQueue<Lcom/adfresca/sdk/packet/AFHttpPacket;>; (0x3AB)
    ...
    virtual methods:
       name=---------------------------------------- (0x1173) (position=0x1899D8)
       access     = 0x1 (1)
       code_offset= 0x10B364 (1094500) [e4 e6 42 ]
       idx_diff   = 4467
       name=ERROR -- call requestTapjoyConnect before any other Tapjoy methods (0x1174) (position=0x1899DE)
    ...

多くの分析ツールをクラッシュさせ、リバースエンジニアリングを非常に困難にするサンプルというのは、アナリストにとっては悪夢のようなものです。新たな高度難読化技術を発見したということでしょうか? 幸い、そうではなさそうです。このマルウェアの作成者が少し難読化をやり過ぎただけでしょう。DEXのverifierもこれらのDEXファイルに対してエラーを出します。結局、このDEXファイルはロードできません。これでおわかりですね。

I/PackageManager(   79): Running dexopt on: com.smh.hxcr
    E/dalvikvm( 3973): Invalid type descriptor: '  Created new loader '
    E/dalvikvm( 3973): Trouble with item 0 @ offset 0x6628
    E/dalvikvm( 3973): Cross-item verify of section type 0002 failed
    E/dalvikvm( 3973): ERROR: Byte swap + verify failed

実際、どうしてこのようなことになったかはわかりません。DEXファイルの難読化を高度化する試みなのでしょうか。それともProguardの構成エラーにより、マルウェア作成者のDEXファイルが壊れてしまっただけなのでしょうか。

- the Crypto Girl.

sha256 of DEX: cc42f8a1fc6805a9deeaae198fb4580b304b51489dec4209929a09b9c3868aee - See more