From 0d7908e0c8282050ebbcc8a7c18fafd13152a36e Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 15 Jun 2010 22:44:16 +0000 Subject: Looked at access flags for computing native methods size. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@168 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 6 ++++++ src/format/dex/dex_def.h | 27 +++++++++++++++++++++++++++ src/format/dex/method.c | 9 +++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3130bbe..f084993 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +10-06-16 Cyrille Bagard + + * 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 * 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; -- cgit v0.11.2-87-g4458