diff options
| -rw-r--r-- | ChangeLog | 6 | ||||
| -rwxr-xr-x | src/format/dex/dex_def.h | 27 | ||||
| -rw-r--r-- | src/format/dex/method.c | 9 | 
3 files changed, 40 insertions, 2 deletions
| @@ -1,3 +1,9 @@ +10-06-16  Cyrille Bagard <nocbos@gmail.com> + +	* src/format/dex/dex_def.h: +	* src/format/dex/method.c: +	Look at access flags for computing native methods size. +  10-06-15  Cyrille Bagard <nocbos@gmail.com>  	* src/analysis/binary.c: diff --git a/src/format/dex/dex_def.h b/src/format/dex/dex_def.h index 3f6950d..ba88d69 100755 --- a/src/format/dex/dex_def.h +++ b/src/format/dex/dex_def.h @@ -29,6 +29,33 @@ +/* -------------------------- 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 ------------------------ */ diff --git a/src/format/dex/method.c b/src/format/dex/method.c index ce4d8dd..9bac013 100644 --- a/src/format/dex/method.c +++ b/src/format/dex/method.c @@ -38,6 +38,7 @@ struct _GDexMethod      GBinRoutine *routine;                   /* Représentation interne      */ +    encoded_method info;                    /* Propriétés de la méthode    */      code_item body;                         /* Corps de la méthode         */      off_t offset;                           /* Position du code            */ @@ -143,6 +144,7 @@ GDexMethod *g_dex_method_new(const GDexFormat *format, const encoded_method *see      result = g_object_new(G_TYPE_DEX_METHOD, NULL); +    result->info = *seed;      result->body = item;      //printf(" method idx :: %d\n", seed->method_idx_diff); @@ -203,13 +205,16 @@ GBinRoutine *g_dex_method_get_routine(const GDexMethod *method)  GBinPart *g_dex_method_as_part(const GDexMethod *method)  {      GBinPart *result;                       /* Instance à retourner        */ +    off_t size;                             /* Taille du code associé      */      result = g_binary_part_new();      g_binary_part_set_name(result, "name"); -    g_binary_part_set_values(result, -                             method->offset, method->body.insns_size * sizeof(uint16_t), method->offset); +    if (method->info.access_flags & ACC_NATIVE) size = 0; +    else size = method->body.insns_size * sizeof(uint16_t); + +    g_binary_part_set_values(result, method->offset, size, method->offset);      return result; | 
