summaryrefslogtreecommitdiff
path: root/src/format/dex/dex_def.h
blob: 3ae773d5d621d9a5c2b53bc65ccb727784475c3d (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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325

/* Chrysalide - Outil d'analyse de fichiers binaires
 * dex_def.h - liste des structures et constantes utilisées par le format DEX
 *
 * Copyright (C) 2010-2012 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide 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.
 *
 *  Chrysalide 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"



/* -------------------------- 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;



/* -------------------------- CONSTANTES POUR DEX DIVERSES -------------------------- */


/* Définition des drapeaux d'accès */

#define ACC_PUBLIC  	            0x00001 /* Elément publique            */
#define ACC_PRIVATE 	            0x00002 /* Elément privé               */
#define ACC_PROTECTED 	            0x00004 /* Elément protégé             */
#define ACC_STATIC 	                0x00008 /* Elément statique            */
#define ACC_FINAL 	                0x00010 /* Non dérivable / modifiable  */
#define ACC_SYNCHRONIZED 	        0x00020 /* Pose de verrou automatique  */
#define ACC_VOLATILE 	            0x00040 /* Accès spécial threads       */
#define ACC_BRIDGE 	                0x00040 /* Méthode pont                */
#define ACC_TRANSIENT 	            0x00080 /* Pas de sérialisation        */
#define ACC_VARARGS 	            0x00080 /* Arguments variables         */
#define ACC_NATIVE 	                0x00100 /* Implémentation en code natif*/
#define ACC_INTERFACE 	            0x00200 /* Interface                   */
#define ACC_ABSTRACT 	            0x00400 /* Non instanciable directement*/
#define ACC_STRICT 	                0x00800 /* Règle pour les flottants    */
#define ACC_SYNTHETIC 	            0x01000 /* Non défini dans le code     */
#define ACC_ANNOTATION 	            0x02000 /* Annotation                  */
#define ACC_ENUM 	                0x04000 /* Enumération                 */
#define ACC_CONSTRUCTOR 	        0x10000 /* Constructeur                */
#define ACC_DECLARED_SYNCHRONIZED   0x20000 /* Pose de verrou automatique  */



/* ------------------------ 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;

/* Type quelconque */
typedef struct _type_item
{
    uint16_t type_idx;                      /* Indice dans la table adaptée*/

} type_item;

/* Liste de types */
typedef struct _type_list
{
    uint32_t size;                          /* Nombre d'éléments présents  */
    type_item *list;                        /* Liste des éléments inscrits */

} type_list;

/* 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 --------------------------- */


/* Exception gérée */
typedef struct _encoded_type_addr_pair
{
    uleb128_t type_idx;                     /* Type d'exception couverte   */
    uleb128_t addr;                         /* Adresse du début du code    */

} encoded_type_addr_pair;

/* Ensemble d'exceptions prises en compte */
typedef struct _encoded_catch_handler
{
    leb128_t size;                          /* Quantité d'exceptions       */
    encoded_type_addr_pair *handlers;       /* Gestionnaires explicites    */
    uleb128_t catch_all_addr;               /* Adresse par défaut          */

    /**
     * Note : les spécifications indiquent que le champ handler_off de
     * try_item renvoie vers le gestionnaire à partir de la base de la structure
     * encoded_catch_handler_list. Comme la représentation interne de cette
     * structure efface la représentation physique, on conserve en mémoire
     * le décalage rencontré à la lecture dans un champ artificiel.
     */
    phys_t offset;                          /* Position dans le binaire    */

} encoded_catch_handler;

/* Liste des différents gestionnaires d'exceptions */
typedef struct _encoded_catch_handler_list
{
    uleb128_t size;                         /* Taille de la liste          */
    encoded_catch_handler *list;            /* Gestionnaires en place      */

} encoded_catch_handler_list;

/* Zone couverte en cas de pépin */
typedef struct _try_item
{
    uint32_t start_addr;                    /* Adresse du début couvert    */
    uint16_t insn_count;                    /* Nbre de doubles-octets gérés*/
    uint16_t handler_off;                   /* Indice du gestionnaire      */

} try_item;

/* 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             */
    try_item *tries;                        /* Zone d'exceptions           */
    encoded_catch_handler_list *handlers;   /* Gestionnaires associés      */

} code_item;



/* ------------------------------- AIGUILLAGES DIVERS ------------------------------- */


/* Aiguillage compressé */
typedef struct _packed_switch
{
    uint16_t ident;                         /* Pseudo-code d'identification*/
    uint16_t size;                          /* Nombre d'entrées            */
    uint32_t first_key;                     /* Première et plus petite clef*/
    uint32_t *targets;                      /* Cibles relatives            */

} packed_switch;

/* Aiguillage dispersé */
typedef struct _sparse_switch
{
    uint16_t ident;                         /* Pseudo-code d'identification*/
    uint16_t size;                          /* Nombre d'entrées            */
    uint32_t *keys;                         /* Clefs valeureuses           */
    uint32_t *targets;                      /* Cibles relatives            */

} sparse_switch;

/* Manipulation interne */
typedef union _dex_switch
{
    packed_switch packed;                   /* Modèle compact              */
    sparse_switch sparse;                   /* Modèle dispersé             */

} dex_switch;



#endif  /* _FORMAT_DEX_DEX_DEF_H */