summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-01-24 11:19:32 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-01-24 11:19:32 (GMT)
commit141d2f0fbb2ce3b4ddf85383c55b891fd59dc598 (patch)
tree085fa1a20d77f86825e1a6f4215b1ffd8fd961e8 /src/analysis
parent3df9f6dc8548b0562312036abfbfcf9850a81041 (diff)
Introduced conditional calls in instruction definition rules.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@459 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/disass/area.c116
-rw-r--r--src/analysis/disass/fetch.c17
2 files changed, 114 insertions, 19 deletions
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 8c46eb0..7e3a9a8 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -28,8 +28,6 @@
-
-
/* Zone mémoire bien bornée */
typedef struct _mem_area
{
@@ -49,10 +47,6 @@ typedef struct _mem_area
} mem_area;
-
-
-
-
/* Initialise une aire de données à partir d'une adresse donnée. */
static void init_mem_area_from_addr(mem_area *, const vmpa2t *, phys_t);
@@ -381,6 +375,14 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
//printf(" [%p] CODE start @ %u (len=%u)\n", area, (unsigned int)diff, (unsigned int)alen);
+
+
+ printf(" START @ 0x%08x\n", (unsigned int)get_virt_addr(&pos));
+
+
+ bin_length = (get_phy_addr(get_mrange_addr(&area->range)) + alen);
+
+
for (i = diff; i < alen; i += diff)
{
//il y a eu un point d'entrée... -> STOP
@@ -418,6 +420,26 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, const
assert(!is_range_blank_in_mem_areas(list, count, &range));
+
+
+
+ printf(" --disass-- '%s' @ 0x%08x (break=%d)\n",
+ g_arch_instruction_get_keyword(instr, 0),
+ (unsigned int)get_virt_addr(&prev),
+ g_arch_instruction_is_return(instr));
+
+
+
+
+ if (g_arch_instruction_is_return(instr))
+ printf("BREAK @ 0x%08x\n", (unsigned int)get_virt_addr(&prev));
+
+ //continue;
+
+ /* Rupture du flot d'exécution ? */
+ if (g_arch_instruction_is_return(instr))
+ break;
+
}
@@ -485,8 +507,9 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
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) => 0x%08x <-> 0x%08x\n",
+ area, (unsigned int)get_phy_addr(&pos), (unsigned int)diff, (unsigned int)alen,
+ (unsigned int)get_virt_addr(&pos), (unsigned int)(get_virt_addr(&pos) + alen));
*/
for (i = diff; i < alen; i += diff)
@@ -496,7 +519,7 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
copy_vmpa(&prev, &pos);
instr = NULL;
-
+ /*
if (instr == NULL && (i + 4) <= alen)
{
init_mrange(&range, &pos, 4);
@@ -505,7 +528,7 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
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);
@@ -525,10 +548,29 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
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;
+ /**
+ * On rencontre ici un morceau déjà traité.
+ * On recherche donc la fin de cette partie à sauter, si elle existe.
+ */
+
+ //////////////
+ return;
+
+
+
+ for (i++; i < alen; i++)
+ {
+ advance_vmpa(&pos, 1);
+ init_mrange(&range, &pos, 1);
+
+ if (is_range_blank_in_mem_areas(list, count, &range))
+ break;
+
+ }
+
+ diff = 0;
+ continue;
+
}
}
@@ -551,6 +593,12 @@ static void load_data_from_mem_area(mem_area *area, mem_area *list, size_t count
assert(!is_range_blank_in_mem_areas(list, count, &range));
+
+
+ if (area->exec) break;
+
+
+
}
}
@@ -579,11 +627,14 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GL
phys_t i; /* Boucle de parcours */
vmpa2t start; /* Adresse de départ de combles*/
- /*
- printf(" === FILLING | 0x%08x (%u)...\n",
+ bool on = true;
+
+
+ printf(" === FILLING | 0x%08x // 0x%08x <-> 0x%08x...\n",
(unsigned int)get_phy_addr(get_mrange_addr(&area->range)),
- (unsigned int)get_phy_addr(get_mrange_addr(&area->range)));
- */
+ (unsigned int)get_virt_addr(get_mrange_addr(&area->range)),
+ (unsigned int)(get_virt_addr(get_mrange_addr(&area->range)) + get_mrange_length(&area->range)));
+
/* Les symboles se doivent d'être indépendants ! */
if (area->has_sym) return;
@@ -597,14 +648,29 @@ static void fill_mem_area(mem_area *area, mem_area *list, size_t count, const GL
copy_vmpa(&start, get_mrange_addr(&area->range));
advance_vmpa(&start, i);
- if (area->exec)
+ if (area->exec && get_virt_addr(&start) % 4 == 0)
+ {
load_code_from_mem_area(area, list, count, binary, ctx, &start, info);
+ if (!is_range_blank_in_mem_area(area, i, 1, NULL))
+ {
+ printf(" --filled-- @ 0x%08x\n", (unsigned int)get_virt_addr(&start));
+ on = false;
+ }
+ else
+ printf(" --fill failed-- @ 0x%08x\n", (unsigned int)get_virt_addr(&start));
+
+
+ }
+
if (is_range_blank_in_mem_area(area, i, 1, NULL))
load_data_from_mem_area(area, list, count, binary, ctx, &start, info);
}
+
+ else on = true;
+
if (is_range_blank_in_mem_area(area, i, 1, NULL))
printf(" [%p] error with %u\n", area, (unsigned int)i);
@@ -1134,6 +1200,18 @@ static bool handle_bytes_map_in_mem_area(mem_area *list, size_t count, const mra
else
{
+
+ printf("BUG_ON | off=%u remaining=%u length=%u\n",
+ (unsigned int)offset,
+ (unsigned int)remaining,
+ (unsigned int)get_mrange_length(&area->range));
+
+ printf("BUG_ON @ 0x%08x + %d\n",
+ (unsigned int)get_virt_addr(get_mrange_addr(range)),
+ (int)get_mrange_length(range)
+ );
+
+
assert(0);
/* Traitement de la fin de la première aire */
diff --git a/src/analysis/disass/fetch.c b/src/analysis/disass/fetch.c
index 2e9eb81..ffc653a 100644
--- a/src/analysis/disass/fetch.c
+++ b/src/analysis/disass/fetch.c
@@ -58,6 +58,8 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx
vmpa2t addr; /* Conversion en pleine adresse*/
mem_area *area; /* Zone de désassemblage */
+ printf("-- follow 0x%08x\n", (unsigned int)virt);
+
g_proc_context_push_drop_point(ctx, virt);
while (g_proc_context_has_drop_points(ctx))
@@ -65,10 +67,20 @@ static void follow_execution_flow(const GLoadedBinary *binary, GProcContext *ctx
virt = g_proc_context_pop_drop_point(ctx);
init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
+
+
+ printf(" ++ point 0x%08x\n", (unsigned int)virt);
+
+
area = find_memory_area_by_addr(areas, count, &addr);
load_code_from_mem_area(area, areas, count, binary, ctx, &addr, info);
+
+
+ printf(" ++\n");
+
+
}
}
@@ -128,6 +140,9 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt
virt = g_binary_format_get_entry_point(format);
+ follow_execution_flow(binary, ctx, areas, count, info, 0x84c5);
+ follow_execution_flow(binary, ctx, areas, count, info, 0x8a65);
+
follow_execution_flow(binary, ctx, areas, count, info, virt);
/* Symboles exécutables présents et passés à travers les mailles */
@@ -147,6 +162,8 @@ GArchInstruction *disassemble_binary_content(const GLoadedBinary *binary, GtkExt
}
+ printf(" ------------------------------------------- follow done\n");
+
done = get_current_progessive_status(info);
fini_progessive_status(info);