summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-08-16 22:26:41 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-08-16 22:26:41 (GMT)
commitd3f9ef68a9939ee43e8a70748dd4b7e97352179e (patch)
tree08f6d5cd4bddbd42448a0a4efe0522c0a96c99a2 /plugins
parented763539951307353042c04af5c2278db0d05298 (diff)
Kept only the first submission when preloading instructions.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/fmtp/parser.c11
-rw-r--r--plugins/readdex/ids.c12
-rw-r--r--plugins/readelf/strtab.c29
3 files changed, 33 insertions, 19 deletions
diff --git a/plugins/fmtp/parser.c b/plugins/fmtp/parser.c
index 96aeb11..fe41e9b 100644
--- a/plugins/fmtp/parser.c
+++ b/plugins/fmtp/parser.c
@@ -55,10 +55,10 @@ static bool parse_field_definition(const fmt_field_def *, GBinFormat *, GPreload
static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format, GPreloadInfo *info, vmpa2t *pos, void *data)
{
+ bool result; /* Bilan à retourner */
GBinContent *content; /* Contenu binaire à lire */
SourceEndian endian; /* Boutisme utilisé */
vmpa2t mod; /* Position modifiable */
- bool result; /* Bilan à retourner */
GArchInstruction *instr; /* Instruction décodée */
GImmOperand *imm; /* Opérande à transformer */
size_t i; /* Boucle de parcours */
@@ -66,6 +66,7 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,
GDbComment *comment; /* Définition de commentaire */
uint64_t raw; /* Valeur brute à étudier */
const comment_part *part; /* Accès plus direct */
+ bool inserted; /* Bilan d'une insertion */
/* Lecture */
@@ -192,9 +193,13 @@ static bool parse_field_definition(const fmt_field_def *def, GBinFormat *format,
/* Insertions */
- g_preload_info_add_instruction(info, instr);
+ inserted = g_preload_info_add_instruction(info, instr);
- g_preload_info_add_comment(info, comment);
+ if (inserted)
+ g_preload_info_add_comment(info, comment);
+
+ else
+ g_object_unref(G_OBJECT(comment));
pfd_exit:
diff --git a/plugins/readdex/ids.c b/plugins/readdex/ids.c
index e09036e..518e9ad 100644
--- a/plugins/readdex/ids.c
+++ b/plugins/readdex/ids.c
@@ -254,6 +254,7 @@ bool annotate_dex_string_ids(const GDexFormat *format, GPreloadInfo *info, GtkSt
vmpa2t item_pos; /* Position d'un élément */
uleb128_t length; /* Taille de la chaîne en cours*/
GArchInstruction *instr; /* Instruction décodée */
+ bool inserted; /* Bilan d'une insertion */
const mrange_t *range; /* Espace occupé par une chaîne*/
GBinSymbol *symbol; /* Symbole à intégrer */
@@ -331,13 +332,16 @@ bool annotate_dex_string_ids(const GDexFormat *format, GPreloadInfo *info, GtkSt
g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true);
- g_preload_info_add_instruction(info, instr);
+ inserted = g_preload_info_add_instruction(info, instr);
- range = g_arch_instruction_get_range(instr);
+ if (inserted)
+ {
+ range = g_arch_instruction_get_range(instr);
- symbol = g_binary_symbol_new(range, STP_RO_STRING);
- g_binary_format_add_symbol(bformat, symbol);
+ symbol = g_binary_symbol_new(range, STP_RO_STRING);
+ g_binary_format_add_symbol(bformat, symbol);
+ }
}
diff --git a/plugins/readelf/strtab.c b/plugins/readelf/strtab.c
index 1564674..7cdb4c9 100644
--- a/plugins/readelf/strtab.c
+++ b/plugins/readelf/strtab.c
@@ -63,6 +63,7 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
phys_t i; /* Boucle de parcours */
phys_t end; /* Position de fin de chaîne */
GArchInstruction *instr; /* Instruction décodée */
+ bool inserted; /* Bilan d'une insertion */
const mrange_t *irange; /* Espace occupé par une chaîne*/
GBinSymbol *symbol; /* Symbole à intégrer */
char *label; /* Désignation de la chaîne */
@@ -103,25 +104,29 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true);
- g_preload_info_add_instruction(info, instr);
+ inserted = g_preload_info_add_instruction(info, instr);
- irange = g_arch_instruction_get_range(instr);
+ if (inserted)
+ {
+ irange = g_arch_instruction_get_range(instr);
- symbol = g_binary_symbol_new(irange, STP_RO_STRING);
- g_binary_format_add_symbol(base, symbol);
+ symbol = g_binary_symbol_new(irange, STP_RO_STRING);
+ g_binary_format_add_symbol(base, symbol);
- /* Jointure avec la chaîne précédente ? */
+ /* Jointure avec la chaîne précédente ? */
- if (cut)
- {
- copy_vmpa(&pos, get_mrange_addr(range));
- advance_vmpa(&pos, i);
+ if (cut)
+ {
+ copy_vmpa(&pos, get_mrange_addr(range));
+ advance_vmpa(&pos, i);
+
+ label = create_string_label(base, get_mrange_addr(irange), end - i);
- label = create_string_label(base, get_mrange_addr(irange), end - i);
+ g_binary_symbol_set_alt_label(symbol, label);
- g_binary_symbol_set_alt_label(symbol, label);
+ free(label);
- free(label);
+ }
}