- 本文はフォーティネット セキュリティ ブログの抄訳です。
執筆者:Axelle Apvrille
2013年12月15日
先日、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