summaryrefslogtreecommitdiff
path: root/src/analysis/scan/scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/scanner.c')
-rw-r--r--src/analysis/scan/scanner.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/analysis/scan/scanner.c b/src/analysis/scan/scanner.c
index 7b553e6..02a93fa 100644
--- a/src/analysis/scan/scanner.c
+++ b/src/analysis/scan/scanner.c
@@ -163,7 +163,8 @@ static void g_content_scanner_finalize(GContentScanner *scanner)
/******************************************************************************
* *
-* Paramètres : text = définitions textuelles de règles de recherche. *
+* Paramètres : text = définitions textuelles de règles de recherche. *
+* length = taille de la définition. *
* *
* Description : Prépare une recherche de motifs dans du contenu binaire. *
* *
@@ -173,13 +174,13 @@ static void g_content_scanner_finalize(GContentScanner *scanner)
* *
******************************************************************************/
-GContentScanner *g_content_scanner_new_from_text(const char *text)
+GContentScanner *g_content_scanner_new_from_text(const char *text, size_t length)
{
GContentScanner *result; /* Structure à retourner */
result = g_object_new(G_TYPE_CONTENT_SCANNER, NULL);
- if (!g_content_scanner_create_from_text(result, text))
+ if (!g_content_scanner_create_from_text(result, text, length))
g_clear_object(&result);
return result;
@@ -191,6 +192,7 @@ GContentScanner *g_content_scanner_new_from_text(const char *text)
* *
* Paramètres : scanner = scanner de contenus à initialiser pleinement. *
* text = définitions textuelles de règles de recherche. *
+* length = taille de la définition. *
* *
* Description : Met en place un scanner de contenus binaires. *
* *
@@ -200,12 +202,9 @@ GContentScanner *g_content_scanner_new_from_text(const char *text)
* *
******************************************************************************/
-bool g_content_scanner_create_from_text(GContentScanner *scanner, const char *text)
+bool g_content_scanner_create_from_text(GContentScanner *scanner, const char *text, size_t length)
{
bool result; /* Bilan à retourner */
- size_t length; /* Taille de la définition */
-
- length = strlen(text);
result = process_rules_definitions(scanner, text, length);
@@ -489,11 +488,12 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
GScanContext *result; /* Bilan global à retourner */
bool status; /* Bilan d'opération locale */
size_t i; /* Boucle de parcours */
+ size_t ids_count; /* Quantité de motifs prévus */
bool global; /* Bilan des règles globales */
GScanRule *rule; /* Règle à consulter */
const char *name; /* Désignation de la règle */
- /* Préparations... */
+ /* Préparations... */
result = g_scan_context_new(options);
@@ -507,17 +507,30 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
for (i = 0; i < scanner->rule_count && status; i++)
status = g_scan_rule_setup_backend(scanner->rules[i], scanner->data_backend, result);
+ if (status)
+ status = g_engine_backend_warm_up(scanner->data_backend);
+
+ for (i = 0; i < scanner->rule_count && status; i++)
+ status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend);
+
if (!status)
{
g_clear_object(&result);
goto exit;
}
+ /* Affichage éventuel de statistiques */
+
+ if (g_scan_options_get_print_stats(options))
+ g_engine_backend_output_stats(scanner->data_backend);
+
}
/* Phase d'analyse */
- g_scan_context_set_content(result, content);
+ ids_count = g_engine_backend_count_plain_pattern_ids(scanner->data_backend);
+
+ g_scan_context_set_content(result, content, ids_count);
g_engine_backend_run_scan(scanner->data_backend, result);
@@ -530,7 +543,7 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions *
global = true;
- for (i = 0; i < scanner->rule_count; i++)
+ for (i = 0; i < scanner->rule_count && global; i++)
{
rule = scanner->rules[i];