summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-05-11 23:42:48 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-05-11 23:42:48 (GMT)
commit96cb6971ee3ca529958b8cb1e8e55a6eb4e60eae (patch)
tree68e49f325de3e93ef186d3e078da8ddc473aedf7 /src/format
parent80dc0ac97987ad9246bee7c47458a015339453bf (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')
-rw-r--r--src/format/Makefile.am9
-rw-r--r--src/format/dwarf/Makefile.am2
-rw-r--r--src/format/elf/Makefile.am2
-rw-r--r--src/format/elf/symbol.c6
-rw-r--r--src/format/exe_format-int.h4
-rw-r--r--src/format/exe_format.c19
-rw-r--r--src/format/exe_format.h16
-rwxr-xr-xsrc/format/java/Makefile.am2
-rwxr-xr-xsrc/format/java/e_java.c111
-rw-r--r--src/format/java/method.c32
-rw-r--r--src/format/java/method.h4
-rwxr-xr-xsrc/format/java/pool.c140
-rwxr-xr-xsrc/format/java/pool.h16
-rw-r--r--src/format/mangling/Makefile.am2
-rwxr-xr-xsrc/format/pe/Makefile.am2
15 files changed, 347 insertions, 20 deletions
diff --git a/src/format/Makefile.am b/src/format/Makefile.am
index cad15c5..92a774b 100644
--- a/src/format/Makefile.am
+++ b/src/format/Makefile.am
@@ -1,5 +1,5 @@
-lib_LTLIBRARIES = libformat.la
+noinst_LTLIBRARIES = libformat.la
libformat_la_SOURCES = \
exe_format.h exe_format.c \
@@ -7,6 +7,13 @@ libformat_la_SOURCES = \
dbg_format.h dbg_format.c \
dbg_format-int.h
+libformat_la_LIBADD = \
+ dwarf/libformatdwarf.la \
+ elf/libformatelf.la \
+ java/libformatjava.la \
+ mangling/libformatmangling.la \
+ pe/libformatpe.la
+
libformat_la_LDFLAGS =
diff --git a/src/format/dwarf/Makefile.am b/src/format/dwarf/Makefile.am
index d5853c3..6bfccf0 100644
--- a/src/format/dwarf/Makefile.am
+++ b/src/format/dwarf/Makefile.am
@@ -1,5 +1,5 @@
-lib_LTLIBRARIES = libformatdwarf.la
+noinst_LTLIBRARIES = libformatdwarf.la
libformatdwarf_la_SOURCES = \
abbrev.h abbrev.c \
diff --git a/src/format/elf/Makefile.am b/src/format/elf/Makefile.am
index 680afd7..ce23fb4 100644
--- a/src/format/elf/Makefile.am
+++ b/src/format/elf/Makefile.am
@@ -1,5 +1,5 @@
-lib_LTLIBRARIES = libformatelf.la
+noinst_LTLIBRARIES = libformatelf.la
libformatelf_la_SOURCES = \
e_elf.h e_elf.c \
diff --git a/src/format/elf/symbol.c b/src/format/elf/symbol.c
index c80ceb4..f1c320f 100644
--- a/src/format/elf/symbol.c
+++ b/src/format/elf/symbol.c
@@ -483,7 +483,7 @@ asm_instr **decode_elf_relocations(elf_format *format, size_t *count)
off_t pos; /* Tête de lecture */
uint64_t offset; /* Adresse virtuelle courante */
asm_instr *instr; /* Instruction décodée */
-
+#if 0
asm_processor *proc; /* TODO : remove me ! */
proc = create_x86_processor();
@@ -519,6 +519,10 @@ asm_instr **decode_elf_relocations(elf_format *format, size_t *count)
result[*count - 1] = instr;
}
+#endif
+
+ result = NULL;
+ *count = 0;
return result;
diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h
index 3bba821..bb96ea5 100644
--- a/src/format/exe_format-int.h
+++ b/src/format/exe_format-int.h
@@ -51,6 +51,9 @@ struct _bin_part
/* Fournit l'adresse mémoire du point d'entrée du programme. */
typedef uint64_t (* get_entry_point_fc) (const exe_format *);
+/* Indique le type d'architecture visée par le format. */
+typedef FormatTargetMachine (* get_target_machine_fc) (const exe_format *);
+
/* Fournit les références aux zones de code à analyser. */
typedef bin_part ** (* get_def_parts_fc) (const exe_format *, size_t *);
@@ -77,6 +80,7 @@ struct _exe_format
off_t length; /* Taille de ce contenu */
get_entry_point_fc get_entry_point; /* Obtention du point d'entrée */
+ get_target_machine_fc get_target_machine; /* Architecture ciblée */
get_def_parts_fc get_def_parts; /* Liste des parties de code */
find_section_fc find_section; /* Recherche d'une section */
get_symbols_fc get_symbols; /* Liste des symboles présents */
diff --git a/src/format/exe_format.c b/src/format/exe_format.c
index 2b8f893..aeeaea3 100644
--- a/src/format/exe_format.c
+++ b/src/format/exe_format.c
@@ -346,6 +346,25 @@ const uint8_t *get_exe_content(const exe_format *format, off_t *length)
+/******************************************************************************
+* *
+* 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_exe_target_machine(const exe_format *format)
+{
+ return format->get_target_machine(format);
+
+}
+
+
diff --git a/src/format/exe_format.h b/src/format/exe_format.h
index 13a37ee..1b359ff 100644
--- a/src/format/exe_format.h
+++ b/src/format/exe_format.h
@@ -89,6 +89,17 @@ exe_format *load_new_exe_format(const uint8_t *, off_t);
+/* Architectures de destination des formats */
+typedef enum _FormatTargetMachine
+{
+ FTM_JVM, /* Java Virtual Machine */
+
+ FTM_COUNT
+
+} FormatTargetMachine;
+
+
+
/* Types de symbole */
typedef enum _SymbolType
@@ -117,6 +128,11 @@ uint64_t get_exe_entry_point(const exe_format *);
+/* Indique le type d'architecture visée par le format. */
+FormatTargetMachine get_exe_target_machine(const exe_format *);
+
+
+
/* Recherche une section donnée au sein de binaire. */
bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64_t *);
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, "<", "&lt;");
+ result = strrpl(result, ">", "&gt;");
+
+ 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 */
diff --git a/src/format/mangling/Makefile.am b/src/format/mangling/Makefile.am
index a52a174..80c0757 100644
--- a/src/format/mangling/Makefile.am
+++ b/src/format/mangling/Makefile.am
@@ -3,7 +3,7 @@ BUILT_SOURCES = itanium_gram.h
AM_YFLAGS = -d
-lib_LTLIBRARIES = libformatmangling.la
+noinst_LTLIBRARIES = libformatmangling.la
libformatmangling_la_SOURCES = \
demangler.h demangler.c \
diff --git a/src/format/pe/Makefile.am b/src/format/pe/Makefile.am
index c70a80f..7fb0d91 100755
--- a/src/format/pe/Makefile.am
+++ b/src/format/pe/Makefile.am
@@ -1,5 +1,5 @@
-lib_LTLIBRARIES = libformatpe.la
+noinst_LTLIBRARIES = libformatpe.la
libformatpe_la_SOURCES = \
e_pe.h e_pe.c \