diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-05-11 23:42:48 (GMT) |
commit | 96cb6971ee3ca529958b8cb1e8e55a6eb4e60eae (patch) | |
tree | 68e49f325de3e93ef186d3e078da8ddc473aedf7 /src/format/java | |
parent | 80dc0ac97987ad9246bee7c47458a015339453bf (diff) |
Reorganized the way the program is built again and added partial support for the JVM.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@63 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/format/java')
-rwxr-xr-x | src/format/java/Makefile.am | 2 | ||||
-rwxr-xr-x | src/format/java/e_java.c | 111 | ||||
-rw-r--r-- | src/format/java/method.c | 32 | ||||
-rw-r--r-- | src/format/java/method.h | 4 | ||||
-rwxr-xr-x | src/format/java/pool.c | 140 | ||||
-rwxr-xr-x | src/format/java/pool.h | 16 |
6 files changed, 291 insertions, 14 deletions
diff --git a/src/format/java/Makefile.am b/src/format/java/Makefile.am index 133eae0..46bee9e 100755 --- a/src/format/java/Makefile.am +++ b/src/format/java/Makefile.am @@ -1,5 +1,5 @@ -lib_LTLIBRARIES = libformatjava.la +noinst_LTLIBRARIES = libformatjava.la libformatjava_la_SOURCES = \ attribute.h attribute.c \ diff --git a/src/format/java/e_java.c b/src/format/java/e_java.c index e2f8fbf..18300e8 100755 --- a/src/format/java/e_java.c +++ b/src/format/java/e_java.c @@ -37,6 +37,23 @@ + +/* Indique le type d'architecture visée par le format. */ +FormatTargetMachine get_java_target_machine(const java_format *); + + + +/* Fournit les références aux zones de code à analyser. */ +bin_part **get_java_default_code_parts(const java_format *, size_t *); + + +/* Fournit le prototype de toutes les routines détectées. */ +bin_routine **get_all_java_routines(const java_format *, size_t *); + + + + + /****************************************************************************** * * * Paramètres : content = contenu binaire à parcourir. * @@ -89,6 +106,10 @@ exe_format *load_java(const uint8_t *content, off_t length) EXE_FORMAT(result)->content = content; EXE_FORMAT(result)->length = length; + EXE_FORMAT(result)->get_target_machine = (get_target_machine_fc)get_java_target_machine; + EXE_FORMAT(result)->get_def_parts = (get_def_parts_fc)get_java_default_code_parts; + EXE_FORMAT(result)->get_all_routines = (get_all_routines_fc)get_all_java_routines; + pos = 0; if (!read_u32(&magic, content, &pos, length, SRE_BIG)) @@ -171,3 +192,93 @@ void unload_java(java_format *format) free(format); } + + + + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* * +* Description : Indique le type d'architecture visée par le format. * +* * +* Retour : Identifiant de l'architecture ciblée par le format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +FormatTargetMachine get_java_target_machine(const java_format *format) +{ + return FTM_JVM; + +} + + + + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* count = quantité de zones listées. [OUT] * +* * +* Description : Fournit les références aux zones de code à analyser. * +* * +* Retour : Zones de code à analyser. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bin_part **get_java_default_code_parts(const java_format *format, size_t *count) +{ + bin_part **result; /* Tableau à retourner */ + uint16_t i; /* Boucle de parcours */ + off_t offset; /* Position physique */ + off_t size; /* Taille de la partie */ + bin_part *part; /* Partie à intégrer à la liste*/ + + result = NULL; + *count = 0; + + for (i = 0; i < format->methods_count; i++) + if (find_java_method_code_part(&format->methods[i], &offset, &size)) + { + part = create_bin_part(); + + set_bin_part_values(part, offset, size, offset); + + result = (bin_part **)realloc(result, ++(*count) * sizeof(bin_part *)); + result[*count - 1] = part; + + } + + return result; + +} + + + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* count = taille du tableau créé. [OUT] * +* * +* Description : Fournit le prototype de toutes les routines détectées. * +* * +* Retour : Tableau créé ou NULL si aucun symbole de routine trouvé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bin_routine **get_all_java_routines(const java_format *format, size_t *count) +{ + *count = 0; + + return NULL; + +} diff --git a/src/format/java/method.c b/src/format/java/method.c index bf927a1..ec4aa85 100644 --- a/src/format/java/method.c +++ b/src/format/java/method.c @@ -28,7 +28,6 @@ #include "attribute.h" -#include "java-int.h" #include "../../common/endianness.h" @@ -155,3 +154,34 @@ void unload_java_method(java_format *format, java_method *method) unload_java_attributes(format, method->attributes, method->attributes_count); } + + +/****************************************************************************** +* * +* Paramètres : method = élément à traiter. * +* offset = position physique du code de la méthode. [OUT] * +* size = taille du code de la méthode. [OUT] * +* * +* Description : Retrouve le code binaire correspondant à une méthode. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool find_java_method_code_part(const java_method *method, off_t *offset, off_t *size) +{ + uint16_t i; /* Boucle de parcours */ + + for (i = 0; i < method->attributes_count; i++) + if (method->attributes[i].type == JAT_CODE) + { + *offset = method->attributes[i].info.code.content; + *size = method->attributes[i].info.code.code_length; + break; + } + + return (i < method->attributes_count); + +} diff --git a/src/format/java/method.h b/src/format/java/method.h index 01cef95..96ed8de 100644 --- a/src/format/java/method.h +++ b/src/format/java/method.h @@ -26,6 +26,7 @@ #include "e_java.h" +#include "java-int.h" @@ -35,6 +36,9 @@ bool load_java_methods(java_format *, off_t *); /* Décharge les méthodes d'un binaire Java. */ void unload_java_methods(java_format *); +/* Retrouve le code binaire correspondant à une méthode. */ +bool find_java_method_code_part(const java_method *method, off_t *, off_t *); + #endif /* _FORMAT_JAVA_METHOD_H */ diff --git a/src/format/java/pool.c b/src/format/java/pool.c index f735819..eec2918 100755 --- a/src/format/java/pool.c +++ b/src/format/java/pool.c @@ -30,12 +30,16 @@ #include "java-int.h" #include "../../common/endianness.h" +#include "../../common/extstr.h" /* Charge les propriétés d'une constante du réservoir. */ bool load_java_pool_entry(java_format *, constant_pool_entry *, off_t *); +/* Fournit une entrée donnée du réservoir de constantes. */ +const constant_pool_entry *get_java_pool_entry(const java_format *, uint16_t, ConstantPoolTag); + /****************************************************************************** @@ -319,36 +323,150 @@ bool load_java_pool_entry(java_format *format, constant_pool_entry *entry, off_t /****************************************************************************** * * -* Paramètres : format = description de l'exécutable à compléter. * +* Paramètres : format = description de l'exécutable à consulter. * * index = indice de l'élément dont la valeur est à recupérer. * -* str = adresse où placer la chaîne de caractères trouvée. * +* expected = type de l'élément à trouver à l'indice donné. * * * -* Description : Recherche une chaîne de caractères dans le réservoir. * +* Description : Fournit une entrée donnée du réservoir de constantes. * * * -* Retour : true si l'opération s'est bien déroulée, false sinon. * +* Retour : Entrée du réservoir de constantes ou NULL en cas d'erreur. * * * * Remarques : - * * * ******************************************************************************/ -bool get_java_pool_ut8_string(java_format *format, uint16_t index, const char **str) +const constant_pool_entry *get_java_pool_entry(const java_format *format, uint16_t index, ConstantPoolTag expected) { - bool result; /* Bilan à renvoyer */ + const constant_pool_entry *result; /* Entrée à retourner */ constant_pool_entry *entry; /* Entrée du réservoir visée */ - result = (index <= format->pool_len); + result = NULL; - if (result) + if (/*index < 0 && FIXME */index <= format->pool_len); { entry = &format->pool[index - 1]; - result = (entry->tag == CONSTANT_UTF8); + if (entry->tag == expected) + result = entry; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* index = indice de l'élément de la table à recupérer. * +* expected = type de l'élément à trouver à l'indice donné. * +* * +* Description : Construit une version humaine de référence. * +* * +* Retour : Référence construite ou NULL en cas de problème. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *build_reference_from_java_pool(const java_format *format, uint16_t index, JavaRefType expected) +{ + char *result; /* Chaîne humaine à retourner */ + const constant_pool_entry *entry; /* Entrée du réservoir visée 1 */ + const constant_pool_entry *subentry; /* Entrée du réservoir visée 2 */ + const char *tmp; /* Copie de chaîne intouchable */ - if (result) - (*str) = entry->info.utf8.bytes; + result = NULL; + switch (expected) + { + case JRT_FIELD: + entry = get_java_pool_entry(format, index, CONSTANT_FIELD_REF); + break; + case JRT_METHOD: + entry = get_java_pool_entry(format, index, CONSTANT_METHOD_REF); + break; + case JRT_INTERFACE_METHOD: + entry = get_java_pool_entry(format, index, CONSTANT_INTERFACE_METHOD_REF); + break; + default: + entry = NULL; + break; } + if (entry == NULL) + goto brfjp_error; + + /* Lieu parent où trouver la référence */ + + subentry = get_java_pool_entry(format, entry->info.ref.class_index, CONSTANT_CLASS); + + if (subentry == NULL) + goto brfjp_error; + + if (!get_java_pool_ut8_string(format, subentry->info.class.name_index, &tmp)) + goto brfjp_error; + + result = strdup(tmp); + + /* Champ proprement dit */ + + subentry = get_java_pool_entry(format, entry->info.ref.name_and_type_index, CONSTANT_NAME_AND_TYPE); + + if (subentry == NULL) + goto brfjp_error; + + if (!get_java_pool_ut8_string(format, subentry->info.name_type.name_index, &tmp)) + goto brfjp_error; + + result = stradd(result, "."); + result = stradd(result, tmp); + + /* Petites retouches finales */ + + result = strrpl(result, "/", "."); + result = strrpl(result, "<", "<"); + result = strrpl(result, ">", ">"); + + return result; + + brfjp_error: + + if (result != NULL) + free(result); + + return NULL; + +} + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* index = indice de l'élément dont la valeur est à recupérer. * +* str = adresse où placer la chaîne de caractères trouvée. * +* * +* Description : Recherche une chaîne de caractères dans le réservoir. * +* * +* Retour : true si l'opération s'est bien déroulée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool get_java_pool_ut8_string(const java_format *format, uint16_t index, const char **str) +{ + bool result; /* Bilan à renvoyer */ + const constant_pool_entry *entry; /* Entrée du réservoir visée */ + + entry = get_java_pool_entry(format, index, CONSTANT_UTF8); + + result = (entry != NULL); + + if (result) + (*str) = entry->info.utf8.bytes; + return result; } diff --git a/src/format/java/pool.h b/src/format/java/pool.h index 49d66a7..62d8a84 100755 --- a/src/format/java/pool.h +++ b/src/format/java/pool.h @@ -29,14 +29,28 @@ +/* Types de référence Java */ +typedef enum _JavaRefType +{ + JRT_FIELD, /* Champ */ + JRT_METHOD, /* Méthode */ + JRT_INTERFACE_METHOD /* Méthode d'interface */ + +} JavaRefType; + + /* Charge le réservoir de constantes d'un binaire Java. xs*/ bool load_java_pool(java_format *, off_t *); /* Décharge le réservoir de constantes d'un binaire Java. */ void unload_java_pool(java_format *); +/* Construit une version humaine de référence. */ +char *build_reference_from_java_pool(const java_format *, uint16_t, JavaRefType); + /* Recherche une chaîne de caractères dans le réservoir. */ -bool get_java_pool_ut8_string(java_format *, uint16_t, const char **); +bool get_java_pool_ut8_string(const java_format *, uint16_t, const char **); + #endif /* _FORMAT_JAVA_POOL_H */ |