diff options
Diffstat (limited to 'src/analysis/disass/rank.c')
-rw-r--r-- | src/analysis/disass/rank.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c index 85d9e66..3694d04 100644 --- a/src/analysis/disass/rank.c +++ b/src/analysis/disass/rank.c @@ -24,6 +24,10 @@ #include "rank.h" + + +#if 0 + #include <assert.h> #include <sys/param.h> @@ -263,3 +267,127 @@ void rank_routine_blocks(GBinRoutine *routine) } + + + +#endif + + + + + + + +#include <assert.h> + + + +/* Classe les blocs basiques d'une routine. */ +void rank_routine_block(const GBlockList *, GBasicBlock *); + + + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de blocs basiques à traiter. * +* block = bloc d'analyse courant. * +* * +* Description : Classe les blocs basiques d'une routine. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void rank_routine_block(const GBlockList *list, GBasicBlock *block) +{ + unsigned int next; /* Rang suivant obtenu */ + GArchInstruction *last; /* Dernière instruction du bloc*/ + GArchInstruction **dests; /* Instr. visée par une autre */ + InstructionLinkType *types; /* Type de lien entre lignes */ + size_t dcount; /* Nombre de liens de dest. */ + size_t i; /* Boucle de parcours */ + GBasicBlock *target; /* Bloc ciblé par un lien */ + unsigned int rank; /* Rang à constituer */ + + next = g_basic_block_get_rank(block) + 1; + + g_basic_block_get_boundary(block, NULL, &last); + + g_arch_instruction_rlock_dest(last); + dcount = g_arch_instruction_get_destinations(last, &dests, &types, NULL); + + for (i = 0; i < dcount; i++) + { + /* La boucle de remontée n'abaisse pas les rangs */ + if (types[i] == ILT_LOOP) continue; + + target = g_block_list_find_by_starting_instr(list, dests[i]); + + /** + * Les sauts ne se font pas toujours à l'intérieur d'une même fonction. + * Par exemple sous ARM : + * + * 00008358 <call_gmon_start>: + * .... + * 8362: f7ff bfcf b.w 8304 <_init+0x38> + * .... + * + */ + + if (target != NULL) + { + rank = g_basic_block_get_rank(target); + + if (next > rank) + { + g_basic_block_set_rank(target, rank); + + rank_routine_block(list, target); + + } + + } + + } + + g_arch_instruction_runlock_dest(last); + +} + + +/****************************************************************************** +* * +* Paramètres : routine = routine regroupant les blocs à traiter. * +* * +* Description : Classe les blocs des routines. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void rank_routine_blocks(GBinRoutine *routine) +{ + GBlockList *blocks; /* Ensemble des blocs d'instr. */ + GBasicBlock *start; /* Bloc basique de départ */ + + blocks = g_binary_routine_get_basic_blocks(routine); + + start = g_block_list_get_block(blocks, 0 /* FIXME */); + assert(start != NULL); + + + + + rank_routine_block(blocks, start); + + + + + + +} |