summaryrefslogtreecommitdiff
path: root/src/format/dex/dex_def.h
blob: 9faf0502cba938e97ad4d671dc074ac6d77eb416 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207

/* OpenIDA - Outil d'analyse de fichiers binaires
 * dex_def.h - liste des structures et constantes utilisées par le format DEX
 *
 * Copyright (C) 2010 Cyrille Bagard
 *
 *  This file is part of OpenIDA.
 *
 *  OpenIDA is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  OpenIDA is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#ifndef _FORMAT_DEX_DEX_DEF_H
#define _FORMAT_DEX_DEX_DEF_H


#include "../../common/leb128.h"



/* ------------------------ ELEMENTS DE TABLE DES CONSTANTES ------------------------ */


/* Chaîne de caractères */

typedef struct _string_id_item
{
    uint32_t string_data_off;               /* Propriétés de la chaîne     */

} string_id_item;

typedef struct _string_data_item
{
    uleb128_t utf16_size;                   /* Taille du décodage          */
    const uint8_t *data;                    /* Caractères terminés par '\0'*/

} string_data_item;

/* Description d'un type */
typedef struct _type_id_item
{
    uint32_t descriptor_idx;                /* Description du type         */

} type_id_item;

/* Description d'un prototype */
typedef struct _proto_id_item
{
    uint32_t shorty_idx;                    /* Description version courte  */
    uint32_t return_type_idx;               /* Type de retour              */
    uint32_t parameters_off;                /* Position des arguments      */

} proto_id_item;

/* Description d'un champ */
typedef struct _field_id_item
{
    uint16_t class_idx;                     /* Classe d'appartenance       */
    uint16_t type_idx;                      /* Type du champ               */
    uint32_t name_idx;                      /* Nom du champ                */

} field_id_item;

/* Description d'une méthode */
typedef struct _method_id_item
{
    uint16_t class_idx;                     /* Classe d'appartenance       */
    uint16_t proto_idx;                     /* Prototype de la méthode     */
    uint32_t name_idx;                      /* Nom de la méthode           */

} method_id_item;

/* Description d'une classe */
typedef struct _class_def_item
{
    uint32_t class_idx;                     /* Type de la classe           */
    uint32_t access_flags;                  /* Drapeaux d'accès déclarés   */
    uint32_t superclass_idx;                /* Type de la classe parente   */
    uint32_t interfaces_off;                /* Liste des interfaces        */
    uint32_t source_file_idx;               /* Fichier source d'origine    */
    uint32_t annotations_off;               /* Eventuelles annotations     */
    uint32_t class_data_off;                /* Données de la classe        */
    uint32_t static_values_off;             /* Initialisations statiques   */

} class_def_item;



/* --------------------------- DESCRIPTION DE CLASSES DEX --------------------------- */


/* Propriétés d'une champ */
typedef struct _encoded_field
{
    uleb128_t field_idx_diff;               /* Description du champ        */
    uleb128_t access_flags;                 /* Conditions d'accès          */

} encoded_field;

/* Propriétés d'une méthode */
typedef struct _encoded_method
{
    uleb128_t method_idx_diff;              /* Description de la méthode   */
    uleb128_t access_flags;                 /* Conditions d'accès          */
    uleb128_t code_off;                     /* Position du code associé    */

} encoded_method;

/* Données de fonctionnement pour classe */
typedef struct _class_data_item
{
    uleb128_t static_fields_size;           /* Quantité de champs statiques*/
    uleb128_t instance_fields_size;         /* Qté de champs instanciables */
    uleb128_t direct_methods_size;          /* Qté de méthodes propres     */
    uleb128_t virtual_methods_size;         /* Qté de méthodes virtuelles  */

    encoded_field *static_fields;           /* Champs statiques            */
    encoded_field *instance_fields;         /* Champs instanciables        */
    encoded_method *direct_methods;         /* Méthodes propres            */
    encoded_method *virtual_methods;        /* Méthodes virtuelles         */

} class_data_item;



/* --------------------------- PORTION DE CODE EXECUTABLE --------------------------- */


/* Description de la zone */
typedef struct _code_item
{
    uint16_t registers_size;                /* Qté de registres utilisés   */
    uint16_t ins_size;                      /* Nbre d'arguments en entrée  */
    uint16_t outs_size;                     /* Nbre d'arguments en sortie  */
    uint16_t tries_size;                    /* Qté de try/catch            */
    uint32_t debug_info_off;                /* Information de débogage     */
    uint32_t insns_size;                    /* Nbre de blocs de 2 octets   */

    uint16_t *insns;                        /* Code exécutable             */


} code_item;




/* -------------------------- DESCRIPTION DU FORMAT DALVIK -------------------------- */


/* Identifiant magique "dex\n035\0" */
#define DEX_FILE_MAGIC          "\x64\x65\x78\x0a\x30\x33\x35\x00"
#define DEX_FILE_MAGIC_LEN      8

/* Types de boutisme */
#define ENDIAN_CONSTANT             0x12345678
#define REVERSE_ENDIAN_CONSTANT     0x78563412

/* Indice non valide */
#define NO_INDEX                0xffffffff


/* En-tête de tout programe Dex */
typedef struct _dex_header
{
    uint8_t magic[DEX_FILE_MAGIC_LEN];      /* Valeur magique du format    */

    uint32_t checksum;                      /* Somme de contrôle adler32   */
    uint8_t signature[20];                  /* Emprunte SHA-1 du reste     */
    uint32_t file_size;                     /* Taille du fichier           */
    uint32_t header_size;                   /* Taille de cette en-tête     */

    uint32_t endian_tag;                    /* Boutisme du fichier         */

    uint32_t link_size;                     /* Taille de section 'liaisons'*/
    uint32_t link_off;                      /* Position de ladite section  */
    uint32_t map_off;                       /* Position de la cartographie */
    uint32_t string_ids_size;               /* Nombre de chaînes de carac. */
    uint32_t string_ids_off;                /* Position de cette liste     */
    uint32_t type_ids_size;                 /* Nom d'identifiant de type   */
    uint32_t type_ids_off;                  /* Position de la liste        */
    uint32_t proto_ids_size;                /* Nombre de prototypes        */
    uint32_t proto_ids_off;                 /* Position de la liste        */
    uint32_t field_ids_size;                /* Nombre de champs            */
    uint32_t field_ids_off;                 /* Position de la liste        */
    uint32_t method_ids_size;               /* Nombre de méthodes          */
    uint32_t method_ids_off;                /* Position de la liste        */
    uint32_t class_defs_size;               /* Nombre de classes déclarées */
    uint32_t class_defs_off;                /* Position de la liste        */
    uint32_t data_size;                     /* Taille des données          */
    uint32_t data_off;                      /* Début des données           */

} dex_header;



#endif  /* _FORMAT_DEX_DEX_DEF_H */