summaryrefslogtreecommitdiff
path: root/src/analysis/disass/area.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-31 19:58:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-31 19:58:50 (GMT)
commit0f571c20444dbb5d8d8d0fa46a69b31cb89f9583 (patch)
tree4349b6bdfb1b8adbdc60e0887a2a122ed857b678 /src/analysis/disass/area.c
parent57d7eff57c20e75aaa4ccd34f1d9d733e12bb232 (diff)
Resolved links in disassembled instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@446 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/disass/area.c')
-rw-r--r--src/analysis/disass/area.c278
1 files changed, 131 insertions, 147 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 9d8dcf5..0ec4ad4 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -28,15 +28,15 @@
-#if 0
/* Zone mémoire bien bornée */
-struct _mem_area
+typedef struct _mem_area
{
mrange_t range; /* Couverture de la zone */
unsigned long *processed; /* Octets traités dans la zone */
+ GArchInstruction **instructions; /* Instructions en place */
bool has_sym; /* Représentation via symbole ?*/
@@ -46,10 +46,10 @@ struct _mem_area
GBinSymbol *symbol; /* Symbole associé à la zone */
};
-};
+} mem_area;
+
-#endif
@@ -76,10 +76,10 @@ static bool mark_range_in_mem_area_as_processed(mem_area *, phys_t, phys_t, GArc
/* Procède au désassemblage d'un contenu binaire non exécutable. */
-static void load_data_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_info *);
+static void load_data_from_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, const vmpa2t *, status_blob_info *);
/* S'assure qu'une aire contient toutes ses instructions. */
-static void fill_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_info *);
+static void fill_mem_area(mem_area *, mem_area *, size_t, const GLoadedBinary *, GProcContext *, status_blob_info *);
@@ -240,12 +240,12 @@ static void fini_mem_area(mem_area *area)
static bool is_range_blank_in_mem_area(mem_area *area, phys_t start, phys_t len, GArchInstruction *instr)
{
bool result; /* Bilan à renvoyer */
- phys_t max; /* Point d'arrêt de la boucle */
+ phys_t max; /* Point d'arrêt de la boucle */
phys_t i; /* Boucle de parcours */
size_t index; /* Cellule de tableau visée */
unsigned int remaining; /* Nombre de bits restants */
- max = start + len;
+ max = start + len;
assert(max <= get_mrange_length(&area->range));
@@ -282,12 +282,12 @@ static bool is_range_blank_in_mem_area(mem_area *area, phys_t start, phys_t len,
static bool mark_range_in_mem_area_as_processed(mem_area *area, phys_t start, phys_t len, GArchInstruction *instr)
{
- phys_t max; /* Point d'arrêt de la boucle */
+ phys_t max; /* Point d'arrêt de la boucle */
phys_t i; /* Boucle de parcours */
size_t index; /* Cellule de tableau visée */
unsigned int remaining; /* Nombre de bits restants */
- max = start + len;
+ max = start + len;
assert(max <= get_mrange_length(&area->range));
@@ -330,7 +330,7 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, phys_t start, ph
* *
******************************************************************************/
-void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_info *info)
+void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info)
{
@@ -379,7 +379,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
copy_vmpa(&pos, get_mrange_addr(&area->range));
advance_vmpa(&pos, diff);
- printf(" [%p] CODE start @ %u (len=%u)\n", area, (unsigned int)diff, (unsigned int)alen);
+ printf(" [%p] CODE start @ %u (len=%u)\n", area, (unsigned int)diff, (unsigned int)alen);
for (i = diff; i < alen; i += diff)
{
@@ -391,7 +391,7 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
instr = g_arch_processor_disassemble(proc, ctx, bin_data, &pos, bin_length);
- //printf(" @ 0x%08x -> %p\n", (uint32_t)get_virt_addr(&prev), instr);
+ //printf(" @ 0x%08x -> %p\n", (uint32_t)get_virt_addr(&prev), instr);
if (instr == NULL) break;
@@ -414,15 +414,9 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
mark_range_in_mem_areas_as_processed(list, count, instr);
- //done += (new_phy - old_phy);
- //gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / sum);
-
-
-
-
-
-
+ inc_progessive_status(info, diff);
+ assert(!is_range_blank_in_mem_areas(list, count, &range));
}
@@ -451,11 +445,11 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
* *
******************************************************************************/
-static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_info *info)
+static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, const vmpa2t *start, status_blob_info *info)
{
GBinFormat *format; /* Format du fichier binaire */
GArchProcessor *proc; /* Architecture du binaire */
- SourceEndian endianness; /* Boutisme de cette machine */
+ SourceEndian endianness; /* Boutisme de cette machine */
off_t bin_length; /* Taille des données à lire */
bin_t *bin_data; /* Données binaires à lire */
phys_t diff; /* Volume de données traité */
@@ -476,7 +470,7 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
proc = get_arch_processor_from_format(G_EXE_FORMAT(format));
- endianness = g_arch_processor_get_endianness(proc);
+ endianness = g_arch_processor_get_endianness(proc);
bin_data = g_loaded_binary_get_data(binary, &bin_length);
diff = compute_vmpa_diff(get_mrange_addr(&area->range), start);
@@ -490,8 +484,8 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
copy_vmpa(&pos, get_mrange_addr(&area->range));
advance_vmpa(&pos, diff);
- printf(" [%p] DATA start @ 0x%08x -> %u (len=%u)\n",
- area, (unsigned int)get_phy_addr(&pos), (unsigned int)diff, (unsigned int)alen);
+ printf(" [%p] DATA start @ 0x%08x -> %u (len=%u)\n",
+ area, (unsigned int)get_phy_addr(&pos), (unsigned int)diff, (unsigned int)alen);
for (i = diff; i < alen; i += diff)
{
@@ -499,53 +493,50 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
copy_vmpa(&prev, &pos);
- instr = NULL;
+ instr = NULL;
- if (instr == NULL && (i + 4) <= alen)
- {
- init_mrange(&range, &pos, 4);
+ if (instr == NULL && (i + 4) <= alen)
+ {
+ init_mrange(&range, &pos, 4);
- if (is_range_blank_in_mem_areas(list, count, &range))
- instr = g_raw_instruction_new_array(bin_data, MDS_32_BITS, 1, &pos, bin_length, endianness);
+ if (is_range_blank_in_mem_areas(list, count, &range))
+ instr = g_raw_instruction_new_array(bin_data, MDS_32_BITS, 1, &pos, bin_length, endianness);
- }
+ }
- if (instr == NULL && (i + 2) <= alen)
- {
- copy_vmpa(&pos, &prev);
- init_mrange(&range, &pos, 2);
+ if (instr == NULL && (i + 2) <= alen)
+ {
+ copy_vmpa(&pos, &prev);
+ init_mrange(&range, &pos, 2);
- if (is_range_blank_in_mem_areas(list, count, &range))
- instr = g_raw_instruction_new_array(bin_data, MDS_16_BITS, 1, &pos, bin_length, endianness);
+ if (is_range_blank_in_mem_areas(list, count, &range))
+ instr = g_raw_instruction_new_array(bin_data, MDS_16_BITS, 1, &pos, bin_length, endianness);
- }
+ }
- if (instr == NULL/* && (i + 1) <= alen*/)
- {
- copy_vmpa(&pos, &prev);
- init_mrange(&range, &pos, 1);
+ if (instr == NULL/* && (i + 1) <= alen*/)
+ {
+ copy_vmpa(&pos, &prev);
+ init_mrange(&range, &pos, 1);
- if (is_range_blank_in_mem_areas(list, count, &range))
- instr = g_raw_instruction_new_array(bin_data, MDS_8_BITS, 1, &pos, bin_length, endianness);
- else
- {
- printf(" break !! 0x%08x\n",
- (unsigned int)get_phy_addr(&pos));
- assert(0);
- break;
- }
+ if (is_range_blank_in_mem_areas(list, count, &range))
+ instr = g_raw_instruction_new_array(bin_data, MDS_8_BITS, 1, &pos, bin_length, endianness);
+ else
+ {
+ printf(" break !! 0x%08x\n",
+ (unsigned int)get_phy_addr(&pos));
+ assert(0);
+ break;
+ }
- }
+ }
- assert(instr != NULL);
+ assert(instr != NULL);
/* Enregistrement des positions et adresses */
diff = compute_vmpa_diff(&prev, &pos);
- printf(" decomp @ 0x%08x -> ++ %u\n",
- (unsigned int)get_phy_addr(&pos), (unsigned int)diff);
-
init_mrange(&range, &prev, diff);
g_arch_instruction_set_range(instr, &range);
@@ -554,10 +545,9 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
mark_range_in_mem_areas_as_processed(list, count, instr);
- assert(!is_range_blank_in_mem_areas(list, count, &range));
+ inc_progessive_status(info, diff);
- //done += (new_phy - old_phy);
- //gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / sum);
+ assert(!is_range_blank_in_mem_areas(list, count, &range));
}
@@ -581,40 +571,40 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
* *
******************************************************************************/
-static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_info *info)
+static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_blob_info *info)
{
- phys_t len; /* Taille de la zone à remplir */
+ phys_t len; /* Taille de la zone à remplir */
phys_t i; /* Boucle de parcours */
- vmpa2t start; /* Adresse de départ de combles*/
+ vmpa2t start; /* Adresse de départ de combles*/
- printf(" === FILLING | 0x%08x (%u)...\n",
- (unsigned int)get_phy_addr(get_mrange_addr(&area->range)),
- (unsigned int)get_phy_addr(get_mrange_addr(&area->range)));
+ printf(" === FILLING | 0x%08x (%u)...\n",
+ (unsigned int)get_phy_addr(get_mrange_addr(&area->range)),
+ (unsigned int)get_phy_addr(get_mrange_addr(&area->range)));
- /* Les symboles se doivent d'être indépendants ! */
- if (area->has_sym) return;
+ /* Les symboles se doivent d'être indépendants ! */
+ if (area->has_sym) return;
len = get_mrange_length(&area->range);
for (i = 0; i < len; i++)
{
- if (is_range_blank_in_mem_area(area, i, 1, NULL))
- {
- copy_vmpa(&start, get_mrange_addr(&area->range));
- advance_vmpa(&start, i);
+ if (is_range_blank_in_mem_area(area, i, 1, NULL))
+ {
+ copy_vmpa(&start, get_mrange_addr(&area->range));
+ advance_vmpa(&start, i);
- if (area->exec)
- load_code_from_mem_area(area, list, count, binary, ctx, &start, info);
+ if (area->exec)
+ load_code_from_mem_area(area, list, count, binary, ctx, &start, info);
- if (is_range_blank_in_mem_area(area, i, 1, NULL))
- load_data_from_mem_area(area, list, count, binary, ctx, &start, info);
+ if (is_range_blank_in_mem_area(area, i, 1, NULL))
+ load_data_from_mem_area(area, list, count, binary, ctx, &start, info);
- }
+ }
- if (is_range_blank_in_mem_area(area, i, 1, NULL))
- printf(" [%p] error with %u\n", area, (unsigned int)i);
+ if (is_range_blank_in_mem_area(area, i, 1, NULL))
+ printf(" [%p] error with %u\n", area, (unsigned int)i);
assert(!is_range_blank_in_mem_area(area, i, 1, NULL));
@@ -638,51 +628,51 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GL
static GArchInstruction *get_instructions_from_mem_area(const mem_area *area)
{
GArchInstruction *result; /* Liste d'instr. à renvoyer */
- phys_t len; /* Nombre d'instructions au max*/
- phys_t i; /* Boucle de parcours */
+ phys_t len; /* Nombre d'instructions au max*/
+ phys_t i; /* Boucle de parcours */
GArchInstruction *instr; /* Instruction décodée */
result = NULL;
- if (area->has_sym)
- switch (g_binary_symbol_get_target_type(area->symbol))
- {
- case STP_DATA:
- result = g_binary_symbol_get_instruction(area->symbol);
- g_object_ref(G_OBJECT(result));
- break;
+ if (area->has_sym)
+ switch (g_binary_symbol_get_target_type(area->symbol))
+ {
+ case STP_DATA:
+ result = g_binary_symbol_get_instruction(area->symbol);
+ g_object_ref(G_OBJECT(result));
+ break;
- case STP_ROUTINE:
- assert(false);
- //instr = load_code_binary(binary, start, end, statusbar, id);
- // + fill
- break;
+ case STP_ROUTINE:
+ assert(false);
+ //instr = load_code_binary(binary, start, end, statusbar, id);
+ // + fill
+ break;
- default:
- assert(false);
- break;
+ default:
+ assert(false);
+ break;
- }
+ }
- else
- {
- len = get_mrange_length(&area->range);
+ else
+ {
+ len = get_mrange_length(&area->range);
- for (i = 0; i < len; i++)
- {
- instr = area->instructions[i];
+ for (i = 0; i < len; i++)
+ {
+ instr = area->instructions[i];
- if (instr != NULL)
- {
- g_object_ref(G_OBJECT(instr));
- g_arch_instruction_add_to_list(&result, instr);
- }
+ if (instr != NULL)
+ {
+ g_object_ref(G_OBJECT(instr));
+ g_arch_instruction_add_to_list(&result, instr);
+ }
- }
+ }
- }
+ }
- return result;
+ return result;
}
@@ -771,15 +761,15 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
for (i = 0; i < exe_count; i++)
{
- printf(" (init) AREA %zu :: 0x%08x + %u\n",
- i,
- (unsigned int)get_phy_addr(get_mrange_addr(&exe_ranges[i])),
- (unsigned int)get_mrange_length(&exe_ranges[i]));
+ printf(" (init) AREA %zu :: 0x%08x + %u\n",
+ i,
+ (unsigned int)get_phy_addr(get_mrange_addr(&exe_ranges[i])),
+ (unsigned int)get_mrange_length(&exe_ranges[i]));
- }
+ }
- printf("----------------\n");
+ printf("----------------\n");
@@ -850,12 +840,12 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
for (i = 0; i < *count; i++)
{
- printf(" (fini) AREA %zu :: 0x%08x + %u\n",
- i,
- (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)),
- (unsigned int)get_mrange_length(&result[i].range));
+ printf(" (fini) AREA %zu :: 0x%08x + %u\n",
+ i,
+ (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)),
+ (unsigned int)get_mrange_length(&result[i].range));
- }
+ }
printf("--------------------\n");
@@ -916,15 +906,15 @@ mem_area *compute_memory_areas(GExeFormat *format, phys_t bin_length, size_t *co
for (i = 0; i < *count; i++)
{
- printf(" (sect) AREA %zu :: 0x%08x + %u\n",
- i,
- (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)),
- (unsigned int)get_mrange_length(&result[i].range));
+ printf(" (sect) AREA %zu :: 0x%08x + %u\n",
+ i,
+ (unsigned int)get_phy_addr(get_mrange_addr(&result[i].range)),
+ (unsigned int)get_mrange_length(&result[i].range));
- }
+ }
- //exit(0);
+ //exit(0);
@@ -1103,11 +1093,6 @@ mem_area *find_memory_area_by_addr(mem_area *list, size_t count, const vmpa2t *a
}
-
-
-
-
-
/******************************************************************************
* *
* Paramètres : list = liste de zones délimitant des contenus à traiter. *
@@ -1135,7 +1120,6 @@ static bool handle_bytes_map_in_mem_area(mem_area *list, size_t count, const mra
result = false;
area = find_memory_area_by_addr(list, count, get_mrange_addr(range));
- if (area == NULL) printf("NOT FOUND!\n");
if (area == NULL) return false;
offset = compute_vmpa_diff(get_mrange_addr(&area->range), get_mrange_addr(range));
@@ -1148,7 +1132,7 @@ static bool handle_bytes_map_in_mem_area(mem_area *list, size_t count, const mra
else
{
- assert(0);
+ assert(0);
/* Traitement de la fin de la première aire */
@@ -1247,12 +1231,12 @@ static bool mark_range_in_mem_areas_as_processed(mem_area *list, size_t count, G
* *
******************************************************************************/
-void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_info *info)
+void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoadedBinary *binary, GProcContext *ctx, status_blob_info *info)
{
- size_t i; /* Boucle de parcours */
+ size_t i; /* Boucle de parcours */
- for (i = 0; i < count; i++)
- fill_mem_area(&list[i], list, count, binary, ctx, info);
+ for (i = 0; i < count; i++)
+ fill_mem_area(&list[i], list, count, binary, ctx, info);
}
@@ -1273,17 +1257,17 @@ void ensure_all_mem_areas_are_filled(mem_area *list, size_t count, const GLoaded
GArchInstruction *collect_instructions_from_mem_areas(mem_area *list, size_t count)
{
GArchInstruction *result; /* Liste d'instr. à renvoyer */
- size_t i; /* Boucle de parcours */
+ size_t i; /* Boucle de parcours */
GArchInstruction *instr; /* Instruction(s) à insérer */
- result = NULL;
+ result = NULL;
- for (i = 0; i < count; i++)
- {
- instr = get_instructions_from_mem_area(&list[i]);
+ for (i = 0; i < count; i++)
+ {
+ instr = get_instructions_from_mem_area(&list[i]);
g_arch_instruction_merge_lists(&result, &instr);
- }
+ }
- return result;
+ return result;
}