dexファイル形式------header_item解析
16364 ワード
人に魚を教えるより、人に魚を教えるほうがいい.初心者として、最も重要なのは公式文書を見て、自主的に勉強することだ.
まずGoogleの公式ドキュメントのdex解釈へのリンクを置いて、dexのフォーマットの構成をかなり詳しく紹介しました.
タイプガイド
LEB128
c言語対LEB 128復号
dexフルフォーマット:
header_item形式
headerができたitemフォーマットではheaderを定義できますitemの構造体は中の内容を解析します
Windowsヘッダファイルのタイプの定義
構造体の定義
構造体を定義したら、次は解析できます.
ファイルを開く
そんなに多く言って、実は総括して2つのステップについて、第1歩:構造体を定義して、第2歩:ファイルを読んで、構造体に値を割り当てます.
まずGoogleの公式ドキュメントのdex解釈へのリンクを置いて、dexのフォーマットの構成をかなり詳しく紹介しました.
https://source.android.google.cn/devices/tech/dalvik/dex-format#header-item
タイプガイド
byte 8
ubyte 8
short 16 ,
ushort 16 ,
int 32 ,
uint 32 ,
long 64 ,
ulong 64 ,
sleb128 LEB128, ( )
uleb128 LEB128, ( )
uleb128p1 LEB128 1, ( )
LEB128
LEB128(“**L**ittle-**E**ndian **B**ase **128**”) 。 [DWARF3](http://dwarfstd.org/Dwarf3Std.php) 。 `.dex` ,LEB128 32 。
LEB128 1-5 , 32 。 ( , )。 7 , 7 , 7 , 。 LEB128 (`sleb128`), , 。 (`uleb128`) , `0`。
c言語対LEB 128復号
void LEB128toInt(char* str)
{
DWORD value = 0;
if (*str)
{
do {
// 7
value = (*str & 0X7F) << (index * 7) + value;
++str;
// 1
} while (*str & 0x80);
return;
}
return ;
}
dexフルフォーマット:
header header_item
string_ids string_id_item[] // 。 , ( ) 。 UTF-16 ( ), 。
type_ids type_id_item[] // 。 ( 、 ) ( )。 string_id , 。
proto_ids proto_id_item[] // 。 。 ( type_id ) , ( type_id , ) 。 。
field_ids field_id_item[] // 。 ( )。 , ( type_id ) , ( string_id ) , ( type_id ) 。 。
method_ids method_id_item[] // 。 ( )。 , ( type_id ) , ( string_id ) , ( proto_id ) 。 。
class_defs class_def_item[] // 。 , 。 , , 。
call_site_ids call_site_id_item[] // 。 ( )。 call_site_off 。
method_handles method_handle_item[] // 。 ( )。 , 。
data ubyte[]// , 。 ; , , 。
link_data ubyte[] // 。 。 , 。
header_item形式
magic ubyte[8] = DEX_FILE_MAGIC // 。 , “DEX_FILE_MAGIC” 。
checksum uint // ( magic ) adler32 ;
signature ubyte[20] // ( magic、checksum ) SHA-1 ( );
file_size uint // ( ) ,
header_size uint = 0x70 // ( ) , 。 / , 。
endian_tag uint = ENDIAN_CONSTANT // 。 , “ENDIAN_CONSTANT REVERSE_ENDIAN_CONSTANT” 。
link_size uint // ; , 0
link_off uint // , link_size == 0, 0。 ( ) link_data 。 ; ( ) , 。
map_off uint // 。 ( ) data , “map_list” 。
string_ids_size uint //
string_ids_off uint // ; string_ids_size == 0( ), 0。 ( ) string_ids 。
type_ids_size uint // , 65535
type_ids_off uint // ; type_ids_size == 0( ), 0。 ( ) type_ids 。
proto_ids_size uint // , 65535
proto_ids_off uint // ; proto_ids_size == 0( ), 0。 ( ) proto_ids 。
field_ids_size uint //
field_ids_off uint // ; field_ids_size == 0, 0。 ( ) field_ids 。
method_ids_size uint //
method_ids_off uint // ; method_ids_size == 0, 0。 ( ) method_ids 。
class_defs_size uint //
class_defs_off uint // ; class_defs_size == 0( ), 0。 ( ) class_defs 。
data_size uint //data ( )。 sizeof(uint) 。
data_off uint // data 。
headerができたitemフォーマットではheaderを定義できますitemの構造体は中の内容を解析します
Windowsヘッダファイルのタイプの定義
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
構造体の定義
#define IMAGE_SIZEOF_DEX_FILE 8
#define IMAGE_SIZEOF_DEX_SIGNATURE 20
typedef struct _IMAGE_DEX_HEADER
{
BYTE magic[IMAGE_SIZEOF_DEX_FILE]; 。
DWORD checksum;
BYTE signature[IMAGE_SIZEOF_DEX_SIGNATURE];
DWORD file_size;
DWORD header_size;
DWORD endian_tag;
DWORD link_size;
DWORD link_off;
DWORD map_off;
DWORD string_ids_size;
DWORD string_ids_off;
DWORD type_ids_size;
DWORD type_ids_off;
DWORD proto_ids_size;
DWORD proto_ids_off;
DWORD field_ids_size;
DWORD field_ids_off;
DWORD method_ids_size;
DWORD method_ids_off;
DWORD class_defs_size;
DWORD class_defs_off;
DWORD data_size;
DWORD data_off;
}IMAGE_DEX_HEADER, * PIMAGE_DEX_HEADER;
構造体を定義したら、次は解析できます.
ファイルを開く
//IpzFile
FILE* pFile = fopen(IpzFile, "rb");
//
IMAGE_DEX_HEADER dex_header;
if (!pFile)
{
MessageBox(0, TEXT(" "), TEXT(" "), 0);
return fileSize;
}
// header_item
fread(&dex_header, sizeof(IMAGE_DEX_HEADER), 1, pFile);
//
fclose(pFile);
, , 。
そんなに多く言って、実は総括して2つのステップについて、第1歩:構造体を定義して、第2歩:ファイルを読んで、構造体に値を割り当てます.