summaryrefslogtreecommitdiff
path: root/src/analysis/disass/output.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-12-21 00:51:14 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-12-21 00:51:14 (GMT)
commitdbec8e8af5f296f0b95cd9c07e7d96b1a4277137 (patch)
tree4c5a9307bc4f0c168911e86459de5a51baaac226 /src/analysis/disass/output.c
parent56deaf395c65658102ef0111cfc072d65335331a (diff)
Redefined all existing kinds of Dalvik operands in a proper way.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@203 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/disass/output.c')
-rw-r--r--src/analysis/disass/output.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c
index 9c4ba2f..0209a97 100644
--- a/src/analysis/disass/output.c
+++ b/src/analysis/disass/output.c
@@ -24,7 +24,9 @@
#include "output.h"
+#include "../../arch/processor.h"
#include "../../decomp/lang/asm.h"
+#include "../../format/format.h"
@@ -43,17 +45,44 @@
* *
******************************************************************************/
-void print_disassembled_instructions(GCodeBuffer *buffer, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count)
+void print_disassembled_instructions(GCodeBuffer *buffer, const GExeFormat *format, const GArchInstruction *instrs, const GBinRoutine **routines, size_t count)
{
+ GLangOutput *output; /* Modèle de sortie adéquat */
+ GArchProcessor *proc; /* Architecture du binaire */
+ MemoryDataSize msize; /* Taille du bus d'adresses */
+ const bin_t *content; /* Contenu binaire global */
+ const GArchInstruction *iter; /* Boucle de parcours #1 */
+ size_t i; /* Boucle de parcours #2 */
+ vmpa_t iaddr; /* Adresse d'instruction */
+ vmpa_t raddr; /* Adresse de routine */
- /*
- for (iter = disass->instrs;
+ output = g_asm_output_new();
+
+ proc = get_arch_processor_from_format(format);
+ msize = g_arch_processor_get_memory_size(proc);
+
+ content = g_binary_format_get_content(G_BIN_FORMAT(format), NULL);
+
+ for (iter = instrs, i = 0;
iter != NULL;
- iter = g_arch_instruction_get_next_iter(disass->instrs, iter, VMPA_MAX))
+ iter = g_arch_instruction_get_next_iter(instrs, iter, VMPA_MAX))
{
+ /* Ajout des prototypes de fonction */
+ for (; i < count; i++)
+ {
+ g_arch_instruction_get_location(iter, NULL, NULL, &iaddr);
+ raddr = g_binary_routine_get_address(routines[i]);
+
+ if (raddr > iaddr) break;
+ g_binary_routine_print_code(routines[i], output, buffer, false);
+
+ }
+
+ g_arch_instruction_print(iter, buffer, msize, content, ASX_INTEL);
}
- */
+
+ g_object_unref(G_OBJECT(output));
}