diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/disass/area.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 6698bb3..bdfb1b2 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -407,7 +407,25 @@ static GArchInstruction *load_raw_instruction_from_mem_area(mem_area *area, phys sz = area->packing_size; - if (get_virt_addr(pos) % sz == 0 && is_range_blank_in_mem_area(area, offset, sz)) + /** + * Une vérification est effectuée en amont pour garantir qu'il existe + * toujours au moins un octet à traiter. + * + * Si on veut en manipuler plus d'un, aucune vérification en amont ne s'occupe + * du cas où on dépasse les limites de la zone lors des tests de marquage. + * + * D'habitude, c'est la création préalable d'une instruction, via la lecture + * du contenu binaire restreint, qui part en échec et qui fait qu'on ne teste + * pas la zone sur un espace hors champ. + * + * Ce test est effectué avant la création d'une instruction ici (et c'est le + * seul endroit dans ce cas de figure), donc il faut faire les vérifications + * de débordement avant tout ! + */ + + if (get_virt_addr(pos) % sz == 0 + && (offset + sz) <= get_mrange_length(&area->range) + && is_range_blank_in_mem_area(area, offset, sz)) { *size = sz; @@ -697,12 +715,10 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp if (!is_range_blank_in_mem_area(area, i, 1)) break; - instr = NULL; + /* Décodage d'une nouvelle instruction, sur mesure puis minimale */ copy_vmpa(&prev, &pos); - /* Décodage d'une nouvelle instruction, sur mesure puis minimale */ - instr = load_raw_instruction_from_mem_area(area, i, &pos, &diff); /* On rencontre ici un morceau déjà traité. */ |