summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2023-10-11 23:16:21 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2023-10-11 23:16:21 (GMT)
commitab6b87b7309e2d00926615f6557016bee6ab0b71 (patch)
treebf69b93d2f0548fc845e68ae1e8519bd33d1da24 /src/analysis/scan/patterns
parent404097b7b07b336b427b3682ec2bc48d831cb2e9 (diff)
Add two new functions to ROST grammar: modpath and maxcommon.
Diffstat (limited to 'src/analysis/scan/patterns')
-rw-r--r--src/analysis/scan/patterns/modifier-int.h4
-rw-r--r--src/analysis/scan/patterns/modifier.c27
-rw-r--r--src/analysis/scan/patterns/modifier.h3
-rw-r--r--src/analysis/scan/patterns/modifiers/hex.c35
-rw-r--r--src/analysis/scan/patterns/modifiers/list.c32
-rw-r--r--src/analysis/scan/patterns/modifiers/plain.c35
-rw-r--r--src/analysis/scan/patterns/modifiers/rev.c35
-rw-r--r--src/analysis/scan/patterns/modifiers/xor.c43
-rw-r--r--src/analysis/scan/patterns/token.c28
-rw-r--r--src/analysis/scan/patterns/token.h3
-rw-r--r--src/analysis/scan/patterns/tokens/nodes/plain.c42
-rw-r--r--src/analysis/scan/patterns/tokens/nodes/plain.h3
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 */