summaryrefslogtreecommitdiff
path: root/src/analysis/disass/disassembler.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-10-14 16:24:34 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-10-14 16:24:34 (GMT)
commit722539ffc6005c6cd9c8ebd37f93999014ae6d24 (patch)
tree5f78dce6057f904d689c9ff073cc69f33d057abf /src/analysis/disass/disassembler.c
parent8dff3daac4d2dc98b90adaecea834fb65db4fb10 (diff)
Handled Dalvik simple switch cases without fallthrough.
Diffstat (limited to 'src/analysis/disass/disassembler.c')
-rw-r--r--src/analysis/disass/disassembler.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/analysis/disass/disassembler.c b/src/analysis/disass/disassembler.c
index 2cfa6a5..364348a 100644
--- a/src/analysis/disass/disassembler.c
+++ b/src/analysis/disass/disassembler.c
@@ -79,7 +79,7 @@ static void g_delayed_disassembly_init(GDelayedDisassembly *);
static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *, GArchInstruction **, GCodeBuffer *);
/* Opère sur toutes les instructions. */
-static void process_all_instructions(wgroup_id_t, GtkStatusStack *, const char *, ins_fallback_cb, GArchProcessor *, GExeFormat *);
+static void process_all_instructions(wgroup_id_t, GtkStatusStack *, const char *, ins_fallback_cb, GArchProcessor *, GProcContext *, GExeFormat *);
/* Opère sur toutes les routines. */
static void process_all_routines(wgroup_id_t, GtkStatusStack *, const char *, rtn_fallback_cb, GArchProcessor *, GExeFormat *);
@@ -182,10 +182,11 @@ static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *binary, GAr
/******************************************************************************
* *
* Paramètres : gid = groupe de travail impliqué. *
- status = barre de statut à tenir informée. *
+* status = barre de statut à tenir informée. *
* msg = message à faire paraître pour la patience. *
* fallback = routine de traitements particuliers. *
* proc = ensemble d'instructions désassemblées. *
+* ctx = contexte fourni pour suivre le désassemblage. *
* format = accès aux données du binaire d'origine. *
* *
* Description : Opère sur toutes les instructions. *
@@ -196,7 +197,7 @@ static GDelayedDisassembly *g_delayed_disassembly_new(GLoadedBinary *binary, GAr
* *
******************************************************************************/
-static void process_all_instructions(wgroup_id_t gid, GtkStatusStack *status, const char *msg, ins_fallback_cb fallback, GArchProcessor *proc, GExeFormat *format)
+static void process_all_instructions(wgroup_id_t gid, GtkStatusStack *status, const char *msg, ins_fallback_cb fallback, GArchProcessor *proc, GProcContext *ctx, GExeFormat *format)
{
guint runs_count; /* Qté d'exécutions parallèles */
size_t ins_count; /* Quantité d'instructions */
@@ -227,7 +228,7 @@ static void process_all_instructions(wgroup_id_t gid, GtkStatusStack *status, co
else
end = begin + run_size;
- study = g_instructions_study_new(proc, G_BIN_FORMAT(format), begin, end, id, fallback);
+ study = g_instructions_study_new(proc, ctx, G_BIN_FORMAT(format), begin, end, id, fallback);
g_work_queue_schedule_work(queue, G_DELAYED_WORK(study), gid);
@@ -329,24 +330,26 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
//GBinFormat *format; /* Format du fichier binaire */
GArchProcessor *proc; /* Architecture du binaire */
-
+ GProcContext *ctx; /* Contexte de suivi dédié */
//size_t i; /* Boucle de parcours */
+ _curbin = disass->binary;
+ //format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
+ proc = g_loaded_binary_get_processor(disass->binary);
+ ctx = g_arch_processor_get_context(proc);
- gid = g_work_queue_define_work_group(get_work_queue());
+ gid = g_work_queue_define_work_group(get_work_queue());
- //format = G_BIN_FORMAT(g_loaded_binary_get_format(binary));
- proc = g_loaded_binary_get_processor(disass->binary);
@@ -361,7 +364,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
- *disass->instrs = disassemble_binary_content(disass->binary, gid, status);
+ *disass->instrs = disassemble_binary_content(disass->binary, ctx, gid, status);
g_arch_processor_set_disassembled_instructions(proc, *disass->instrs);
@@ -374,7 +377,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
process_all_instructions(gid, status, _("Calling 'link' hook on all instructions..."),
g_instructions_study_do_link_operation,
- proc, disass->format);
+ proc, ctx, disass->format);
// plugins //////////////////////////
@@ -390,7 +393,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
process_all_instructions(gid, status, _("Calling 'post' hook on all instructions..."),
g_instructions_study_do_post_operation,
- proc, disass->format);
+ proc, ctx, disass->format);
@@ -426,7 +429,7 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
process_all_instructions(gid, status, _("Establishing links betweek all instructions..."),
g_instructions_study_establish_links,
- proc, disass->format);
+ proc, ctx, disass->format);
@@ -515,16 +518,29 @@ static void g_delayed_disassembly_process(GDelayedDisassembly *disass, GtkStatus
- proc = g_loaded_binary_get_processor(disass->binary);
print_disassembled_instructions(disass->buffer, disass->format, proc, status);
- g_object_unref(G_OBJECT(proc));
+ /* Rajout de tous les éléments mis en place automatiquement */
+
+ void add_to_collection(GDbItem *item, GLoadedBinary *binary)
+ {
+ g_object_ref(G_OBJECT(item));
+ g_loaded_binary_add_to_collection(binary, item);
+
+ }
+ g_proc_context_foreach_db_item(ctx, (GFunc)add_to_collection, disass->binary);
+
+ /* Nettoyage final et sortie ! */
+
+ g_object_unref(G_OBJECT(ctx));
+
+ g_object_unref(G_OBJECT(proc));
process_disassembly_event(PGA_DISASSEMBLY_ENDED, disass->binary);