diff options
Diffstat (limited to 'src/analysis/scan/patterns/tokens/hex.c')
-rw-r--r-- | src/analysis/scan/patterns/tokens/hex.c | 210 |
1 files changed, 6 insertions, 204 deletions
diff --git a/src/analysis/scan/patterns/tokens/hex.c b/src/analysis/scan/patterns/tokens/hex.c index c1cdbdf..1fda597 100644 --- a/src/analysis/scan/patterns/tokens/hex.c +++ b/src/analysis/scan/patterns/tokens/hex.c @@ -58,12 +58,6 @@ static void g_scan_hex_bytes_output_to_text(const GScanHexBytes *, GScanContext /* Affiche un motif de recherche au format JSON. */ static void g_scan_hex_bytes_output_to_json(const GScanHexBytes *, GScanContext *, const sized_string_t *, unsigned int, int); -/* Inscrit la définition d'un motif dans un moteur de recherche. */ -//static bool g_scan_hex_bytes_enroll(GScanHexBytes *, GScanContext *, GEngineBackend *, size_t); - -/* Transforme les correspondances locales en trouvailles. */ -//static void g_scan_hex_bytes_check(const GScanHexBytes *, GScanContext *, GBinContent *, pending_matches_t *); - /* ---------------------------------------------------------------------------------- */ @@ -91,7 +85,6 @@ static void g_scan_hex_bytes_class_init(GScanHexBytesClass *klass) { GObjectClass *object; /* Autre version de la classe */ GSearchPatternClass *pattern; /* Version de classe ancêtre */ - GStringTokenClass *token; /* Version de classe parente */ object = G_OBJECT_CLASS(klass); @@ -103,11 +96,6 @@ static void g_scan_hex_bytes_class_init(GScanHexBytesClass *klass) pattern->to_text = (output_pattern_to_text_fc)g_scan_hex_bytes_output_to_text; pattern->to_json = (output_pattern_to_json_fc)g_scan_hex_bytes_output_to_json; - token = G_STRING_TOKEN_CLASS(klass); - - //token->enroll = (enroll_token_fc)g_scan_hex_bytes_enroll; - //token->check = (check_token_fc)g_scan_hex_bytes_check; - } @@ -170,6 +158,7 @@ static void g_scan_hex_bytes_finalize(GScanHexBytes *bytes) /****************************************************************************** * * * Paramètres : root = représentation du motif à recherche. * +* private = donne une vocation privée au motif de recherche. * * * * Description : Construit un gestionnaire de recherche de texte brut. * * * @@ -179,13 +168,13 @@ static void g_scan_hex_bytes_finalize(GScanHexBytes *bytes) * * ******************************************************************************/ -GSearchPattern *g_scan_hex_bytes_new(GScanTokenNode *root) +GSearchPattern *g_scan_hex_bytes_new(GScanTokenNode *root, bool private) { GSearchPattern *result; /* Structure à retourner */ result = g_object_new(G_TYPE_SCAN_HEX_BYTES, NULL); - if (!g_scan_hex_bytes_create(G_SCAN_HEX_BYTES(result), root)) + if (!g_scan_hex_bytes_create(G_SCAN_HEX_BYTES(result), root, private)) g_clear_object(&result); return result; @@ -197,6 +186,7 @@ GSearchPattern *g_scan_hex_bytes_new(GScanTokenNode *root) * * * Paramètres : bytes = encadrement de motif à initialiser pleinement. * * root = représentation du motif à recherche. * +* private = donne une vocation privée au motif de recherche. * * * * Description : Met en place un gestionnaire de recherche de binaire. * * * @@ -206,11 +196,11 @@ GSearchPattern *g_scan_hex_bytes_new(GScanTokenNode *root) * * ******************************************************************************/ -bool g_scan_hex_bytes_create(GScanHexBytes *bytes, GScanTokenNode *root) +bool g_scan_hex_bytes_create(GScanHexBytes *bytes, GScanTokenNode *root, bool private) { bool result; /* Bilan à retourner */ - result = g_string_token_create(G_STRING_TOKEN(bytes), root); + result = g_string_token_create(G_STRING_TOKEN(bytes), root, false, private); return result; @@ -267,191 +257,3 @@ static void g_scan_hex_bytes_output_to_json(const GScanHexBytes *pattern, GScanC /* TODO */ } - -#if 0 - -/****************************************************************************** -* * -* Paramètres : bytes = définition de la bribe à enregistrer. * -* context = contexte de l'analyse à mener. * -* backend = moteur de recherche à préchauffer. * -* maxsize = taille max. des atomes (mise en commun optimisée). * -* * -* Description : Inscrit la définition d'un motif dans un moteur de recherche.* -* * -* Retour : Bilan de l'opération à renvoyer. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool g_scan_hex_bytes_enroll(GScanHexBytes *bytes, GScanContext *context, GEngineBackend *backend, size_t maxsize) -{ - bool result; /* Statut à retourner */ - size_t i; /* Boucle de parcours #1 */ - tracked_scan_atom_t atom; /* Atome identifié */ - size_t letters; /* Nombre de lettres présentes */ - size_t k; /* Boucle de parcours #2 */ - size_t extra_count; /* Quantité pour l'exhaustivité*/ - sized_binary_t *extra; /* Couverture supplémntaire */ - size_t remaining; /* Quantité restant à traiter */ - - /* Génération d'une base de chaînes à couvrir */ - - if (bytes->modifier == NULL) - { - bytes->raw = malloc(sizeof(sized_binary_t)); - bytes->count = 1; - - szstrdup(&bytes[0].raw[0], &bytes->orig); - - result = true; - - } - else - result = g_scan_token_modifier_transform(bytes->modifier, &bytes->orig, &bytes->raw, &bytes->count); - - if (!result) - goto exit; - - /* Préparation pour la mémorisation des atomes */ - - bytes->atoms = malloc(bytes->count * sizeof(tracked_scan_atom_t)); - - /* Recherche des atomes */ - - for (i = 0; i < bytes->count; i++) - { - if (bytes->flags & SPBF_CASE_INSENSITIVE) - { - find_best_atom(&bytes->raw[i], maxsize, &atom, &letters); - - if (letters == 0) - bytes->atoms[i] = atom; - - /* Insertion des combinaisons pour couvrir toutes les casses */ - else - { - for (k = 0, extra_count = 1; k < letters; k++, extra_count *= 2) - ; - - extra = make_atoms_case_insensitive(&bytes->raw[i], extra_count); - - remaining = bytes->count - i - 1; - - bytes->count += (extra_count - 1); - - bytes->raw = realloc(bytes->raw, bytes->count * sizeof(sized_binary_t)); - - memmove(&bytes->raw[i + extra_count], &bytes->raw[i + 1], remaining * sizeof(sized_binary_t)); - - for (k = 0; k < extra_count; k++) - bytes->raw[i + k] = extra[k]; - - free(extra); - - bytes->atoms = realloc(bytes->raw, bytes->count * sizeof(tracked_scan_atom_t)); - - for (k = 0; k < extra_count; k++) - bytes->atoms[i + k] = atom; - - i += extra_count - 1; - - } - - } - - else - find_best_atom(&bytes->raw[i], maxsize, &bytes->atoms[i], &letters); - - } - - /* Enregistrements en masse */ - - - for (i = 0; i < bytes->count && result; i++) - result = enroll_prepared_atom(&bytes->raw[i], context, backend, &bytes->atoms[i]); - - exit: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : bytes = définition de la bribe à manipuler. * -* context = contexte de l'analyse à mener. * -* content = accès au contenu brut pour vérifications (optim.) * -* matches = suivi des correspondances à consolider. * -* * -* Description : Transforme les correspondances locales en trouvailles. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_scan_hex_bytes_check(const GScanHexBytes *bytes, GScanContext *context, GBinContent *content, pending_matches_t *matches) -{ - size_t i; /* Boucle de parcours #1 */ - const sized_binary_t *raw; /* Données brutes d'origine */ - const tracked_scan_atom_t *atom; /* Atome correspondant */ - size_t count; /* Quantité de bribes trouvées */ - const phys_t *found; /* Localisations des bribes */ - size_t k; /* Boucle de parcours #2 */ - phys_t start; /* Point de départ */ - vmpa2t pos; /* Position dans les données */ - const bin_t *ptr; /* Accès aux données brutes */ - int ret; /* Bilan d'une comparaison */ - - for (i = 0; i < bytes->count; i++) - { - raw = &bytes->raw[i]; - atom = &bytes->atoms[i]; - - found = g_scan_context_get_atom_matches(context, atom->pid, &count); - - for (k = 0; k < count; k++) - { - start = found[k] - atom->pos; - - init_vmpa(&pos, start, VMPA_NO_VIRTUAL); - - /* Validation du contenu avant l'atome */ - - if (atom->pos > 0) - { - ptr = g_binary_content_get_raw_access(content, &pos, atom->pos); - - ret = memcmp(raw->data, ptr, atom->pos); - if (ret != 0) continue; - - } - - /* Validation du contenu après l'atome */ - - if (atom->rem > 0) - { - advance_vmpa(&pos, atom->len); - - ptr = g_binary_content_get_raw_access(content, &pos, atom->rem); - - ret = memcmp(raw->data + atom->pos + atom->len, ptr, atom->rem); - if (ret != 0) continue; - - } - - /* Mémorisation de la correspondance */ - - add_pending_matches(matches, start, raw->len); - - } - - } - -} - -#endif |