diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-12-21 00:51:14 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-12-21 00:51:14 (GMT) |
commit | dbec8e8af5f296f0b95cd9c07e7d96b1a4277137 (patch) | |
tree | 4c5a9307bc4f0c168911e86459de5a51baaac226 /src/analysis/disass/output.c | |
parent | 56deaf395c65658102ef0111cfc072d65335331a (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.c | 39 |
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)); } |