dexファイル形式------header_item解析

16364 ワード

人に魚を教えるより、人に魚を教えるほうがいい.初心者として、最も重要なのは公式文書を見て、自主的に勉強することだ.
まずGoogleの公式ドキュメントのdex解釈へのリンクを置いて、dexのフォーマットの構成をかなり詳しく紹介しました.
https://source.android.google.cn/devices/tech/dalvik/dex-format#header-item

タイプガイド
byte	8       
ubyte	8       
short	16       ,       
ushort	16int	32       ,       
uint	32long	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-532    。              (            ,         )。        777  ,    。      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歩:ファイルを読んで、構造体に値を割り当てます.