summaryrefslogtreecommitdiff
path: root/plugins/readelf
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-05-05 21:58:46 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-05-05 21:59:01 (GMT)
commita66f854ce4e19dc0f772fc55a3899643252afa3d (patch)
tree52e46f77acc199904a73e2260117a3a5198aeb86 /plugins/readelf
parent07768223823d8c2b0071be8d8e6dfc5ccb891b17 (diff)
Inserted preloaded format information from instructions instead of symbols.
Diffstat (limited to 'plugins/readelf')
-rw-r--r--plugins/readelf/header.c11
-rw-r--r--plugins/readelf/header.h3
-rw-r--r--plugins/readelf/program.c22
-rw-r--r--plugins/readelf/program.h3
-rw-r--r--plugins/readelf/reader.c15
-rw-r--r--plugins/readelf/reader.h2
-rw-r--r--plugins/readelf/section.c22
-rw-r--r--plugins/readelf/section.h3
-rw-r--r--plugins/readelf/strtab.c17
-rw-r--r--plugins/readelf/strtab.h3
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 *);