Your SlideShare is downloading. ×
0
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

詳解Dexファイルフォーマット

3,904

Published on

0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,904
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
28
Comments
0
Likes
12
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 発表者 : 僻地のプログラマ kmt-t
  • 2.  ハンドルネーム ◦ 正式にはkmt-t ◦ はてなID : kmt-t2 ◦ Twitter ID : kmt_t 僻地(鳥取県)出身です ◦ 大阪まで出稼ぎに出ています 得意分野など ◦ プログラミング言語はC++/C#など ◦ 組み込みではミドルウェア開発を得意にしています  2D/3Dグラフィックスおよび画像処理  ファイルシステム
  • 3.  今回の発表はDalvik仮想マシン3部作の最後です 1. Dalvik仮想マシンのアーキテクチャ 2. Dalvikバイトコードのリファレンスの読み方 3. 詳解DEXフォーマット ← 今回はこれ! 発表の目的 1. Dalvik仮想マシンのソースコードを誰でも読めるように! 2. Dalvik仮想マシンに関するみんなのリテラシを上げる! 3. より深い部分の発表をするための下地をつくる!
  • 4.  Dalvik仮想マシンの実行ファイル ◦ Windowsで言えばPEファイルに相当します ◦ Javaで言えばクラスファイルに相当します ◦ Javaのクラスファイルとは形式が違います ◦ 配布する場合は生のDEXファイルではなくパッケージされた apkファイルにすることが殆どです Dalvik仮想マシン同様シンプルで結構簡単です ◦ 理解するとバイトコードの動的生成、バイトコードエンジニアリ ングなどができるようになります リファレンス ◦ $ANDROID_SOURCE/dalvik/docs/dex-format.html
  • 5.  Linuxにおけるobjdump相当 ◦ Android SDKに含まれています ◦ このツールでDEXファイルのいろいろな情報が抜き出せます ◦ 実用的にはこのツールが不自由なく使えるレベルのDEXファ イルフォーマットの知識があれば充分 代表的なオプション オプション 説明 -f ヘッダ(クラスやメソッドの定義など)のサマリーの表示 -h ヘッダ(クラスやメソッドの定義など)の詳細の表示 -d コードの逆アセンブルの表示
  • 6.  ファイルは以下の領域に分割 ヘッダ領域 string_ids領域 type_ids領域 proto_ids領域 field_ids領域 method_ids領域 class_defs領域 data領域 link_data領域 data領域、link_data領域に可変長データを格納 ◦ link_data領域はアンドキュメンテッド ◦ それ以外の領域には固定長のデータしか格納されない
  • 7. アイテム名 内容magic “dex¥n035¥0” (固定値)checksum alder32によるチェックサム。signatureでも同様 の検出ができるが、ファイルの破損チェック用計算 コストの問題から通常はこちらを使った方が良いsignature SHA-1によるハッシュ値。ファイルを一意に識別す るために使用できる。配布元の正しいハッシュ値と 比較すれば改ざんされていることは簡単に検出で きる。計算コストが高いので毎起動時に検査する のは難しいfile_size ファイルサイズheader_size ヘッダサイズ。固定長endian_tag 固定データ(0x12345678)。ファイルのエンディア ン識別用
  • 8. アイテム名 内容link_size link_data領域のバイト数link_off link_data領域へのオフセットmap_off data領域のレイアウトを示すmapへのオフセット。 基本的にmapの情報は他の情報の冗長データに なっている(ファイルかデータを読み出す際には必 須ではない)string_ids_size 文字列定数プールに格納されている文字列の数。string_ids_off string_ids領域へのオフセットtype_ids_size type_ids領域のデータの数type_ids_off type_ids領域へのオフセットproto_ids_size proto_ids領域のデータの数proto_ids_off proto_ids領域へのオフセット
  • 9. アイテム名 内容field_ids_size field_ids領域のデータ数field_ids_off field_ids領域へのオフセットmethod_ids_size method_ids領域のデータ数method_ids_off method_ids領域へのオフセットclass_defs_size class_defs領域のデータの数class_defs_off class_defs領域へのオフセットdata_size data領域のバイト数data_off data領域へのオフセット
  • 10.  定数文字列プールを格納する領域 以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容string_data_off uint data領域の定数文字列データへのオフセット オフセットが指すdata領域には以下のデータが格納データ名 型名 内容utf16_size uleb128 MUFT-8文字列をUTF-16にデコードしたとき の文字列長data MUTF-8 文字列データ
  • 11.  LEB128 ◦ DWORF3でも使われているデータ形式らしいです ◦ 可変長整数データ型です  Byteの最上位bitが立っている場合は次のByteはその上位7bit が格納されています。byteの最上位ビットが落ちている場合は データ終了 ◦ 値の小さな整数はデータ長が短くなります ◦ 可変長なのでdata領域のみに存在します 余談 ◦ 実際にはDEXはapk(ZIP)でパッケージされるのであんまり意 味が無い(圧縮したらサイズは同じぐらいになる)のでは
  • 12.  UTF-16の一文字を1~3byteにエンコードした形式 ◦ Javaバイトコードでも使われています ◦ Java、Dalvikともに内部の文字コードはUTF-16です ◦ MUTF-8の方がUTF-8より都合がいいです ◦ エンコード元がUTF-16なのでサロゲートペアは出現します ◦ Linuxでのワイド文字列はUTF-32なので取り扱いは注意 ◦ 可変長なのでdata領域のみに存在します 余談 ◦ あんまり意味が無いと思うんですが(UTF-16そのままでもあ まり差が出ないはず)、がんばりすぎですよね
  • 13.  DEXファイルで参照されている型のテーブル  以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容descriptor_idx uint 型名を表すTypeDiscriptor文字列のID (string_ids領域ののインデックス)  TypeDiscriptorは以下のフォーマットの文字列文字列 型名V, Z, B, S, C, I, J, F, D プリミティブ型Lfully/qualified/Name; クラス型 (この場合”fully.qualified.Name”)[TypeDescrioter 配列型 (“[I”ならintの配列)
  • 14.  DEXファイルで参照されているメソッド型のテーブル 以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容shorty_idx uint 型名を表すShortTypeDiscriptor文字列の ID(string_ids領域のインデックス)return_type_idx uint 戻り値型のID (type_ids領域のインデックス)parameters_off uint パラメータ型のIDのリストへのオフセット。オフ セットの指す先はdata領域
  • 15.  クラスのフィールド情報を格納する領域 以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容class_idx ushort フィールドを所有するクラス型のID (type_ids領域のインデックス)type_idx ushort フィールド型のID (type_ids領域のインデックス)name_idx uint フィールド名の文字列ID (string_ids領域のインデックス)
  • 16.  クラスのメソッド情報を格納する領域 以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容class_idx ushort メソッドを所有するクラス型のID (type_ids領域のインデックス)proto_idx ushort メソッド型のID (proto_ids領域のインデックス)name_idx uint メソッド名の文字列ID (string_ids領域のインデックス)
  • 17.  クラス情報を格納する領域 以下の情報の配列(データ数はヘッダに記述)データ名 型名 内容class_idx uint クラス型のID (type_ids領域のインデックス)access_flags uint アクセス属性フラグsuperclass_idx uint 親クラス型のID (type_ids領域のインデックス)interfaces_off uint 継承インターフェイス型のリストへのオフセットsource_file_idx uint ソースファイル名の文字列IDannotations_off uint アノテーション情報のオフセットclass_data_off uint class_dataへのオフセットstatic_values_off uint 静的フィールドの初期値.
  • 18.  data領域に含まれるデータ一覧 (1/2)データ名 内容MapList ファイルデータのレイアウト情報StringData 文字列データTypeList 型IDのリストAnnotationDirectory クラスとそのフィールド、メソッドのすべてのアノテーショ ン情報の集まりAnnotationSetRef アノテーションのリストのリストAnnotationSet アノテーションのリストAnnotation アノテーションEncodedArray クラスの初期値、アノテーションの設定値を圧縮した データ
  • 19.  data領域に含まれるデータ一覧 (2/2)データ名 内容ClassData クラス情報Code メソッドのバイトコードの情報DebugInfo デバッグ情報
  • 20. データ名 型名 内容static_fields_size uleb128 静的フィールドの数instance_fields_size uleb128 インスタンスフィールドの数direct_methods_size uleb128 コンストラクタ、静的メソッドの数virtual_methods_size uleb128 仮想メソッドの数static_fields encoded_field 静的フィールドの数 の配列instance_fields encoded_field インスタンスフィールドの情報 の配列direct_methods encoded_method コンストラクタ、静的メソッドの の配列 情報virtual_methods encoded_method 仮想メソッドの情報 の配列
  • 21.  encoded_field構造体データ名 型名 内容field_idx_diff Uleb128 フィールドID (field_ids領域のインデックス) 差分前のフィールドの値との差分access_flags Uleb128 アクセスフラグ encoded_method構造体データ名 型名 内容method_idx_diff uleb128 メソッドID (method_ids領域のインデックス) 差分前のメソッドの値との差分access_flags uleb128 アクセスフラグcode_off uleb128 コード構造体のオフセット
  • 22. データ名 型名 内容registers_size ushort メソッドで使用するレジスタ数ins_size ushort 引数の数outs_size ushort 出力引数の数tries_size ushort tryスコープの数debug_info_off uint デバッグ情報のオフセットinsns_size uint バイトコードの16bitユニット数insns ushortの配列 バイトコード命令列padding ushort(optional) アライメントのためのパディングtries tryスコープの配列 tryスコープの情報handlers ハンドラの配列 例外補足ハンドラのリスト

×