Android DEX Format & DIFF (第4回マルウェア解析勉強会)
-
Upload
- -
Category
Technology
-
view
2.091 -
download
1
Transcript of Android DEX Format & DIFF (第4回マルウェア解析勉強会)
自己紹介
ニシダマサタ( @masata_masata )
• セキュアブレイン
• Developer (≠ Researcher, Analyst)
– 普段は解析・研究よりもコード書いてる
第4回マルウェア解析勉強会 2
今日のお話
1. Android実行コード(DEX)のフォーマット
2. 同じファミリーのマルウェアのDEX差分
第4回マルウェア解析勉強会 3
マルウェアの解析手法
多分、皆さんが興味があるであろう静的解析とかにはあまり関係のないお話です
ゴメンナサイm(_ _)m
DEX FORMAT第4回マルウェア解析勉強会 4
(Photo: Dalvik By floheinstein)
DEX Format Spec.
• DEXファイルフォーマット
– http://source.android.com/tech/dalvik/dex-format.html
• DEX 命令セット
– http://source.android.com/tech/dalvik/dalvik-bytecode.html
• DEXのInstructionフォーマット
– http://source.android.com/tech/dalvik/instruction-formats.html
第4回マルウェア解析勉強会 5
“dex file format” ってググれば、出てくるはず
DEX File Section
第4回マルウェア解析勉強会 6
header
string_ids
type_ids
proto_ids
field_ids
method_ids
class_defs
data
link_data
magic number, check sum…各セクションのオフセット
各種IDリスト
クラスの定義
データ領域 class data code item (instructions) string data debug info …
ad
dre
ss
DEX Header
• magic: “dex\a035\0”
• checksum: Adler-32形式
• signature: SHA-1ハッシュ
• filesize
• …
• Section Sizes and Offsets
– string_ids_size, string_ids_off …
第4回マルウェア解析勉強会 7
headerstring_idstype_ids
proto_idsfield_ids
method_idsclass_defs
data
link_data
DEX ID lists
• string_ids– 文字列データへのoffset (data section)
• type_ids– すべての型名の定義 (class, array, primitive)
– 型名→ string_ids
• proto_ids– method prototype identifiers list– return type index, parameters offset
• field_ids– class index, type index, name index
• method_ids– class index, proto index, name index
第4回マルウェア解析勉強会 8
headerstring_idstype_ids
proto_idsfield_ids
method_idsclass_defs
data
link_data
DEX Class Definitions
• class index– type_idsのindex
• access flags– private, public, static, final …
• superclass index– type_ids のindex
• interfaces offset
• class data offset– クラスの内部的な情報へのoffset– data sectionの中
第4回マルウェア解析勉強会 9
headerstring_idstype_ids
proto_idsfield_ids
method_idsclass_defs
data
link_data
DEX Data Section
• class data item– classのフィールド、メソッド情報
• code item– メソッドごとに定義される– instructions →命令列– try-catch handler →例外処理
• string data item– 文字列データ (MUTF-8)
• debug info itemなど
第4回マルウェア解析勉強会 10
headerstring_idstype_ids
proto_idsfield_ids
method_idsclass_defs
data
link_data
MUTF-8: Modified UTF-8ざっくり言うと3byteまでのUTF-8で、それ以上のCode Pointは3byteのサロゲートペアで表現するっぽい
Data Sectionには非固定長のものが置かれる
data section
data section
string_id_item
string_data_off (uint)
string_data_item
utf16_size (uleb128)
data (ubyte[])
type_id_item
descriptor_idx (uint)
proto_id_item
shorty_idx (uint)
parameters_off (uint)
return_type_idx (uint)
field_id_item
class_idx (ushort)
type_idx (ushort)
name_idx (uint)
method_id_item
class_idx (ushort)
proto_idx (ushort)
name_idx (uint)
header
type_list
size (uint)
list (type_item[size])
tpye_item
type_idx (ushort)
offset
entity
第4回マルウェア解析勉強会 11
data section
class_defs section
class_def_item
class_idx (uint)
access_flag (uint)
interfaces_off (uint)
source_file_idx (uint)
annotations_off (uint)
class_data_off (uint)
static_values_off (uint)
superclass_idx (uint)
class_data_item
static_fields_size (uleb128)
instance_fields_size (uleb128)
virtual_methods_size (uleb128)
static_fields (encoded_field[])
instance_fields(encoded_field[])direct_methods
(encoded_method[])virtual_methods
(encoded_method[])
direct_methods_size (uleb128)
encoded_field
field_idx_diff (uleb128)
access_flags (uleb128)
encoded_method
method_idx_diff (uleb128)
access_flags (uleb128)
code_off (uleb128)
code_item
type_list
size (uint)
list (type_item[size])
offset
entity
第4回マルウェア解析勉強会 12
data section
encoded_method
code_item
register_size (ushort)
ins_size (ushort)
tries_size (ushort)
debug_info_off (uint)
insns_size (uint)
insns (ushort[insns_size])
padding (ushort)
outs_size (ushort)
tries (try_item[tries_size])
handlers (encoded_catch_handler_list)
try_item
start_addr (uint)
insn_count (ushort)
handler_off (ushort)
encoded_catch_handler_list
size (uleb128)
list (encoded_catch_handler[handler_size])
encoded_catch_handler
size (sleb128)
handlers(encoded_type_addr_pair[])
catch_all_addr (uleb128)
encoded_type_addr_pair
type_idx (uleb128)
addr (uleb128)
debug_info_item
line_start (uleb128)
parameters_size (uleb128)
parameter_names(uleb128p1[parameters_size])
offset
entity
第4回マルウェア解析勉強会 13
Instructionsの触り• OpCode: 218個 (1byteで表現)
– move vA, vB
– const/4 vA, #+B
– if-eq vA, vB, +CCCC
– invoke-virtual {vC, vD, vE, vF, vG}, meth@BBBB
• Instruction Format: 30種– B|A|op
– AA|op
– AA|op BBBB
– AA|op CC|BB
– A|G|op BBBB F|E|D|C
第4回マルウェア解析勉強会 14
instructionはshort intの配列で格納されており、1個目のLow byteがOpCodeになる
OpCodeによって命令長やフォーマットが違ってくる
DEX Section Visualizationとあるマルウェアのセクションを色塗りしてみた
第4回マルウェア解析勉強会 15https://github.com/masatanish/dexdump/
header
data section
string_ids
class_defs
class_data_item
code_item
string_data_item
ID lists
ad
dre
ss
DEX Section Visualization
第4回マルウェア解析勉強会 17
class_def_itemクラス名スーパークラスインターフェース…
class_data_itemフィールド情報メソッド情報
code_item各メソッドの命令列
Class情報の場合
DEX DIFF
第4回マルウェア解析勉強会 18
(Photo: Android Mini Collectibles – Worker pose By Morten Rand-Hendriksen)
同じファミリーのAndroidマルウェアは同じようなDEX ファイルになるか?
第4回マルウェア解析勉強会 19
SAME PERSON??
(Photo: DSC_6565 By euthman)
(Photo:Android Robot By femaletrumpet02)
第4回マルウェア解析勉強会 20
ということで実験してみた
(Photo: animal diary science By UGA College of Ag)
類似性の尺度
• ssdeep( http://ssdeep.sourceforge.net/ )
– Fuzzy Hash
• データ列に対して、ハッシュ値を計算
• 似ているデータは似ているハッシュになる
– ハッシュ値同士の類似度を計算できる
• 0 〜 100 (100は一致)
– 内部的にはデータをブロックに分割して、ブロックごとに計算してるとかそんな感じだったと思う(うろ覚え)
第4回マルウェア解析勉強会 21
[#1] ほとんど同じマルウェア
• Enesoluty
–情報詐取系アプリ
–対象検体(2つ)• 9e5184…, 9ee5bd…
–特徴
• 同じパッケージ名
• マニフェストファイルは完全に一致
• メインのActivityは1つ
– Activity内のソースコードの差分はHTTPの接続先URLのみ第4回マルウェア解析勉強会 22
× 2
[#1] ssdeepの比較
第4回マルウェア解析勉強会 25
sha256 ssdeep
9e5184… 384:BhCKVQImSPhVX/npAT7nMC5oYEE57u5Qb2mWSZBaUgj1fhaSiIvMSN
9RyUFNyWyQ:hV2SJVX/iT7MC5iuuiWoaZ1fTiIpeWyQ
9ee5bd… 384:JULCKVQImSPhVX/npA62DZy4T/llSdolo5eRrZBaUgj1fhaSiIvySN9RyUF
NyWyo:CV2SJVX/i5DZy4xiGRjaZ1fTiILeWyo
類似度 68 →なんとなく微妙な値
[#2] ちょっと似てるマルウェア
• Enesoluty– 特徴
• アプリ名が違う
• パッケージ名は2つとも同じ
• メインのActivity名が違う
• メインのActivityのコードはProgressBarが1つあるか2つあるかの違いと、通信先URLが違う
• 検体(2つ)– 9e5184… →安心ウィルススキャン
– 68bf97… →電波改善
第4回マルウェア解析勉強会 26
[#2] ssdeepの比較
第4回マルウェア解析勉強会 29
sha256 ssdeep
9e5184… 384:BhCKVQImSPhVX/npAT7nMC5oYEE57u5Qb2mWSZBaUgj1fhaSiIvMSN
9RyUFNyWyQ:hV2SJVX/iT7MC5iuuiWoaZ1fTiIpeWyQ
68bf97… 384:WCern9AVEeq4G2kFzpA8+P4I/aUgj1fhv6iVvISzDanlfk+:ShACp4G26K4Y
aZ1fwiVxb+
類似度 29 →あんまり似てないとはいえ、DEXのバイナリ差分よりは似てるのかも
似てない理由(推測)
• ソースがほぼ一致していたとしても、少しのIDのズレなどが全体に影響
– DEX全体のバイナリの比較はあまり筋が良くなさそう
• そもそもssdeepってどうなのよ?的な話
– やりたいことにマッチしたアルゴリズムか?
第4回マルウェア解析勉強会 31
DEXの抽象化
• ソースが似ているという人間の感覚に近い値を導きたい
• ソースが似ている→ Instructionが似ている
• DEXからソースのエッセンスを抽出
– code_itemの実行命令列を足しあわせてハッシュ化
第4回マルウェア解析勉強会 32
Instruction Hash
第4回マルウェア解析勉強会 33
Class Data Item A
method instructions
in code_item
method instructions
method instructions
method instructions
method instructions
各classの各method の(code_item)instructionsを足しあわせてssdeepを算出する
Class Defs List
Class Data Item B Class Data Item C
A B C …
class_def_item
第4回マルウェア解析勉強会 34
ということで、もう一度計算
(Photo: 2013-02-06-DSCF4001 By kuujinbo01)
#1,#2の比較結果
第4回マルウェア解析勉強会 35
Targets DEXssdeep(before)
Instructionssdeep(after)
68 100
29 60
30 602
1 2
1
類似性は向上、しかし値としてはやっぱり微妙?
ついでにTheMovie
• 手元にあったTheMovieの検体17個でSSDEEPを算出
• 17C2=136通りの比較結果
第4回マルウェア解析勉強会 36
DEXssdeep
Instructionssdeep
Max 96 100
Min 55 100
Avg. 64.11 100.0
これはまさに…
まとめ
• DEX FORMATの話– 各Sectionの話とData Sectionの中身の話– Instructionは時間の都合で触れただけ
• 同じファミリーのマルウェアをssdeepで比較– DEXをそのまま比較してもあまり似てない– 命令列だけを取り出せば似てる類似度は上がる
• でもまだいまいち感覚に近くない
• 今後の話– 実は、もうちょっと先に進んでる部分も– ssdeepどうなのよという話はまだある
• NCD(Normalized Compression Distance)とか
– 全く違うアプリ間の比較をしてない• 似てないものは似てない値が出るか
第4回マルウェア解析勉強会 38