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/readelf | |
parent | 07768223823d8c2b0071be8d8e6dfc5ccb891b17 (diff) |
Inserted preloaded format information from instructions instead of symbols.
Diffstat (limited to 'plugins/readelf')
-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 |
10 files changed, 58 insertions, 43 deletions
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 *); |