diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-05-12 21:28:01 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-05-12 21:28:01 (GMT) |
commit | 5fce21379baac06b7b9359c4b0fcb7fb3867c301 (patch) | |
tree | 19bf2943fe5a8a46bae227b8863bc9714fb3ec66 /src/format | |
parent | 8ee7fc5db965adaa835ca87bb3d2e2d43e52fbbb (diff) |
Added the ELF strings to the preloaded instruction list.
Diffstat (limited to 'src/format')
-rwxr-xr-x | src/format/dex/dex.c | 3 | ||||
-rw-r--r-- | src/format/elf/elf.c | 13 | ||||
-rw-r--r-- | src/format/elf/strings.c | 14 | ||||
-rw-r--r-- | src/format/format-int.h | 3 | ||||
-rw-r--r-- | src/format/format.c | 17 | ||||
-rw-r--r-- | src/format/preload.c | 29 | ||||
-rw-r--r-- | src/format/preload.h | 3 |
7 files changed, 71 insertions, 11 deletions
diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c index e34318f..b0b32a7 100755 --- a/src/format/dex/dex.c +++ b/src/format/dex/dex.c @@ -32,6 +32,7 @@ #include "dex-int.h" #include "pool.h" +#include "../../plugins/pglist.h" @@ -287,6 +288,8 @@ GBinFormat *g_dex_format_new(GBinContent *content, GExeFormat *parent, GtkStatus if (!load_all_dex_classes(result, gid, status)) goto gdfn_error; + preload_binary_format(PGA_FORMAT_PRELOAD, base, base->info, status); + if (!g_executable_format_complete_loading(exe_format, status)) goto gdfn_error; diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c index bc48eb5..0336ba3 100644 --- a/src/format/elf/elf.c +++ b/src/format/elf/elf.c @@ -39,6 +39,7 @@ #include "strings.h" #include "symbols.h" #include "../../gui/panels/log.h" +#include "../../plugins/pglist.h" @@ -293,6 +294,18 @@ GBinFormat *g_elf_format_new(GBinContent *content, GExeFormat *parent, GtkStatus + /** + * On inscrit les éléments préchargés avant tout ! + * + * Cela permet de partir d'une base vide, et d'ajouter les instructions et + * leurs commentaires par paires. + * + * Ensuite, on inscrit le reste (comme les chaînes de caractères). + */ + + preload_binary_format(PGA_FORMAT_PRELOAD, base, base->info, status); + + if (!load_elf_symbols(result, status)) { /* TODO */ diff --git a/src/format/elf/strings.c b/src/format/elf/strings.c index 8901db9..d350200 100644 --- a/src/format/elf/strings.c +++ b/src/format/elf/strings.c @@ -37,7 +37,7 @@ /* Enregistre toutes les chaînes de caractères trouvées. */ -bool parse_elf_string_data(GElfFormat *, phys_t, phys_t, virt_t); +static bool parse_elf_string_data(GElfFormat *, phys_t, phys_t, virt_t); @@ -148,9 +148,10 @@ bool find_all_elf_strings(GElfFormat *format) * * ******************************************************************************/ -bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t address) +static bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t address) { bool result; /* Bilan à faire remonter */ + GBinFormat *base; /* Autre version du format */ GBinContent *content; /* Contenu binaire à lire */ const bin_t *data; /* Contenu complet et original */ vmpa2t pos; /* Tête de lecture */ @@ -168,7 +169,9 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t /* Préparation des accès */ - content = g_binary_format_get_content(G_BIN_FORMAT(format)); + base = G_BIN_FORMAT(format); + + content = g_binary_format_get_content(base); init_vmpa(&pos, start, address); @@ -199,6 +202,9 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); + g_preload_info_add_instruction(base->info, instr); + + g_object_ref(G_OBJECT(instr)); ADD_STR_AS_SYM(format, symbol, instr); /* Jointure avec la chaîne précédente ? */ @@ -207,7 +213,7 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t { init_vmpa(&pos, start + i, address + i); - label = create_string_label(G_BIN_FORMAT(format), &pos, end - i); + label = create_string_label(base, &pos, end - i); g_binary_symbol_set_alt_label(symbol, label); diff --git a/src/format/format-int.h b/src/format/format-int.h index f82190f..30fb666 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -28,6 +28,7 @@ #include "format.h" +#include "preload.h" #include "../gtkext/gtkstatusstack.h" @@ -62,6 +63,8 @@ struct _GBinFormat GRWLock pt_lock; /* Accès à la liste des points */ + GPreloadInfo *info; /* Préchargements du format */ + GBinSymbol **symbols; /* Liste des symboles trouvés */ size_t symbols_count; /* Quantité de ces symboles */ GRWLock syms_lock; /* Accès à la liste de symboles*/ diff --git a/src/format/format.c b/src/format/format.c index 1eef759..d5cbda4 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -99,11 +99,20 @@ static void g_binary_format_init(GBinFormat *format) { g_rw_lock_init(&format->pt_lock); + format->info = g_preload_info_new(); + g_rw_lock_init(&format->syms_lock); } + +/* FIXME : g_object_unref(format->info); */ + +/* FIXME : g_rw_lock_clear(&format->syms_lock);*/ + + + /****************************************************************************** * * * Paramètres : format = instance à traiter. * @@ -128,12 +137,6 @@ bool g_binary_format_complete_loading(GBinFormat *format, GtkStatusStack *status } - - -/* FIXME : g_rw_lock_clear(&format->syms_lock);*/ - - - /****************************************************************************** * * * Paramètres : format = description de l'exécutable à consulter. * @@ -260,7 +263,7 @@ void g_binary_format_register_code_point(GBinFormat *format, virt_t pt, bool ent void g_binary_format_preload_disassembling_context(GBinFormat *format, GProcContext *ctx, GtkStatusStack *status) { - preload_binary_format(PGA_FORMAT_PRELOAD, format, G_PRELOAD_INFO(ctx), status); + g_preload_info_copy(format->info, G_PRELOAD_INFO(ctx)); } diff --git a/src/format/preload.c b/src/format/preload.c index 750a67c..2eec92e 100644 --- a/src/format/preload.c +++ b/src/format/preload.c @@ -181,6 +181,35 @@ GPreloadInfo *g_preload_info_new(void) /****************************************************************************** * * +* Paramètres : src = collecte à consulter. * +* dest = collecte à constituer. [OUT] * +* * +* Description : Copie le contenu d'une collecte d'informations préchargées. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_preload_info_copy(GPreloadInfo *src, GPreloadInfo *dest) +{ + void inc_preloaded_item_ref(GObject **item) + { + g_object_ref(*item); + } + + copy_flat_array_items(&src->instructions, &dest->instructions, + sizeof(GArchInstruction *), (item_notify_cb)inc_preloaded_item_ref); + + copy_flat_array_items(&src->comments, &dest->comments, + sizeof(GDbComment *), (item_notify_cb)inc_preloaded_item_ref); + +} + + +/****************************************************************************** +* * * Paramètres : info = préchargements à mettre à jour. * * * * Description : Verrouille les accès à la liste des instructions. * diff --git a/src/format/preload.h b/src/format/preload.h index d88366a..59c81b7 100644 --- a/src/format/preload.h +++ b/src/format/preload.h @@ -54,6 +54,9 @@ GType g_preload_info_get_type(void); /* Crée une nouvelle collecte d'informations préchargées. */ GPreloadInfo *g_preload_info_new(void); +/* Copie le contenu d'une collecte d'informations préchargées. */ +void g_preload_info_copy(GPreloadInfo *, GPreloadInfo *); + /* Verrouille les accès à la liste des instructions. */ void g_preload_info_lock_instructions(GPreloadInfo *); |