diff options
Diffstat (limited to 'src/analysis/scan/patterns')
| -rw-r--r-- | src/analysis/scan/patterns/modifier-int.h | 4 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifier.c | 27 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifier.h | 3 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifiers/hex.c | 35 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifiers/list.c | 32 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifiers/plain.c | 35 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifiers/rev.c | 35 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/modifiers/xor.c | 43 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/token.c | 28 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/token.h | 3 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/tokens/nodes/plain.c | 42 | ||||
| -rw-r--r-- | src/analysis/scan/patterns/tokens/nodes/plain.h | 3 | 
12 files changed, 289 insertions, 1 deletions
| diff --git a/src/analysis/scan/patterns/modifier-int.h b/src/analysis/scan/patterns/modifier-int.h index e1de2d8..c9b3a36 100644 --- a/src/analysis/scan/patterns/modifier-int.h +++ b/src/analysis/scan/patterns/modifier-int.h @@ -41,6 +41,9 @@ typedef bool (* can_token_modifier_handle_arg) (const GScanTokenModifier *, cons  /* Transforme une séquence d'octets pour motif de recherche. */  typedef bool (* transform_scan_token_with_fc) (const GScanTokenModifier *, const sized_binary_t *, size_t, const modifier_arg_t *, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +typedef char * (* get_modifier_path) (const GScanTokenModifier *, size_t *); +  /* Transformation d'une séquence d'octets en une ou plusieurs autres formes (instance) */  struct _GScanTokenModifier @@ -59,6 +62,7 @@ struct _GScanTokenModifierClass      transform_scan_token_fc transform;      /* Opération de transformation */      can_token_modifier_handle_arg can_handle; /* Support d'argument donné  */      transform_scan_token_with_fc transform_with; /* Opération encadrée     */ +    get_modifier_path get_path;             /* Rappel d'une combinaison    */  }; diff --git a/src/analysis/scan/patterns/modifier.c b/src/analysis/scan/patterns/modifier.c index 65f671f..9efd404 100644 --- a/src/analysis/scan/patterns/modifier.c +++ b/src/analysis/scan/patterns/modifier.c @@ -249,3 +249,30 @@ bool g_scan_token_modifier_transform_with_arg(const GScanTokenModifier *modifier      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +char *g_scan_token_modifier_get_path(const GScanTokenModifier *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ +    GScanTokenModifierClass *class;         /* Classe à activer            */ + +    class = G_SCAN_TOKEN_MODIFIER_GET_CLASS(modifier); + +    result = class->get_path(modifier, index); + +    return result; + +} diff --git a/src/analysis/scan/patterns/modifier.h b/src/analysis/scan/patterns/modifier.h index ce2589a..9030a72 100644 --- a/src/analysis/scan/patterns/modifier.h +++ b/src/analysis/scan/patterns/modifier.h @@ -65,6 +65,9 @@ bool g_scan_token_modifier_can_handle_arg(const GScanTokenModifier *, const modi  /* Transforme une séquence d'octets pour motif de recherche. */  bool g_scan_token_modifier_transform_with_arg(const GScanTokenModifier *, const sized_binary_t *, size_t, const modifier_arg_t *, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +char *g_scan_token_modifier_get_path(const GScanTokenModifier *, size_t *); +  #endif  /* _ANALYSIS_SCAN_MODIFIER_H */ diff --git a/src/analysis/scan/patterns/modifiers/hex.c b/src/analysis/scan/patterns/modifiers/hex.c index 849d9ff..4a41c7d 100644 --- a/src/analysis/scan/patterns/modifiers/hex.c +++ b/src/analysis/scan/patterns/modifiers/hex.c @@ -58,6 +58,9 @@ static char *g_scan_hex_modifier_get_name(const GScanHexModifier *);  /* Transforme une séquence d'octets pour motif de recherche. */  static bool g_scan_hex_modifier_transform(const GScanHexModifier *, const sized_binary_t *, size_t, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +static char *g_scan_hex_modifier_get_path(const GScanHexModifier *, size_t *); +  /* ---------------------------------------------------------------------------------- */ @@ -96,6 +99,7 @@ static void g_scan_hex_modifier_class_init(GScanHexModifierClass *klass)      modifier->get_name = (get_scan_modifier_name_fc)g_scan_hex_modifier_get_name;      modifier->transform = (transform_scan_token_fc)g_scan_hex_modifier_transform; +    modifier->get_path = (get_modifier_path)g_scan_hex_modifier_get_path;  } @@ -259,3 +263,34 @@ static bool g_scan_hex_modifier_transform(const GScanHexModifier *modifier, cons      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *g_scan_hex_modifier_get_path(const GScanHexModifier *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ + +    if (*index > 0) +    { +        result = NULL; +        (*index)--; +    } + +    else +        result = strdup("hex"); + +    return result; + +} diff --git a/src/analysis/scan/patterns/modifiers/list.c b/src/analysis/scan/patterns/modifiers/list.c index 0390f47..040d2f8 100644 --- a/src/analysis/scan/patterns/modifiers/list.c +++ b/src/analysis/scan/patterns/modifiers/list.c @@ -58,6 +58,9 @@ static char *g_scan_modifier_list_get_name(const GScanModifierList *);  /* Transforme une séquence d'octets pour motif de recherche. */  static bool g_scan_modifier_list_transform(const GScanModifierList *, const sized_binary_t *, size_t, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +static char *g_scan_modifier_list_get_path(const GScanModifierList *, size_t *); +  /* ---------------------------------------------------------------------------------- */ @@ -96,6 +99,7 @@ static void g_scan_modifier_list_class_init(GScanModifierListClass *klass)      modifier->get_name = (get_scan_modifier_name_fc)g_scan_modifier_list_get_name;      modifier->transform = (transform_scan_token_fc)g_scan_modifier_list_transform; +    modifier->get_path = (get_modifier_path)g_scan_modifier_list_get_path;  } @@ -404,3 +408,31 @@ static bool g_scan_modifier_list_transform(const GScanModifierList *modifier, co      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *g_scan_modifier_list_get_path(const GScanModifierList *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ +    size_t i;                               /* Boucle de parcours #1       */ + +    result = NULL; + +    for (i = 0; i < modifier->count && result == NULL; i++) +        result = g_scan_token_modifier_get_path(modifier->modifiers[i], index); + +    return result; + +} diff --git a/src/analysis/scan/patterns/modifiers/plain.c b/src/analysis/scan/patterns/modifiers/plain.c index 9ed0d7b..ad09129 100644 --- a/src/analysis/scan/patterns/modifiers/plain.c +++ b/src/analysis/scan/patterns/modifiers/plain.c @@ -58,6 +58,9 @@ static char *g_scan_plain_modifier_get_name(const GScanPlainModifier *);  /* Transforme une séquence d'octets pour motif de recherche. */  static bool g_scan_plain_modifier_transform(const GScanPlainModifier *, const sized_binary_t *, size_t, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +static char *g_scan_plain_modifier_get_path(const GScanPlainModifier *, size_t *); +  /* ---------------------------------------------------------------------------------- */ @@ -96,6 +99,7 @@ static void g_scan_plain_modifier_class_init(GScanPlainModifierClass *klass)      modifier->get_name = (get_scan_modifier_name_fc)g_scan_plain_modifier_get_name;      modifier->transform = (transform_scan_token_fc)g_scan_plain_modifier_transform; +    modifier->get_path = (get_modifier_path)g_scan_plain_modifier_get_path;  } @@ -252,3 +256,34 @@ static bool g_scan_plain_modifier_transform(const GScanPlainModifier *modifier,      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *g_scan_plain_modifier_get_path(const GScanPlainModifier *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ + +    if (*index > 0) +    { +        result = NULL; +        (*index)--; +    } + +    else +        result = strdup("plain"); + +    return result; + +} diff --git a/src/analysis/scan/patterns/modifiers/rev.c b/src/analysis/scan/patterns/modifiers/rev.c index 9d74afe..ef4d5fa 100644 --- a/src/analysis/scan/patterns/modifiers/rev.c +++ b/src/analysis/scan/patterns/modifiers/rev.c @@ -58,6 +58,9 @@ static char *g_scan_reverse_modifier_get_name(const GScanReverseModifier *);  /* Transforme une séquence d'octets pour motif de recherche. */  static bool g_scan_reverse_modifier_transform(const GScanReverseModifier *, const sized_binary_t *, size_t, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +static char *g_scan_reverse_modifier_get_path(const GScanReverseModifier *, size_t *); +  /* ---------------------------------------------------------------------------------- */ @@ -96,6 +99,7 @@ static void g_scan_reverse_modifier_class_init(GScanReverseModifierClass *klass)      modifier->get_name = (get_scan_modifier_name_fc)g_scan_reverse_modifier_get_name;      modifier->transform = (transform_scan_token_fc)g_scan_reverse_modifier_transform; +    modifier->get_path = (get_modifier_path)g_scan_reverse_modifier_get_path;  } @@ -254,3 +258,34 @@ static bool g_scan_reverse_modifier_transform(const GScanReverseModifier *modifi      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *g_scan_reverse_modifier_get_path(const GScanReverseModifier *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ + +    if (*index > 0) +    { +        result = NULL; +        (*index)--; +    } + +    else +        result = strdup("rev"); + +    return result; + +} diff --git a/src/analysis/scan/patterns/modifiers/xor.c b/src/analysis/scan/patterns/modifiers/xor.c index 53d75a5..d932c82 100644 --- a/src/analysis/scan/patterns/modifiers/xor.c +++ b/src/analysis/scan/patterns/modifiers/xor.c @@ -27,6 +27,7 @@  #include <assert.h>  #include <malloc.h>  #include <stdint.h> +#include <stdio.h>  #include <string.h> @@ -66,6 +67,9 @@ static bool g_scan_xor_modifier_can_handle_arg(const GScanXorModifier *, const m  /* Transforme une séquence d'octets pour motif de recherche. */  static bool g_scan_xor_modifier_transform_with_arg(const GScanXorModifier *, const sized_binary_t *, size_t, const modifier_arg_t *, sized_binary_t **, size_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +static char *g_scan_xor_modifier_get_path(const GScanXorModifier *, size_t *); +  /* ---------------------------------------------------------------------------------- */ @@ -106,6 +110,7 @@ static void g_scan_xor_modifier_class_init(GScanXorModifierClass *klass)      modifier->transform = (transform_scan_token_fc)g_scan_xor_modifier_transform;      modifier->can_handle = (can_token_modifier_handle_arg)g_scan_xor_modifier_can_handle_arg;      modifier->transform_with = (transform_scan_token_with_fc)g_scan_xor_modifier_transform_with_arg; +    modifier->get_path = (get_modifier_path)g_scan_xor_modifier_get_path;  } @@ -393,3 +398,41 @@ static bool g_scan_xor_modifier_transform_with_arg(const GScanXorModifier *modif      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : modifier = modificateur à consulter.                         * +*                index    = indice de la combinaison ciblée. [OUT]            * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static char *g_scan_xor_modifier_get_path(const GScanXorModifier *modifier, size_t *index) +{ +    char *result;                           /* Combinaison à retourner     */ +    int ret;                                /* Bilan intermédiaire         */ + +    if (*index > 255) +    { +        result = NULL; +        (*index) -= 256; +    } + +    else +    { +        ret = asprintf(&result, "xor(0x%02hhx)", (unsigned char)*index); + +        if (ret == -1) +            result = strdup("xor(0x?)"); + +    } + +    return result; + +} diff --git a/src/analysis/scan/patterns/token.c b/src/analysis/scan/patterns/token.c index 8b3a843..030e4a1 100644 --- a/src/analysis/scan/patterns/token.c +++ b/src/analysis/scan/patterns/token.c @@ -30,6 +30,7 @@  #include "token-int.h" +#include "tokens/nodes/plain.h"  #include "../../../common/cpp.h"  #include "../../../core/logs.h" @@ -342,6 +343,33 @@ void g_bytes_token_check(const GBytesToken *token, GScanContext *context, GBinCo  } +/****************************************************************************** +*                                                                             * +*  Paramètres  : token   = définition de la bribe à consulter.                * +*                index = indice de la combinaison de modificateurs ciblée.    * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison gagnante.      * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +char *g_bytes_token_get_modifier_path(const GBytesToken *token, size_t index) +{ +    char *result;                           /* Combinaison à retourner     */ + +    if (G_IS_SCAN_TOKEN_NODE_PLAIN(token->root)) +        result = g_scan_token_node_plain_get_modifier_path(G_SCAN_TOKEN_NODE_PLAIN(token->root), index); +    else +        result = NULL; + +    return result; + +} + +  /* ---------------------------------------------------------------------------------- */  /*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ diff --git a/src/analysis/scan/patterns/token.h b/src/analysis/scan/patterns/token.h index a71e367..2816bf8 100644 --- a/src/analysis/scan/patterns/token.h +++ b/src/analysis/scan/patterns/token.h @@ -64,6 +64,9 @@ bool g_bytes_token_enroll(GBytesToken *, GScanContext *, GEngineBackend *, size_  /* Transforme les correspondances locales en trouvailles. */  void g_bytes_token_check(const GBytesToken *, GScanContext *, GBinContent *, pending_matches_t *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +char *g_bytes_token_get_modifier_path(const GBytesToken *, size_t); +  #endif  /* _ANALYSIS_SCAN_PATTERNS_TOKEN_H */ diff --git a/src/analysis/scan/patterns/tokens/nodes/plain.c b/src/analysis/scan/patterns/tokens/nodes/plain.c index 5d89cf8..7309574 100644 --- a/src/analysis/scan/patterns/tokens/nodes/plain.c +++ b/src/analysis/scan/patterns/tokens/nodes/plain.c @@ -277,6 +277,35 @@ ScanPlainNodeFlags g_scan_token_node_plain_get_flags(const GScanTokenNodePlain *  } +/****************************************************************************** +*                                                                             * +*  Paramètres  : node  = définition de la bribe à consulter.                  * +*                index = indice de la combinaison de modificateurs ciblée.    * +*                                                                             * +*  Description : Retrouve l'origine d'une correspondance à partir d'un indice.* +*                                                                             * +*  Retour      : Version humainement lisible de la combinaison.               * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +char *g_scan_token_node_plain_get_modifier_path(const GScanTokenNodePlain *node, size_t index) +{ +    char *result;                           /* Combinaison à retourner     */ + +    if (node->modifier == NULL) +        result = strdup("plain"); + +    else +        result = g_scan_token_modifier_get_path(node->modifier, (size_t []){ index }); + +    return result; + + +} + +  /* ---------------------------------------------------------------------------------- */  /*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */ @@ -511,6 +540,7 @@ static bool check_scan_token_node_plain_content(const sized_binary_t *raw, const  static void g_scan_token_node_plain_check_forward(const GScanTokenNodePlain *node, GScanContext *context, GBinContent *content, pending_matches_t *matches, node_search_offset_t *offset, bool not, bool *skip)  {      bool initialized;                       /* Initialisation du suivi ?   */ +    bool track_path;                        /* Conservation du chemin      */      bool nocase;                            /* Pas d'intérêt pour la casse */      size_t ocount;                          /* Quantité de bornes présentes*/      size_t i;                               /* Boucle de parcours #1       */ @@ -531,6 +561,10 @@ static void g_scan_token_node_plain_check_forward(const GScanTokenNodePlain *nod      initialized = are_pending_matches_initialized(matches); +    track_path = (G_SCAN_TOKEN_NODE(node)->flags & STNF_MAIN); + +    assert((track_path && !initialized) || !track_path); +      nocase = (node->flags & SPNF_CASE_INSENSITIVE);      get_node_search_offset_ranges(offset, &ocount); @@ -568,12 +602,18 @@ static void g_scan_token_node_plain_check_forward(const GScanTokenNodePlain *nod                  status = check_scan_token_node_plain_content(raw, atom, nocase, new_begin, content);                  if ((status && !not) || (!status && not)) +                {                      /**                       * Il ne peut y avoir qu'une seule séquence d'octets à un même                       * emplacement, donc le couple (new_begin, len) enregistré est                       * unique.                       */ -                    add_pending_match(matches, new_begin, raw->len); +                    if (track_path) +                        add_pending_match_with_path(matches, new_begin, raw->len, i); +                    else +                        add_pending_match(matches, new_begin, raw->len); + +                }              } diff --git a/src/analysis/scan/patterns/tokens/nodes/plain.h b/src/analysis/scan/patterns/tokens/nodes/plain.h index c8f3920..abf71de 100644 --- a/src/analysis/scan/patterns/tokens/nodes/plain.h +++ b/src/analysis/scan/patterns/tokens/nodes/plain.h @@ -75,6 +75,9 @@ GScanTokenNode *g_scan_token_node_plain_new(const sized_binary_t *, GScanTokenMo  /* Indique les propriétés particulières d'un noeud de texte. */  ScanPlainNodeFlags g_scan_token_node_plain_get_flags(const GScanTokenNodePlain *); +/* Retrouve l'origine d'une correspondance à partir d'un indice. */ +char *g_scan_token_node_plain_get_modifier_path(const GScanTokenNodePlain *, size_t); +  #endif  /* _ANALYSIS_SCAN_PATTERNS_TOKENS_NODES_PLAIN_H */ | 
