From 2c70e3332b43bdcbe215081b697395d254418e48 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 28 Oct 2016 22:20:41 +0200 Subject: Cleaned the structure for instructions a little bit. --- ChangeLog | 23 ++++++++++++++++++++++ plugins/androhelpers/switch.c | 6 +++--- plugins/pychrysa/arch/instruction.c | 2 +- src/analysis/blocks/flow.c | 4 ++-- src/analysis/decomp/il.c | 6 ++++-- src/analysis/disass/dragon.c | 4 ++-- src/analysis/disass/links.c | 2 +- src/analysis/disass/loop.c | 2 +- src/analysis/disass/macro.c | 2 +- src/analysis/disass/rank.c | 4 ++-- src/arch/dalvik/instruction.c | 4 ++-- src/arch/instruction-int.h | 14 ++------------ src/arch/instruction.c | 38 ++++++++++++++----------------------- src/arch/instruction.h | 18 +++++------------- src/gtkext/graph/cluster.c | 4 ++-- src/gui/dialogs/gotox.c | 2 +- 16 files changed, 66 insertions(+), 69 deletions(-) diff --git a/ChangeLog b/ChangeLog index 169362f..f0a760a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,28 @@ 16-10-28 Cyrille Bagard + * plugins/androhelpers/switch.c: + * plugins/pychrysa/arch/instruction.c: + * src/analysis/blocks/flow.c: + * src/analysis/decomp/il.c: + * src/analysis/disass/dragon.c: + * src/analysis/disass/links.c: + * src/analysis/disass/loop.c: + * src/analysis/disass/macro.c: + * src/analysis/disass/rank.c: + * src/arch/dalvik/instruction.c: + Update code. + + * src/arch/instruction-int.h: + * src/arch/instruction.c: + * src/arch/instruction.h: + Clean the structure for instructions a little bit. + + * src/gtkext/graph/cluster.c: + * src/gui/dialogs/gotox.c: + Code. + +16-10-28 Cyrille Bagard + * src/arch/instruction-int.h: * src/arch/instruction.c: * src/arch/instruction.h: diff --git a/plugins/androhelpers/switch.c b/plugins/androhelpers/switch.c index 2434897..da91a50 100644 --- a/plugins/androhelpers/switch.c +++ b/plugins/androhelpers/switch.c @@ -169,7 +169,7 @@ static void link_all_switch_cases(GArchInstruction *instr, const dex_switch *dsw value = dswitch->sparse.keys[i]; imm = g_imm_operand_new_from_value(MDS_32_BITS_UNSIGNED, value); - g_arch_instruction_link_with(instr, next, ILT_CASE_JUMP, imm); + g_arch_instruction_link_with(instr, next, ILT_CASE_JUMP); ensure_each_case_has_its_block(next, instrs); } @@ -182,7 +182,7 @@ static void link_all_switch_cases(GArchInstruction *instr, const dex_switch *dsw if (next != NULL) { - g_arch_instruction_link_with(instr, next, ILT_CASE_JUMP, NULL); + g_arch_instruction_link_with(instr, next, ILT_CASE_JUMP); ensure_each_case_has_its_block(next, instrs); } @@ -222,7 +222,7 @@ static void ensure_each_case_has_its_block(GArchInstruction *instr, GArchInstruc && !g_arch_instruction_has_destinations(prev) && !(g_arch_instruction_get_flags(prev) & AIF_RETURN_POINT)) { - g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW, NULL); + g_arch_instruction_link_with(prev, instr, ILT_EXEC_FLOW); } } diff --git a/plugins/pychrysa/arch/instruction.c b/plugins/pychrysa/arch/instruction.c index 5e4c19d..ff3d2ad 100644 --- a/plugins/pychrysa/arch/instruction.c +++ b/plugins/pychrysa/arch/instruction.c @@ -159,7 +159,7 @@ static PyObject *py_arch_instruction_get_destinations(PyObject *self, PyObject * instr = G_ARCH_INSTRUCTION(pygobject_get(self)); - count = g_arch_instruction_get_destinations(instr, &dests, &types, NULL); + count = g_arch_instruction_get_destinations(instr, &dests, &types); result = PyTuple_New(count); diff --git a/src/analysis/blocks/flow.c b/src/analysis/blocks/flow.c index bc14648..970fc21 100644 --- a/src/analysis/blocks/flow.c +++ b/src/analysis/blocks/flow.c @@ -575,7 +575,7 @@ bool g_flow_block_is_looping_to(GFlowBlock *block, const GInstrBlock *list, GFlo result = (block == target); g_arch_instruction_rlock_dest(block->last); - dcount = g_arch_instruction_get_destinations(block->last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(block->last, &dests, &types); for (i = 0; i < dcount && !result; i++) switch (types[i]) @@ -638,7 +638,7 @@ bool g_flow_block_follow(GFlowBlock *block, const GInstrBlock *list, BlockFollow result = callback(block, BFP_ENTER, data); g_arch_instruction_rlock_dest(block->last); - dcount = g_arch_instruction_get_destinations(block->last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(block->last, &dests, &types); for (i = 0; i < dcount && result; i++) switch (types[i]) diff --git a/src/analysis/decomp/il.c b/src/analysis/decomp/il.c index 37110f2..36b5dfe 100644 --- a/src/analysis/decomp/il.c +++ b/src/analysis/decomp/il.c @@ -638,7 +638,7 @@ static void close_case_decomp_instructions(GDecInstruction *case_dinstr, GInstrB for (i = 0; i < lcount && is_common; i++) { g_flow_block_get_boundary(G_FLOW_BLOCK(leafs[i]), NULL, &last); - dcount = g_arch_instruction_get_destinations(last, &dests, NULL, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, NULL); for (j = 0; j < dcount && is_common; j++) { @@ -701,6 +701,8 @@ static void close_case_decomp_instructions(GDecInstruction *case_dinstr, GInstrB static void build_switch_branches(GSwitchInstruction *decomp, GFlowBlock *block, GDecContext *ctx) { +#if 0 + GArchInstruction *last; /* Dernière instruction du lot */ GInstrBlock *sub_parent; /* Groupe des sous-branches */ GHashTable *sub_shared; /* Allocations communes */ @@ -752,5 +754,5 @@ static void build_switch_branches(GSwitchInstruction *decomp, GFlowBlock *block, } g_hash_table_unref(sub_shared); - +#endif } diff --git a/src/analysis/disass/dragon.c b/src/analysis/disass/dragon.c index 58c293e..c817727 100644 --- a/src/analysis/disass/dragon.c +++ b/src/analysis/disass/dragon.c @@ -209,7 +209,7 @@ static dragon_node *create_dragon_nodes(const GArchProcessor *proc, const instr_ /* Analyse des destinations */ g_arch_instruction_rlock_dest(iter); - dcount = g_arch_instruction_get_destinations(iter, NULL, &types, NULL); + dcount = g_arch_instruction_get_destinations(iter, NULL, &types); cut = false; @@ -439,7 +439,7 @@ void compute_all_paths(dragon_node *nodes, size_t count) size_t id; /* Indice du bit associé */ g_arch_instruction_rlock_dest(node->last); - dcount = g_arch_instruction_get_destinations(node->last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(node->last, &dests, &types); for (i = 0; i < dcount; i++) switch (types[i]) diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index 0ce107a..294274f 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -85,7 +85,7 @@ void establish_natural_link(GArchInstruction *instr, GArchInstruction *prev) */ g_arch_instruction_rlock_dest(prev); - count = g_arch_instruction_get_destinations(prev, &others, &types, NULL); + count = g_arch_instruction_get_destinations(prev, &others, &types); for (i = 0; i < count; i++) { diff --git a/src/analysis/disass/loop.c b/src/analysis/disass/loop.c index 01fca07..99121a8 100644 --- a/src/analysis/disass/loop.c +++ b/src/analysis/disass/loop.c @@ -65,7 +65,7 @@ static void detect_back_edges(dragon_node *nodes, size_t count) get_dragon_node_bounding_instructions(node, NULL, &last); g_arch_instruction_wlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount; i++) switch (types[i]) diff --git a/src/analysis/disass/macro.c b/src/analysis/disass/macro.c index 6ac1fb2..4c4ba66 100644 --- a/src/analysis/disass/macro.c +++ b/src/analysis/disass/macro.c @@ -228,7 +228,7 @@ static GInstrBlock *build_instruction_blocks(GArchProcessor *proc, const dragon_ others = NULL; g_arch_instruction_rlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount && others == NULL; i++) switch (types[i]) diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c index 7504231..3721ca0 100644 --- a/src/analysis/disass/rank.c +++ b/src/analysis/disass/rank.c @@ -79,7 +79,7 @@ static bool rank_flow_block(GFlowBlock *block, BlockVisitOrder order, const GIns g_flow_block_get_boundary(block, NULL, &last); g_arch_instruction_rlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount; i++) { @@ -317,7 +317,7 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block) g_basic_block_get_boundary(block, NULL, &last); g_arch_instruction_rlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount; i++) { diff --git a/src/arch/dalvik/instruction.c b/src/arch/dalvik/instruction.c index 6e95147..3735bd7 100644 --- a/src/arch/dalvik/instruction.c +++ b/src/arch/dalvik/instruction.c @@ -393,8 +393,8 @@ static void g_dalvik_instruction_init(GDalvikInstruction *instr) parent = G_ARCH_INSTRUCTION(instr); - parent->get_rw_regs = (get_instruction_rw_regs_fc)g_dalvik_instruction_get_rw_registers; - parent->decomp = (decomp_instr_fc)dalvik_instruction_decompile; + //parent->get_rw_regs = (get_instruction_rw_regs_fc)g_dalvik_instruction_get_rw_registers; + //parent->decomp = (decomp_instr_fc)dalvik_instruction_decompile; } diff --git a/src/arch/instruction-int.h b/src/arch/instruction-int.h index 8eb6b68..c393b5f 100644 --- a/src/arch/instruction-int.h +++ b/src/arch/instruction-int.h @@ -67,15 +67,6 @@ struct _GArchInstruction mrange_t range; /* Emplacement en mémoire */ - /* ------- %< ----------- */ - - vmpa2t address2; /* Position associée */ - off_t offset; /* Position physique de départ */ - //off_t length; /* Taille de l'instruction */ - - vmpa_t address; /* Position associée */ - - /* ------- %< ----------- */ GArchOperand **operands; /* Liste des opérandes */ size_t operands_count; /* Nbre. d'opérandes utilisées */ @@ -89,18 +80,17 @@ struct _GArchInstruction GArchInstruction **to; /* Eventuelles lignes visées */ InstructionLinkType *to_types; /* Type des liens de dest. */ - link_extra_info *links_info; /* Informations complémentaires*/ size_t to_count; /* Nombre de ces destinations */ GRWLock to_access; /* Verrou de protection */ #ifndef NDEBUG gint hold_to_access; /* Suivi des verrouillages */ #endif - get_instruction_rw_regs_fc get_rw_regs; /* Liste des registres liés */ + //get_instruction_rw_regs_fc get_rw_regs; /* Liste des registres liés */ //print_instruction_fc print; /* Imprime l'ensemble */ //get_instruction_keyword_fc get_key; /* Texte humain équivalent */ //is_instruction_return_fc is_return; /* Retour de fonction ou pas ? */ - decomp_instr_fc decomp; /* Procédure de décompilation */ + //decomp_instr_fc decomp; /* Procédure de décompilation */ }; diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 4c0fdb9..fa631ac 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -372,10 +372,10 @@ const mrange_t *g_arch_instruction_get_range(const GArchInstruction *instr) void g_arch_instruction_get_location(const GArchInstruction *instr, off_t *offset, off_t *length, vmpa_t *address) { - if (offset != NULL) *offset = instr->offset; + //if (offset != NULL) *offset = instr->offset; //if (length != NULL) *length = instr->length; - if (address != NULL) *address = instr->address; + //if (address != NULL) *address = instr->address; } @@ -529,6 +529,8 @@ void g_arch_instruction_detach_operand(GArchInstruction *instr, GArchOperand *op void g_arch_instruction_get_rw_registers(const GArchInstruction *instr, GArchRegister ***rregs, size_t *rcount, GArchRegister ***wregs, size_t *wcount) { +#if 0 + size_t i; /* Boucle de parcours */ *rregs = NULL; @@ -544,6 +546,8 @@ void g_arch_instruction_get_rw_registers(const GArchInstruction *instr, GArchReg for (i = 0; i < *wcount; i++) g_object_ref(G_OBJECT((*wregs)[i])); +#endif + } @@ -568,10 +572,9 @@ void g_arch_instruction_get_rw_registers(const GArchInstruction *instr, GArchReg * * ******************************************************************************/ -void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType type, ...) +void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *dest, InstructionLinkType type) { size_t count; /* Raccourci pour la lecture */ - va_list ap; /* Gestion des variations */ /* Côté destination */ @@ -599,25 +602,10 @@ void g_arch_instruction_link_with(GArchInstruction *instr, GArchInstruction *des count * sizeof(GArchInstruction *)); instr->to_types = (InstructionLinkType *)realloc(instr->to_types, count * sizeof(InstructionLinkType)); - instr->links_info = (link_extra_info *)realloc(instr->links_info, - count * sizeof(link_extra_info)); instr->to[count - 1] = dest; instr->to_types[count - 1] = type; - va_start(ap, type); - - switch (type) - { - case ILT_CASE_JUMP: - instr->links_info[count - 1].imm = va_arg(ap, GImmOperand *); - break; - default: - break; - } - - va_end(ap); - g_arch_instruction_wunlock_dest(instr); } @@ -854,7 +842,6 @@ bool g_arch_instruction_has_destinations(const GArchInstruction *instr) * Paramètres : instr = instruction dont les informations sont à consulter. * * dests = liste des instructions de destination. [OUT] * * types = liste des types de liens présents. [OUT] * -* info = éventuelles informations complémentaires. [OUT] * * * * Description : Fournit les destinations d'une instruction donnée. * * * @@ -864,7 +851,7 @@ bool g_arch_instruction_has_destinations(const GArchInstruction *instr) * * ******************************************************************************/ -size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchInstruction ***dests, InstructionLinkType **types, link_extra_info **info) +size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchInstruction ***dests, InstructionLinkType **types) { assert(g_atomic_int_get(&instr->hold_to_access) > 0); @@ -874,9 +861,6 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchI if (types != NULL) *types = instr->to_types; - if (info != NULL) - *info = instr->links_info; - return instr->to_count; } @@ -1114,6 +1098,8 @@ GBufferLine *g_arch_instruction_print(const GArchInstruction *instr, GCodeBuffer GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *instr, GDecContext *ctx) { +#if 0 + GDecInstruction *result; /* Instruction à retourner */ GDecInstruction *list; /* Instructions décompilées */ @@ -1139,6 +1125,10 @@ GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *instr, GDe return result; +#endif + + return NULL; + } diff --git a/src/arch/instruction.h b/src/arch/instruction.h index 93dfa52..00e64ab 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -131,7 +131,7 @@ const mrange_t *g_arch_instruction_get_range(const GArchInstruction *); /* Fournit la localisation d'une instruction. */ -void g_arch_instruction_get_location(const GArchInstruction *, off_t *, off_t *, vmpa_t *); +void g_arch_instruction_get_location(const GArchInstruction *, off_t *, off_t *, vmpa_t *) __attribute__ ((deprecated)); @@ -151,7 +151,7 @@ void g_arch_instruction_replace_operand(GArchInstruction *, GArchOperand *, cons void g_arch_instruction_detach_operand(GArchInstruction *, GArchOperand *); /* Liste les registres lus et écrits par l'instruction. */ -void g_arch_instruction_get_rw_registers(const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *); +void g_arch_instruction_get_rw_registers(const GArchInstruction *, GArchRegister ***, size_t *, GArchRegister ***, size_t *) __attribute__ ((deprecated)); @@ -174,17 +174,9 @@ typedef enum _InstructionLinkType } InstructionLinkType; -/* Informations complémentaires pour un lien */ -typedef union _link_extra_info -{ - GImmOperand *imm; /* Valeur d'un cas de switch() */ - GDataType *type; /* Type d'une exception */ - -} link_extra_info; - /* Etablit un lien entre deux instructions. */ -void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType, ...); +void g_arch_instruction_link_with(GArchInstruction *, GArchInstruction *, InstructionLinkType); /* Change la nature d'un lien entre deux instructions. */ bool g_arch_instruction_change_link(GArchInstruction *, GArchInstruction *, InstructionLinkType, InstructionLinkType); @@ -217,7 +209,7 @@ void g_arch_instruction_lock_unlock_destinations(GArchInstruction *, bool, bool) bool g_arch_instruction_has_destinations(const GArchInstruction *); /* Fournit les destinations d'une instruction donnée. */ -size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstruction ***, InstructionLinkType **, link_extra_info **); +size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstruction ***, InstructionLinkType **); /* Fournit la destination d'une instruction et d'un type donné. */ GArchInstruction *g_arch_instruction_get_given_destination(const GArchInstruction *, InstructionLinkType); @@ -243,7 +235,7 @@ void g_arch_instruction_set_displayed_max_length(GArchInstruction *, phys_t); GBufferLine *g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const GBinContent *, AsmSyntax); /* Décompile une instruction de façon générique. */ -GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecContext *); +GDecInstruction *g_arch_instruction_decompile(const GArchInstruction *, GDecContext *) __attribute__ ((deprecated)); diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c index 3e18f5f..2f6feda 100644 --- a/src/gtkext/graph/cluster.c +++ b/src/gtkext/graph/cluster.c @@ -922,7 +922,7 @@ static void g_graph_cluster_define_links(GGraphCluster *cluster, GHashTable *all g_basic_block_get_boundary(cluster->block, NULL, &last); g_arch_instruction_rlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount; i++) switch (types[i]) @@ -1536,7 +1536,7 @@ static GGraphCluster *setup_graph_clusters(GLoadedBinary *binary, const GBlockLi /* Détermination des blocs suivants */ g_arch_instruction_rlock_dest(last); - dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + dcount = g_arch_instruction_get_destinations(last, &dests, &types); for (i = 0; i < dcount; i++) switch (types[i]) diff --git a/src/gui/dialogs/gotox.c b/src/gui/dialogs/gotox.c index 0511be8..fe18e4e 100644 --- a/src/gui/dialogs/gotox.c +++ b/src/gui/dialogs/gotox.c @@ -297,7 +297,7 @@ GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBi else { g_arch_instruction_rlock_dest(instr); - count = g_arch_instruction_get_destinations(instr, &list, NULL, NULL); + count = g_arch_instruction_get_destinations(instr, &list, NULL); } for (i = 0; i < count; i++) -- cgit v0.11.2-87-g4458