diff options
Diffstat (limited to 'src/format/exe_format.c')
-rw-r--r-- | src/format/exe_format.c | 94 |
1 files changed, 93 insertions, 1 deletions
diff --git a/src/format/exe_format.c b/src/format/exe_format.c index 7fcbcfb..1077cfe 100644 --- a/src/format/exe_format.c +++ b/src/format/exe_format.c @@ -32,6 +32,29 @@ + + +/* ------------------------ DETECTION DE FORMATS EXECUTABLES ------------------------ */ + + +/* Format d'exécutables enregistré */ +typedef struct _registered_exe_format +{ + const char *name; /* Désignation du format */ + + exe_match_fc match; /* Procédure de reconnaissance */ + exe_load_fc load; /* Fonction de chargement */ + +} registered_exe_format; + + +/* Liste des formats d'exécutables enregistrés */ +static registered_exe_format *exe_formats = NULL; +static size_t exe_formats_count = 0; + + + + /* ---------------------------------------------------------------------------------- */ /* MANIPULATION DES PARTIES DE CODE */ /* ---------------------------------------------------------------------------------- */ @@ -162,10 +185,79 @@ void delete_bin_part(bin_part *part) /* ---------------------------------------------------------------------------------- */ -/* MANIPULATION DES PARTIES DE CODE */ +/* DETECTION DE FORMATS EXECUTABLES */ /* ---------------------------------------------------------------------------------- */ +/****************************************************************************** +* * +* Paramètres : name = désignation humaine associée. * +* match = procédure de reconnaissance fournie. * +* load = fonction de chargement fournie. * +* * +* Description : Enregistre la disponibilité d'un nouveau format exécutable. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void register_exe_format(const char *name, exe_match_fc match, exe_load_fc load) +{ + exe_formats = (registered_exe_format *)realloc(exe_formats, + ++exe_formats_count * sizeof(registered_exe_format)); + + exe_formats[exe_formats_count - 1].name = name; + + exe_formats[exe_formats_count - 1].match = match; + exe_formats[exe_formats_count - 1].load = load; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à parcourir. * +* length = taille du contenu en question. * +* * +* Description : Charge si possible un nouvel exécutable binaire. * +* * +* Retour : Adresse du nouveau gestionnaire de format ou NULL si erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +exe_format *load_new_exe_format(const uint8_t *content, off_t length) +{ + exe_format *result; /* Adresse à retourner */ + size_t i; /* Boucle de parcours */ + + result = NULL; + + for (i = 0; i < exe_formats_count && result == NULL; i++) + if (exe_formats[i].match(content, length)) + { + printf("<LOGINFO> %s is matching...\n", exe_formats[i].name); + + result = exe_formats[i].load(content, length); + + } + + return result; + +} + + + + + + + +/* ---------------------------------------------------------------------------------- */ +/* MANIPULATION DES PARTIES DE CODE */ +/* ---------------------------------------------------------------------------------- */ |