diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-05 21:58:46 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-05 21:59:01 (GMT) |
commit | a66f854ce4e19dc0f772fc55a3899643252afa3d (patch) | |
tree | 52e46f77acc199904a73e2260117a3a5198aeb86 /plugins | |
parent | 07768223823d8c2b0071be8d8e6dfc5ccb891b17 (diff) |
Inserted preloaded format information from instructions instead of symbols.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/fmtp/parser.c | 26 | ||||
-rw-r--r-- | plugins/fmtp/parser.h | 3 | ||||
-rw-r--r-- | plugins/readdex/class.c | 38 | ||||
-rw-r--r-- | plugins/readdex/class.h | 3 | ||||
-rw-r--r-- | plugins/readdex/code.c | 48 | ||||
-rw-r--r-- | plugins/readdex/code.h | 3 | ||||
-rw-r--r-- | plugins/readdex/header.c | 5 | ||||
-rw-r--r-- | plugins/readdex/header.h | 3 | ||||
-rw-r--r-- | plugins/readdex/ids.c | 32 | ||||
-rw-r--r-- | plugins/readdex/ids.h | 11 | ||||
-rw-r--r-- | plugins/readdex/reader.c | 21 | ||||
-rw-r--r-- | plugins/readdex/reader.h | 2 | ||||
-rw-r--r-- | plugins/readelf/header.c | 11 | ||||
-rw-r--r-- | plugins/readelf/header.h | 3 | ||||
-rw-r--r-- | plugins/readelf/program.c | 22 | ||||
-rw-r--r-- | plugins/readelf/program.h | 3 | ||||
-rw-r--r-- | plugins/readelf/reader.c | 15 | ||||
-rw-r--r-- | plugins/readelf/reader.h | 2 | ||||
-rw-r--r-- | plugins/readelf/section.c | 22 | ||||
-rw-r--r-- | plugins/readelf/section.h | 3 | ||||
-rw-r--r-- | plugins/readelf/strtab.c | 17 | ||||
-rw-r--r-- | plugins/readelf/strtab.h | 3 |
22 files changed, 165 insertions, 131 deletions
diff --git a/plugins/fmtp/parser.c b/plugins/fmtp/parser.c index 8fc693f..ea1e5d8 100644 --- a/plugins/fmtp/parser.c +++ b/plugins/fmtp/parser.c @@ -33,7 +33,7 @@ /* Effectue l'interprétation d'une définition de champ. */ -static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t *, void *); +static bool parse_field_definition(const fmt_field_def *, GBinFormat *, GPreloadInfo *, vmpa2t *, void *); @@ -41,6 +41,7 @@ static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t * * * * Paramètres : def = définition de champ à considérer. * * format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture pour les données. * * data = infos complémentaires éventuellement fournies. * * * @@ -52,7 +53,7 @@ static bool parse_field_definition(const fmt_field_def *, GBinFormat *, vmpa2t * * * ******************************************************************************/ -static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, vmpa2t *pos, void *data) +static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, GPreloadInfo *info, vmpa2t *pos, void *data) { GBinContent *content; /* Contenu binaire à lire */ SourceEndian endian; /* Boutisme utilisé */ @@ -66,10 +67,6 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, uint64_t raw; /* Valeur brute à étudier */ const comment_part *part; /* Accès plus direct */ - - GBinSymbol *symbol; /* Symbole à intégrer */ - - /* Lecture */ content = g_binary_format_get_content(format); @@ -193,17 +190,11 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, } - /* Insertion */ + /* Insertions */ - symbol = g_binary_symbol_new(STP_DATA); + g_preload_info_add_instruction(info, instr); - g_binary_symbol_attach_instruction(symbol, instr); - g_binary_symbol_set_comment(symbol, comment); - - result = g_binary_format_add_symbol(format, symbol); - - if (!result) - g_object_unref(G_OBJECT(instr)); + g_preload_info_add_comment(info, comment); pfd_exit: @@ -219,6 +210,7 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, * Paramètres : defs = liste de définitions à traiter. * * count = taille de cette liste. * * format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture pour les données. * * data = infos complémentaires éventuellement fournies. * * * @@ -230,7 +222,7 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, * * ******************************************************************************/ -bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat *format, vmpa2t *pos, void *data) +bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat *format, GPreloadInfo *info, vmpa2t *pos, void *data) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ @@ -238,7 +230,7 @@ bool parse_field_definitions(const fmt_field_def *defs, size_t count, GBinFormat result = true; for (i = 0; i < count && result; i++) - result = parse_field_definition(defs + i, format, pos, data); + result = parse_field_definition(defs + i, format, info, pos, data); return result; diff --git a/plugins/fmtp/parser.h b/plugins/fmtp/parser.h index 0d5dff3..310ff37 100644 --- a/plugins/fmtp/parser.h +++ b/plugins/fmtp/parser.h @@ -29,6 +29,7 @@ #include <format/format.h> +#include <format/preload.h> #include "def.h" @@ -36,7 +37,7 @@ /* Lance l'interprétation d'une série de définitions de champs. */ -bool parse_field_definitions(const fmt_field_def *, size_t, GBinFormat *, vmpa2t *, void *); +bool parse_field_definitions(const fmt_field_def *, size_t, GBinFormat *, GPreloadInfo *, vmpa2t *, void *); diff --git a/plugins/readdex/class.c b/plugins/readdex/class.c index 7b7b253..7911c6f 100644 --- a/plugins/readdex/class.c +++ b/plugins/readdex/class.c @@ -236,19 +236,20 @@ static fmt_field_def _dex_encoded_method[] = { /* Commente les définitions des classes pour la VM Dalvik. */ -static bool annotate_dex_class_data(const GDexFormat *, const GDexClass *, uint32_t ); +static bool annotate_dex_class_data(const GDexFormat *, GPreloadInfo *, const GDexClass *, uint32_t ); /* Commente les définitions des champs encodés. */ -static bool annotate_dex_encoded_field(const GDexFormat *, vmpa2t *); +static bool annotate_dex_encoded_field(const GDexFormat *, GPreloadInfo *, vmpa2t *); /* Commente les définitions des méthodes encodées. */ -static bool annotate_dex_encoded_method(const GDexFormat *, const encoded_method *, vmpa2t *); +static bool annotate_dex_encoded_method(const GDexFormat *, GPreloadInfo *, const encoded_method *, vmpa2t *); /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des classes pour la VM Dalvik. * @@ -259,7 +260,7 @@ static bool annotate_dex_encoded_method(const GDexFormat *, const encoded_method * * ******************************************************************************/ -bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_class_defs(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const dex_header *header; /* En-tête principale */ @@ -284,7 +285,7 @@ bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) for (i = 0; i < header->class_defs_size && result; i++) { - result = parse_field_definitions(PARSING_DEFS(_dex_class_defs), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_class_defs), bformat, info, &pos, NULL); if (!result) break; /* Annotations supplémentaires */ @@ -294,7 +295,7 @@ bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) def = g_dex_class_get_definition(class); if (def->class_data_off > 0) - result = annotate_dex_class_data(format, class, def->class_data_off); + result = annotate_dex_class_data(format, info, class, def->class_data_off); /* TODO : g_object_unref(G_OBJECT(class));*/ @@ -314,6 +315,7 @@ bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * class = classe Dex dont les données sont à commenter. * * offset = tête de lecture physique des symboles. * * * @@ -325,7 +327,7 @@ bool annotate_dex_class_defs(const GDexFormat *format, GtkStatusStack *status) * * ******************************************************************************/ -static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *class, uint32_t offset) +static bool annotate_dex_class_data(const GDexFormat *format, GPreloadInfo *info, const GDexClass *class, uint32_t offset) { bool result; /* Bilan à retourner */ vmpa2t pos; /* Tête de lecture des symboles*/ @@ -340,7 +342,7 @@ static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *c bformat = G_BIN_FORMAT(format); - result = parse_field_definitions(PARSING_DEFS(_dex_class_data), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_class_data), bformat, info, &pos, NULL); if (!result) goto adcd_exit; @@ -352,16 +354,16 @@ static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *c if (data != NULL) { for (i = 0; i < data->static_fields_size && result; i++) - result = annotate_dex_encoded_field(format, &pos); + result = annotate_dex_encoded_field(format, info, &pos); for (i = 0; i < data->instance_fields_size && result; i++) - result = annotate_dex_encoded_field(format, &pos); + result = annotate_dex_encoded_field(format, info, &pos); for (i = 0; i < data->direct_methods_size && result; i++) - result = annotate_dex_encoded_method(format, &data->direct_methods[i], &pos); + result = annotate_dex_encoded_method(format, info, &data->direct_methods[i], &pos); for (i = 0; i < data->virtual_methods_size && result; i++) - result = annotate_dex_encoded_method(format, &data->virtual_methods[i], &pos); + result = annotate_dex_encoded_method(format, info, &data->virtual_methods[i], &pos); } @@ -375,6 +377,7 @@ static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *c /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture à faire progresser. [OUT] * * * * Description : Commente les définitions des champs encodés. * @@ -385,14 +388,14 @@ static bool annotate_dex_class_data(const GDexFormat *format, const GDexClass *c * * ******************************************************************************/ -static bool annotate_dex_encoded_field(const GDexFormat *format, vmpa2t *pos) +static bool annotate_dex_encoded_field(const GDexFormat *format, GPreloadInfo *info, vmpa2t *pos) { bool result; /* Bilan à retourner */ GBinFormat *bformat; /* Autre version du format */ bformat = G_BIN_FORMAT(format); - result = parse_field_definitions(PARSING_DEFS(_dex_encoded_field), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_encoded_field), bformat, info, pos, NULL); return result; @@ -402,6 +405,7 @@ static bool annotate_dex_encoded_field(const GDexFormat *format, vmpa2t *pos) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * method = méthode à décrire. * * pos = tête de lecture à faire progresser. [OUT] * * * @@ -413,19 +417,19 @@ static bool annotate_dex_encoded_field(const GDexFormat *format, vmpa2t *pos) * * ******************************************************************************/ -static bool annotate_dex_encoded_method(const GDexFormat *format, const encoded_method *method, vmpa2t *pos) +static bool annotate_dex_encoded_method(const GDexFormat *format, GPreloadInfo *info, const encoded_method *method, vmpa2t *pos) { bool result; /* Bilan à retourner */ GBinFormat *bformat; /* Autre version du format */ bformat = G_BIN_FORMAT(format); - result = parse_field_definitions(PARSING_DEFS(_dex_encoded_method), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_encoded_method), bformat, info, pos, NULL); /* Chargements complémentaires, si non abstraite ni native */ if (result && method->code_off > 0) - result = annotate_dex_code_item(format, method->code_off); + result = annotate_dex_code_item(format, info, method->code_off); return result; diff --git a/plugins/readdex/class.h b/plugins/readdex/class.h index 2df7097..4e71fb2 100644 --- a/plugins/readdex/class.h +++ b/plugins/readdex/class.h @@ -25,12 +25,13 @@ #define _PLUGINS_READDEX_CLASS_H +#include <format/preload.h> #include <format/dex/dex.h> /* Commente les définitions des classes pour la VM Dalvik. */ -bool annotate_dex_class_defs(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_class_defs(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readdex/code.c b/plugins/readdex/code.c index 23e82ac..3a36c19 100644 --- a/plugins/readdex/code.c +++ b/plugins/readdex/code.c @@ -255,16 +255,16 @@ static fmt_field_def _dex_encoded_type_addr_pair[] = { /* Commente les définitions d'une protection contre exceptions. */ -static bool annotate_dex_try_item(const GDexFormat *, vmpa2t *); +static bool annotate_dex_try_item(const GDexFormat *, GPreloadInfo *, vmpa2t *); /*Commente les définitions des listes de gestion d'exceptions. */ -static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *, vmpa2t *); +static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *, GPreloadInfo *, vmpa2t *); /* Commente les définitions d'une prise en compte d'exceptions. */ -static bool annotate_dex_encoded_catch_handler(const GDexFormat *, vmpa2t *); +static bool annotate_dex_encoded_catch_handler(const GDexFormat *, GPreloadInfo *, vmpa2t *); /* Commente les définitions des gestions d'exceptions par type. */ -static bool annotate_dex_encoded_type_addr_pair(const GDexFormat *, vmpa2t *); +static bool annotate_dex_encoded_type_addr_pair(const GDexFormat *, GPreloadInfo *, vmpa2t *); @@ -379,6 +379,7 @@ static bool get_encoded_catch_handler_size_value(const fmt_field_def *def, GBinC /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * * * Description : Commente les définitions d'un corps de méthode. * * * @@ -388,7 +389,7 @@ static bool get_encoded_catch_handler_size_value(const fmt_field_def *def, GBinC * * ******************************************************************************/ -bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) +bool annotate_dex_code_item(const GDexFormat *format, GPreloadInfo *info, uleb128_t offset) { bool result; /* Bilan à retourner */ vmpa2t pos; /* Tête de lecture des symboles*/ @@ -400,7 +401,7 @@ bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) if (!result) goto adci_exit; - result = parse_field_definitions(PARSING_DEFS(_dex_code_item), G_BIN_FORMAT(format), &pos, &data); + result = parse_field_definitions(PARSING_DEFS(_dex_code_item), G_BIN_FORMAT(format), info, &pos, &data); if (!result) goto adci_exit; @@ -412,15 +413,16 @@ bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) /* padding */ if (data.insns_size % 2 != 0) - result = parse_field_definitions(PARSING_DEFS(_dex_code_item_padding), G_BIN_FORMAT(format), &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_code_item_padding), + G_BIN_FORMAT(format), info, &pos, NULL); /* tries */ for (i = 0; i < data.tries_size && result; i++) - result = annotate_dex_try_item(format, &pos); + result = annotate_dex_try_item(format, info, &pos); if (data.tries_size > 0 && result) - result = annotate_dex_encoded_catch_handler_list(format, &pos); + result = annotate_dex_encoded_catch_handler_list(format, info, &pos); adci_exit: @@ -432,6 +434,7 @@ bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture pour les symboles. * * * * Description : Commente les définitions d'une protection contre exceptions. * @@ -442,11 +445,11 @@ bool annotate_dex_code_item(const GDexFormat *format, uleb128_t offset) * * ******************************************************************************/ -static bool annotate_dex_try_item(const GDexFormat *format, vmpa2t *pos) +static bool annotate_dex_try_item(const GDexFormat *format, GPreloadInfo *info, vmpa2t *pos) { bool result; /* Bilan à retourner */ - result = parse_field_definitions(PARSING_DEFS(_dex_try_item), G_BIN_FORMAT(format), pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_try_item), G_BIN_FORMAT(format), info, pos, NULL); return result; @@ -456,6 +459,7 @@ static bool annotate_dex_try_item(const GDexFormat *format, vmpa2t *pos) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture physique des symboles. * * * * Description : Commente les définitions des listes de gestion d'exceptions. * @@ -466,17 +470,17 @@ static bool annotate_dex_try_item(const GDexFormat *format, vmpa2t *pos) * * ******************************************************************************/ -static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *format, vmpa2t *pos) +static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *format, GPreloadInfo *info, vmpa2t *pos) { bool result; /* Bilan à retourner */ uleb128_t size; /* Nombre d'entrées */ uleb128_t i; /* Boucle de parcours */ result = parse_field_definitions(PARSING_DEFS(_dex_encoded_catch_handler_list), - G_BIN_FORMAT(format), pos, &size); + G_BIN_FORMAT(format), info, pos, &size); for (i = 0; i < size && result; i++) - result = annotate_dex_encoded_catch_handler(format, pos); + result = annotate_dex_encoded_catch_handler(format, info, pos); return result; @@ -486,6 +490,7 @@ static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *format, vm /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture physique des symboles. * * * * Description : Commente les définitions d'une prise en compte d'exceptions. * @@ -496,14 +501,15 @@ static bool annotate_dex_encoded_catch_handler_list(const GDexFormat *format, vm * * ******************************************************************************/ -static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, vmpa2t *pos) +static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, GPreloadInfo *info, vmpa2t *pos) { bool result; /* Bilan à retourner */ leb128_t size; /* Nombre de gestionnaires */ bool has_catch_all; /* Gestion par défaut ? */ uleb128_t i; /* Boucle de parcours */ - result = parse_field_definitions(PARSING_DEFS(_dex_encoded_catch_handler), G_BIN_FORMAT(format), pos, &size); + result = parse_field_definitions(PARSING_DEFS(_dex_encoded_catch_handler), + G_BIN_FORMAT(format), info, pos, &size); if (!result) goto adech_exit; @@ -516,13 +522,13 @@ static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, vmpa2t /* handlers */ for (i = 0; i < size && result; i++) - result = annotate_dex_encoded_type_addr_pair(format, pos); + result = annotate_dex_encoded_type_addr_pair(format, info, pos); /* catch_all_addr */ if (result && has_catch_all) result = parse_field_definitions(PARSING_DEFS(_dex_encoded_catch_handler_all), - G_BIN_FORMAT(format), pos, &size); + G_BIN_FORMAT(format), info, pos, &size); adech_exit: @@ -534,6 +540,7 @@ static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, vmpa2t /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * pos = tête de lecture des symboles. * * * * Description : Commente les définitions des gestions d'exceptions par type. * @@ -544,11 +551,12 @@ static bool annotate_dex_encoded_catch_handler(const GDexFormat *format, vmpa2t * * ******************************************************************************/ -static bool annotate_dex_encoded_type_addr_pair(const GDexFormat *format, vmpa2t *pos) +static bool annotate_dex_encoded_type_addr_pair(const GDexFormat *format, GPreloadInfo *info, vmpa2t *pos) { bool result; /* Bilan à retourner */ - result = parse_field_definitions(PARSING_DEFS(_dex_encoded_type_addr_pair), G_BIN_FORMAT(format), pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_encoded_type_addr_pair), + G_BIN_FORMAT(format), info, pos, NULL); return result; diff --git a/plugins/readdex/code.h b/plugins/readdex/code.h index 7f23ee7..ea70df8 100644 --- a/plugins/readdex/code.h +++ b/plugins/readdex/code.h @@ -25,12 +25,13 @@ #define _PLUGINS_READDEX_CODE_H +#include <format/preload.h> #include <format/dex/dex.h> /* Commente les définitions d'un corps de méthode. */ -bool annotate_dex_code_item(const GDexFormat *, uleb128_t); +bool annotate_dex_code_item(const GDexFormat *, GPreloadInfo *, uleb128_t); diff --git a/plugins/readdex/header.c b/plugins/readdex/header.c index d0d0cd7..b5ea776 100644 --- a/plugins/readdex/header.c +++ b/plugins/readdex/header.c @@ -294,6 +294,7 @@ static fmt_field_def _dex_header[] = { /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * * * Description : Charge tous les symboles de l'en-tête DEX. * * * @@ -303,7 +304,7 @@ static fmt_field_def _dex_header[] = { * * ******************************************************************************/ -bool annotate_dex_header(GDexFormat *format) +bool annotate_dex_header(GDexFormat *format, GPreloadInfo *info) { bool result; /* Bilan à retourner */ vmpa2t pos; /* Tête de lecture des symboles*/ @@ -311,7 +312,7 @@ bool annotate_dex_header(GDexFormat *format) result = g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), 0, &pos); if (result) - result = parse_field_definitions(PARSING_DEFS(_dex_header), G_BIN_FORMAT(format), &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_header), G_BIN_FORMAT(format), info, &pos, NULL); return result; diff --git a/plugins/readdex/header.h b/plugins/readdex/header.h index 0d147f7..17c6ccd 100644 --- a/plugins/readdex/header.h +++ b/plugins/readdex/header.h @@ -25,12 +25,13 @@ #define _PLUGINS_READDEX_HEADER_H +#include <format/preload.h> #include <format/dex/dex.h> /* Charge tous les symboles de l'en-tête DEX. */ -bool annotate_dex_header(GDexFormat *); +bool annotate_dex_header(GDexFormat *, GPreloadInfo *); diff --git a/plugins/readdex/ids.c b/plugins/readdex/ids.c index 2586eaf..14ad6fb 100644 --- a/plugins/readdex/ids.c +++ b/plugins/readdex/ids.c @@ -227,6 +227,7 @@ static bool get_dex_string_length_value(const fmt_field_def *def, GBinContent *c /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des chaînes de caractères. * @@ -237,7 +238,7 @@ static bool get_dex_string_length_value(const fmt_field_def *def, GBinContent *c * * ******************************************************************************/ -bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_string_ids(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GBinContent *content; /* Contenu binaire à lire */ @@ -258,7 +259,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) content = g_binary_format_get_content(G_BIN_FORMAT(format)); header = g_dex_format_get_header(format); - endian = SRE_LITTLE;//g_dex_format_get_endianness(format); + endian = g_binary_format_get_endianness(G_BIN_FORMAT(format)); result = g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), header->string_ids_off, &pos); @@ -307,7 +308,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) field.comment.parts = parts; field.comment.pcount = ARRAY_SIZE(parts); - result = parse_field_definitions(&field, 1, bformat, &pos, &loc); + result = parse_field_definitions(&field, 1, bformat, info, &pos, &loc); if (!result) break; @@ -317,7 +318,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) if (!g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), loc, &item_pos)) continue; - result = parse_field_definitions(PARSING_DEFS(_dex_string_ids_length), bformat, &item_pos, &length); + result = parse_field_definitions(PARSING_DEFS(_dex_string_ids_length), bformat, info, &item_pos, &length); /* Description de la chaîne : contenu */ @@ -327,6 +328,9 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); + g_preload_info_add_instruction(info, instr); + + g_object_ref(G_OBJECT(instr)); ADD_STR_AS_SYM(format, symbol, instr); } @@ -349,6 +353,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de types. * @@ -359,7 +364,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GtkStatusStack *status) * * ******************************************************************************/ -bool annotate_dex_type_ids(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_type_ids(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const dex_header *header; /* En-tête principale */ @@ -382,7 +387,7 @@ bool annotate_dex_type_ids(const GDexFormat *format, GtkStatusStack *status) for (i = 0; i < header->type_ids_size && result; i++) { - result = parse_field_definitions(PARSING_DEFS(_dex_type_ids), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_type_ids), bformat, info, &pos, NULL); gtk_status_stack_update_activity_value(status, msg, 1); @@ -400,6 +405,7 @@ bool annotate_dex_type_ids(const GDexFormat *format, GtkStatusStack *status) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de prototypes. * @@ -410,7 +416,7 @@ bool annotate_dex_type_ids(const GDexFormat *format, GtkStatusStack *status) * * ******************************************************************************/ -bool annotate_dex_proto_ids(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_proto_ids(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const dex_header *header; /* En-tête principale */ @@ -433,7 +439,7 @@ bool annotate_dex_proto_ids(const GDexFormat *format, GtkStatusStack *status) for (i = 0; i < header->proto_ids_size && result; i++) { - result = parse_field_definitions(PARSING_DEFS(_dex_proto_ids), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_proto_ids), bformat, info, &pos, NULL); gtk_status_stack_update_activity_value(status, msg, 1); @@ -451,6 +457,7 @@ bool annotate_dex_proto_ids(const GDexFormat *format, GtkStatusStack *status) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de champs. * @@ -461,7 +468,7 @@ bool annotate_dex_proto_ids(const GDexFormat *format, GtkStatusStack *status) * * ******************************************************************************/ -bool annotate_dex_field_ids(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_field_ids(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const dex_header *header; /* En-tête principale */ @@ -484,7 +491,7 @@ bool annotate_dex_field_ids(const GDexFormat *format, GtkStatusStack *status) for (i = 0; i < header->field_ids_size && result; i++) { - result = parse_field_definitions(PARSING_DEFS(_dex_field_ids), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_field_ids), bformat, info, &pos, NULL); gtk_status_stack_update_activity_value(status, msg, 1); @@ -502,6 +509,7 @@ bool annotate_dex_field_ids(const GDexFormat *format, GtkStatusStack *status) /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Commente les définitions des identifiants de méthodes. * @@ -512,7 +520,7 @@ bool annotate_dex_field_ids(const GDexFormat *format, GtkStatusStack *status) * * ******************************************************************************/ -bool annotate_dex_method_ids(const GDexFormat *format, GtkStatusStack *status) +bool annotate_dex_method_ids(const GDexFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const dex_header *header; /* En-tête principale */ @@ -535,7 +543,7 @@ bool annotate_dex_method_ids(const GDexFormat *format, GtkStatusStack *status) for (i = 0; i < header->method_ids_size && result; i++) { - result = parse_field_definitions(PARSING_DEFS(_dex_method_ids), bformat, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_dex_method_ids), bformat, info, &pos, NULL); gtk_status_stack_update_activity_value(status, msg, 1); diff --git a/plugins/readdex/ids.h b/plugins/readdex/ids.h index 8fe9626..79618ce 100644 --- a/plugins/readdex/ids.h +++ b/plugins/readdex/ids.h @@ -25,24 +25,25 @@ #define _PLUGINS_READDEX_IDS_H +#include <format/preload.h> #include <format/dex/dex.h> /* Charge tous les symboles de l'en-tête DEX. */ -bool annotate_dex_string_ids(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_string_ids(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); /* Commente les définitions des identifiants de types. */ -bool annotate_dex_type_ids(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_type_ids(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); /* Commente les définitions des identifiants de prototypes. */ -bool annotate_dex_proto_ids(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_proto_ids(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); /* Commente les définitions des identifiants de champs. */ -bool annotate_dex_field_ids(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_field_ids(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); /* Commente les définitions des identifiants de méthodes. */ -bool annotate_dex_method_ids(const GDexFormat *, GtkStatusStack *); +bool annotate_dex_method_ids(const GDexFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readdex/reader.c b/plugins/readdex/reader.c index 5bd7649..645ec5b 100644 --- a/plugins/readdex/reader.c +++ b/plugins/readdex/reader.c @@ -33,8 +33,8 @@ -DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files", "0.1.0", - PGA_FORMAT_LOADER_LAST); +DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files", "0.2.0", + PGA_FORMAT_PRELOAD); /****************************************************************************** @@ -42,6 +42,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Etablit des symboles complémentaires dans un format DEX. * @@ -52,7 +53,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readdex", "Displays information about DEX files * * ******************************************************************************/ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status) +G_MODULE_EXPORT bool preload_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GDexFormat *dex_fmt; /* Version DEX */ @@ -65,19 +66,19 @@ G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAct dex_fmt = G_DEX_FORMAT(format); - result = annotate_dex_header(dex_fmt); + result = annotate_dex_header(dex_fmt, info); - result &= annotate_dex_string_ids(dex_fmt, status); + result &= annotate_dex_string_ids(dex_fmt, info, status); - result &= annotate_dex_type_ids(dex_fmt, status); + result &= annotate_dex_type_ids(dex_fmt, info, status); - result &= annotate_dex_proto_ids(dex_fmt, status); + result &= annotate_dex_proto_ids(dex_fmt, info, status); - result &= annotate_dex_field_ids(dex_fmt, status); + result &= annotate_dex_field_ids(dex_fmt, info, status); - result &= annotate_dex_method_ids(dex_fmt, status); + result &= annotate_dex_method_ids(dex_fmt, info, status); - result &= annotate_dex_class_defs(dex_fmt, status); + result &= annotate_dex_class_defs(dex_fmt, info, status); hbf_exit: diff --git a/plugins/readdex/reader.h b/plugins/readdex/reader.h index f56d928..74a2968 100644 --- a/plugins/readdex/reader.h +++ b/plugins/readdex/reader.h @@ -32,7 +32,7 @@ /* Etablit des symboles complémentaires dans un format DEX. */ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); +G_MODULE_EXPORT bool preload_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readelf/header.c b/plugins/readelf/header.c index 4b3cdbc..a83f690 100644 --- a/plugins/readelf/header.c +++ b/plugins/readelf/header.c @@ -451,6 +451,7 @@ static fmt_field_def _elf_header_ending[] = { /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * * * Description : Charge tous les symboles de l'en-tête ELF. * * * @@ -460,7 +461,7 @@ static fmt_field_def _elf_header_ending[] = { * * ******************************************************************************/ -bool annotate_elf_header(GBinFormat *format) +bool annotate_elf_header(GBinFormat *format, GPreloadInfo *info) { bool result; /* Bilan à retourner */ const elf_header *header; /* En-tête principale */ @@ -471,15 +472,15 @@ bool annotate_elf_header(GBinFormat *format) result = g_exe_format_translate_offset_into_vmpa(G_EXE_FORMAT(format), 0, &pos); if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_header_base), format, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_header_base), format, info, &pos, NULL); if (result) { if (header->hdr32.e_ident[EI_CLASS] == ELFCLASS32) - result = parse_field_definitions(PARSING_DEFS(_elf_header_offset_32), format, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_header_offset_32), format, info, &pos, NULL); else if (header->hdr32.e_ident[EI_CLASS] == ELFCLASS64) - result = parse_field_definitions(PARSING_DEFS(_elf_header_offset_64), format, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_header_offset_64), format, info, &pos, NULL); else result = false; @@ -487,7 +488,7 @@ bool annotate_elf_header(GBinFormat *format) } if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_header_ending), format, &pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_header_ending), format, info, &pos, NULL); return result; diff --git a/plugins/readelf/header.h b/plugins/readelf/header.h index 9d1744e..060a363 100644 --- a/plugins/readelf/header.h +++ b/plugins/readelf/header.h @@ -25,12 +25,13 @@ #define _PLUGINS_READELF_HEADER_H +#include <format/preload.h> #include <format/elf/elf.h> /* Charge tous les symboles de l'en-tête ELF. */ -bool annotate_elf_header(GBinFormat *); +bool annotate_elf_header(GBinFormat *, GPreloadInfo *); diff --git a/plugins/readelf/program.c b/plugins/readelf/program.c index b1e253a..a71e1d1 100644 --- a/plugins/readelf/program.c +++ b/plugins/readelf/program.c @@ -206,13 +206,14 @@ static fmt_field_def _elf_phdr_64b[] = { /* Charge tous les symboles liés à un en-tête de programme ELF. */ -static bool annotate_elf_program_header(GElfFormat *, SourceEndian, vmpa2t *); +static bool annotate_elf_program_header(GElfFormat *, GPreloadInfo *, SourceEndian, vmpa2t *); /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * endian = boutisme présentement utilisé. * * pos = tête de lecture à déplacer. [OUT] * * * @@ -224,7 +225,7 @@ static bool annotate_elf_program_header(GElfFormat *, SourceEndian, vmpa2t *); * * ******************************************************************************/ -static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, vmpa2t *pos) +static bool annotate_elf_program_header(GElfFormat *format, GPreloadInfo *info, SourceEndian endian, vmpa2t *pos) { bool result; /* Bilan à retourner */ elf_phdr phdr; /* En-tête de programme ELF */ @@ -287,28 +288,28 @@ static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, bformat = G_BIN_FORMAT(format); - result = parse_field_definitions(PARSING_DEFS(_elf_phdr_base), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_phdr_base), bformat, info, pos, NULL); if (format->is_32b) { if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_phdr_32b_a), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_phdr_32b_a), bformat, info, pos, NULL); if (result) - result = parse_field_definitions(&flags_field, 1, bformat, pos, NULL); + result = parse_field_definitions(&flags_field, 1, bformat, info, pos, NULL); if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_phdr_32b_b), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_phdr_32b_b), bformat, info, pos, NULL); } else { if (result) - result = parse_field_definitions(&flags_field, 1, bformat, pos, NULL); + result = parse_field_definitions(&flags_field, 1, bformat, info, pos, NULL); if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_phdr_64b), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_phdr_64b), bformat, info, pos, NULL); } @@ -322,6 +323,7 @@ static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Charge tous les symboles liés aux en-têtes de programme ELF. * @@ -332,7 +334,7 @@ static bool annotate_elf_program_header(GElfFormat *format, SourceEndian endian, * * ******************************************************************************/ -bool annotate_elf_program_header_table(GElfFormat *format, GtkStatusStack *status) +bool annotate_elf_program_header_table(GElfFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const elf_header *header; /* En-tête principale */ @@ -359,7 +361,7 @@ bool annotate_elf_program_header_table(GElfFormat *format, GtkStatusStack *statu for (i = 0; i < e_phnum && result; i++) { - result = annotate_elf_program_header(format, endian, &pos); + result = annotate_elf_program_header(format, info, endian, &pos); gtk_status_stack_update_activity_value(status, msg, 1); diff --git a/plugins/readelf/program.h b/plugins/readelf/program.h index bee0fa0..0710577 100644 --- a/plugins/readelf/program.h +++ b/plugins/readelf/program.h @@ -25,12 +25,13 @@ #define _PLUGINS_READELF_PROGRAM_H +#include <format/preload.h> #include <format/elf/elf.h> /* Charge tous les symboles liés aux en-têtes de programme ELF. */ -bool annotate_elf_program_header_table(GElfFormat *, GtkStatusStack *); +bool annotate_elf_program_header_table(GElfFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readelf/reader.c b/plugins/readelf/reader.c index 62efdf4..47b33a0 100644 --- a/plugins/readelf/reader.c +++ b/plugins/readelf/reader.c @@ -34,8 +34,8 @@ -DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files", "0.1.0", - PGA_FORMAT_LOADER_LAST); +DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files", "0.2.0", + PGA_FORMAT_PRELOAD); /****************************************************************************** @@ -43,6 +43,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Etablit des symboles complémentaires dans un format ELF. * @@ -53,7 +54,7 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("readelf", "Displays information about ELF files * * ******************************************************************************/ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GtkStatusStack *status) +G_MODULE_EXPORT bool preload_binary_format(const GPluginModule *plugin, PluginAction action, GBinFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ GElfFormat *elf_fmt; /* Version ELF */ @@ -66,13 +67,13 @@ G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *plugin, PluginAct elf_fmt = G_ELF_FORMAT(format); - result = annotate_elf_header(format); + result = annotate_elf_header(format, info); - result &= annotate_elf_program_header_table(elf_fmt, status); + result &= annotate_elf_program_header_table(elf_fmt, info, status); - result &= annotate_elf_section_header_table(elf_fmt, status); + result &= annotate_elf_section_header_table(elf_fmt, info, status); - show_elf_section_string_table(elf_fmt, status); + show_elf_section_string_table(elf_fmt, info, status); hbf_exit: diff --git a/plugins/readelf/reader.h b/plugins/readelf/reader.h index 2da1b43..8dfdeb8 100644 --- a/plugins/readelf/reader.h +++ b/plugins/readelf/reader.h @@ -32,7 +32,7 @@ /* Etablit des symboles complémentaires dans un format ELF. */ -G_MODULE_EXPORT bool handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); +G_MODULE_EXPORT bool preload_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readelf/section.c b/plugins/readelf/section.c index 6161892..eee20b5 100644 --- a/plugins/readelf/section.c +++ b/plugins/readelf/section.c @@ -247,13 +247,14 @@ static fmt_field_def _elf_shdr_64b[] = { /* Charge tous les symboles liés à un en-tête de section ELF. */ -static bool annotate_elf_section_header(GElfFormat *, SourceEndian, const elf_shdr *, vmpa2t *); +static bool annotate_elf_section_header(GElfFormat *, GPreloadInfo *, SourceEndian, const elf_shdr *, vmpa2t *); /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * endian = boutisme présentement utilisé. * * strings = section renvoyant vers des chaînes de caractères. * * pos = tête de lecture à déplacer. [OUT] * @@ -266,7 +267,7 @@ static bool annotate_elf_section_header(GElfFormat *, SourceEndian, const elf_sh * * ******************************************************************************/ -static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, const elf_shdr *strings, vmpa2t *pos) +static bool annotate_elf_section_header(GElfFormat *format, GPreloadInfo *info, SourceEndian endian, const elf_shdr *strings, vmpa2t *pos) { bool result; /* Bilan à retourner */ elf_shdr shdr; /* En-tête de programme ELF */ @@ -370,21 +371,21 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, bformat = G_BIN_FORMAT(format); - result = parse_field_definitions(&name_field, 1, bformat, pos, NULL); + result = parse_field_definitions(&name_field, 1, bformat, info, pos, NULL); if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_sh_type), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_sh_type), bformat, info, pos, NULL); if (format->is_32b) { if (result) { flags_field.size = MDS_32_BITS; - result = parse_field_definitions(&flags_field, 1, bformat, pos, NULL); + result = parse_field_definitions(&flags_field, 1, bformat, info, pos, NULL); } if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_shdr_32b), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_shdr_32b), bformat, info, pos, NULL); } else @@ -392,11 +393,11 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, if (result) { flags_field.size = MDS_64_BITS; - result = parse_field_definitions(&flags_field, 1, bformat, pos, NULL); + result = parse_field_definitions(&flags_field, 1, bformat, info, pos, NULL); } if (result) - result = parse_field_definitions(PARSING_DEFS(_elf_shdr_64b), bformat, pos, NULL); + result = parse_field_definitions(PARSING_DEFS(_elf_shdr_64b), bformat, info, pos, NULL); } @@ -410,6 +411,7 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Charge tous les symboles liés aux en-têtes de section ELF. * @@ -420,7 +422,7 @@ static bool annotate_elf_section_header(GElfFormat *format, SourceEndian endian, * * ******************************************************************************/ -bool annotate_elf_section_header_table(GElfFormat *format, GtkStatusStack *status) +bool annotate_elf_section_header_table(GElfFormat *format, GPreloadInfo *info, GtkStatusStack *status) { bool result; /* Bilan à retourner */ const elf_header *header; /* En-tête principale */ @@ -451,7 +453,7 @@ bool annotate_elf_section_header_table(GElfFormat *format, GtkStatusStack *statu for (i = 0; i < e_shnum && result; i++) { - result = annotate_elf_section_header(format, endian, &strings, &pos); + result = annotate_elf_section_header(format, info, endian, &strings, &pos); gtk_status_stack_update_activity_value(status, msg, 1); diff --git a/plugins/readelf/section.h b/plugins/readelf/section.h index 3168dab..60e8f34 100644 --- a/plugins/readelf/section.h +++ b/plugins/readelf/section.h @@ -25,12 +25,13 @@ #define _PLUGINS_READELF_SECTION_H +#include <format/preload.h> #include <format/elf/elf.h> /* Charge tous les symboles liés aux en-têtes de section ELF. */ -bool annotate_elf_section_header_table(GElfFormat *, GtkStatusStack *); +bool annotate_elf_section_header_table(GElfFormat *, GPreloadInfo *, GtkStatusStack *); diff --git a/plugins/readelf/strtab.c b/plugins/readelf/strtab.c index c94deed..9e625fd 100644 --- a/plugins/readelf/strtab.c +++ b/plugins/readelf/strtab.c @@ -33,13 +33,14 @@ /* Affiche les chaînes présentes dans une zone de données. */ -static void parse_elf_string_table(GElfFormat *, const GBinContent *, const mrange_t *, GtkStatusStack *); +static void parse_elf_string_table(GElfFormat *, GPreloadInfo *, const GBinContent *, const mrange_t *, GtkStatusStack *); /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * content = contenu binaire à analyser. * * range = espace à couvrir pendant l'analyse. * * status = barre de statut à tenir informée. * @@ -52,7 +53,7 @@ static void parse_elf_string_table(GElfFormat *, const GBinContent *, const mran * * ******************************************************************************/ -static void parse_elf_string_table(GElfFormat *format, const GBinContent *content, const mrange_t *range, GtkStatusStack *status) +static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const GBinContent *content, const mrange_t *range, GtkStatusStack *status) { phys_t length; /* Taille de la couverture */ vmpa2t pos; /* Tête de lecture */ @@ -94,6 +95,9 @@ static void parse_elf_string_table(GElfFormat *format, const GBinContent *conten g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); + g_preload_info_add_instruction(info, instr); + + g_object_ref(G_OBJECT(instr)); ADD_STR_AS_SYM(format, symbol, instr); /* Jointure avec la chaîne précédente ? */ @@ -126,6 +130,7 @@ static void parse_elf_string_table(GElfFormat *format, const GBinContent *conten /****************************************************************************** * * * Paramètres : format = description de l'exécutable à compléter. * +* info = informations à constituer en avance de phase. * * status = barre de statut à tenir informée. * * * * Description : Affiche les chaînes liées aux sections ELF. * @@ -136,7 +141,7 @@ static void parse_elf_string_table(GElfFormat *format, const GBinContent *conten * * ******************************************************************************/ -void show_elf_section_string_table(GElfFormat *format, GtkStatusStack *status) +void show_elf_section_string_table(GElfFormat *format, GPreloadInfo *info, GtkStatusStack *status) { GBinContent *content; /* Contenu binaire à lire */ mrange_t range; /* Espace à parcourir */ @@ -147,17 +152,17 @@ void show_elf_section_string_table(GElfFormat *format, GtkStatusStack *status) found = find_elf_section_range_by_name(format, ".interp", &range); if (found) - parse_elf_string_table(format, content, &range, status); + parse_elf_string_table(format, info, content, &range, status); found = find_elf_section_range_by_name(format, ".shstrtab", &range); if (found) - parse_elf_string_table(format, content, &range, status); + parse_elf_string_table(format, info, content, &range, status); found = find_elf_section_range_by_name(format, ".strtab", &range); if (found) - parse_elf_string_table(format, content, &range, status); + parse_elf_string_table(format, info, content, &range, status); g_object_unref(G_OBJECT(content)); diff --git a/plugins/readelf/strtab.h b/plugins/readelf/strtab.h index a3c8c8b..89c178d 100644 --- a/plugins/readelf/strtab.h +++ b/plugins/readelf/strtab.h @@ -25,12 +25,13 @@ #define _PLUGINS_READELF_STRTAB_H +#include <format/preload.h> #include <format/elf/elf.h> /* Affiche les chaînes liées aux sections ELF. */ -void show_elf_section_string_table(GElfFormat *, GtkStatusStack *); +void show_elf_section_string_table(GElfFormat *, GPreloadInfo *, GtkStatusStack *); |