diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2023-08-06 16:54:57 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2023-08-06 16:54:57 (GMT) |
commit | 4fcc35a52ccb025b6d803d85e017931cd2452960 (patch) | |
tree | e95920f16c273e41f9cae1ea2f02571c221a514e /src/analysis/scan/items/uint.c | |
parent | 74d062d4ec55d7ac3914bbf64b8b6c5ab52227df (diff) |
Extend the ROST grammar with a first batch of new features.
Diffstat (limited to 'src/analysis/scan/items/uint.c')
-rw-r--r-- | src/analysis/scan/items/uint.c | 137 |
1 files changed, 92 insertions, 45 deletions
diff --git a/src/analysis/scan/items/uint.c b/src/analysis/scan/items/uint.c index 4fea494..66c7fa9 100644 --- a/src/analysis/scan/items/uint.c +++ b/src/analysis/scan/items/uint.c @@ -2,7 +2,7 @@ /* Chrysalide - Outil d'analyse de fichiers binaires * uint.c - lecture d'un mot à partir de données binaires * - * Copyright (C) 2022 Cyrille Bagard + * Copyright (C) 2023 Cyrille Bagard * * This file is part of Chrysalide. * @@ -29,6 +29,7 @@ #include "uint-int.h" #include "../exprs/literal.h" +#include "../../../common/extstr.h" @@ -36,16 +37,16 @@ /* Initialise la classe des lectures de valeurs entières. */ -static void g_uint_function_class_init(GUintFunctionClass *); +static void g_scan_uint_function_class_init(GScanUintFunctionClass *); /* Initialise une instance de lecture de valeur entière. */ -static void g_uint_function_init(GUintFunction *); +static void g_scan_uint_function_init(GScanUintFunction *); /* Supprime toutes les références externes. */ -static void g_uint_function_dispose(GUintFunction *); +static void g_scan_uint_function_dispose(GScanUintFunction *); /* Procède à la libération totale de la mémoire. */ -static void g_uint_function_finalize(GUintFunction *); +static void g_scan_uint_function_finalize(GScanUintFunction *); @@ -53,10 +54,10 @@ static void g_uint_function_finalize(GUintFunction *); /* Indique le nom associé à une expression d'évaluation. */ -static char *g_uint_function_get_name(const GUintFunction *); +static char *g_scan_uint_function_get_name(const GScanUintFunction *); /* Réduit une expression à une forme plus simple. */ -static bool g_uint_function_run_call(GUintFunction *, GScanExpression **, size_t, GScanContext *, GScanScope *, GObject **); +static bool g_scan_uint_function_run_call(GScanUintFunction *, GScanExpression **, size_t, GScanContext *, GScanScope *, GObject **); @@ -66,7 +67,7 @@ static bool g_uint_function_run_call(GUintFunction *, GScanExpression **, size_t /* Indique le type défini pour une lecture de mot à partir de données binaires. */ -G_DEFINE_TYPE(GUintFunction, g_uint_function, G_TYPE_REGISTERED_ITEM); +G_DEFINE_TYPE(GScanUintFunction, g_scan_uint_function, G_TYPE_REGISTERED_ITEM); /****************************************************************************** @@ -81,20 +82,20 @@ G_DEFINE_TYPE(GUintFunction, g_uint_function, G_TYPE_REGISTERED_ITEM); * * ******************************************************************************/ -static void g_uint_function_class_init(GUintFunctionClass *klass) +static void g_scan_uint_function_class_init(GScanUintFunctionClass *klass) { GObjectClass *object; /* Autre version de la classe */ GRegisteredItemClass *registered; /* Version de classe parente */ object = G_OBJECT_CLASS(klass); - object->dispose = (GObjectFinalizeFunc/* ! */)g_uint_function_dispose; - object->finalize = (GObjectFinalizeFunc)g_uint_function_finalize; + object->dispose = (GObjectFinalizeFunc/* ! */)g_scan_uint_function_dispose; + object->finalize = (GObjectFinalizeFunc)g_scan_uint_function_finalize; registered = G_REGISTERED_ITEM_CLASS(klass); - registered->get_name = (get_registered_item_name_fc)g_uint_function_get_name; - registered->run_call = (run_registered_item_call_fc)g_uint_function_run_call; + registered->get_name = (get_registered_item_name_fc)g_scan_uint_function_get_name; + registered->run_call = (run_registered_item_call_fc)g_scan_uint_function_run_call; } @@ -111,7 +112,7 @@ static void g_uint_function_class_init(GUintFunctionClass *klass) * * ******************************************************************************/ -static void g_uint_function_init(GUintFunction *func) +static void g_scan_uint_function_init(GScanUintFunction *func) { func->size = MDS_UNDEFINED; func->endian = SRE_LITTLE; @@ -131,9 +132,9 @@ static void g_uint_function_init(GUintFunction *func) * * ******************************************************************************/ -static void g_uint_function_dispose(GUintFunction *func) +static void g_scan_uint_function_dispose(GScanUintFunction *func) { - G_OBJECT_CLASS(g_uint_function_parent_class)->dispose(G_OBJECT(func)); + G_OBJECT_CLASS(g_scan_uint_function_parent_class)->dispose(G_OBJECT(func)); } @@ -150,9 +151,9 @@ static void g_uint_function_dispose(GUintFunction *func) * * ******************************************************************************/ -static void g_uint_function_finalize(GUintFunction *func) +static void g_scan_uint_function_finalize(GScanUintFunction *func) { - G_OBJECT_CLASS(g_uint_function_parent_class)->finalize(G_OBJECT(func)); + G_OBJECT_CLASS(g_scan_uint_function_parent_class)->finalize(G_OBJECT(func)); } @@ -169,13 +170,13 @@ static void g_uint_function_finalize(GUintFunction *func) * * ******************************************************************************/ -GUintFunction *g_uint_function_new(MemoryDataSize size) +GRegisteredItem *g_scan_uint_function_new(MemoryDataSize size, SourceEndian endian) { - GUintFunction *result; /* Structure à retourner */ + GRegisteredItem *result; /* Structure à retourner */ - result = g_object_new(G_TYPE_UINT_FUNCTION, NULL); + result = g_object_new(G_TYPE_SCAN_UINT_FUNCTION, NULL); - if (!g_uint_function_create(result, size)) + if (!g_scan_uint_function_create(G_SCAN_UINT_FUNCTION(result), size, endian)) g_clear_object(&result); return result; @@ -196,13 +197,14 @@ GUintFunction *g_uint_function_new(MemoryDataSize size) * * ******************************************************************************/ -bool g_uint_function_create(GUintFunction *func, MemoryDataSize size) +bool g_scan_uint_function_create(GScanUintFunction *func, MemoryDataSize size, SourceEndian endian) { bool result; /* Bilan à retourner */ result = true; func->size = size; + func->endian = endian; return result; @@ -227,26 +229,26 @@ bool g_uint_function_create(GUintFunction *func, MemoryDataSize size) * * ******************************************************************************/ -static char *g_uint_function_get_name(const GUintFunction *item) +static char *g_scan_uint_function_get_name(const GScanUintFunction *item) { char *result; /* Désignation à retourner */ - switch (item->size) + switch (item->size & ~MDS_SIGN) { case MDS_8_BITS_UNSIGNED: - result = strdup("uint8"); + result = strdup("int8"); break; case MDS_16_BITS_UNSIGNED: - result = strdup("uint16"); + result = strdup("int16"); break; case MDS_32_BITS_UNSIGNED: - result = strdup("uint32"); + result = strdup("int32"); break; case MDS_64_BITS_UNSIGNED: - result = strdup("uint64"); + result = strdup("int64"); break; default: @@ -256,6 +258,16 @@ static char *g_uint_function_get_name(const GUintFunction *item) } + if (result) + { + if (!MDS_IS_SIGNED(item->size)) + result = strprep(result, "u"); + + if (item->endian == SRE_BIG) + result = stradd(result, "be"); + + } + return result; } @@ -278,21 +290,25 @@ static char *g_uint_function_get_name(const GUintFunction *item) * * ******************************************************************************/ -static bool g_uint_function_run_call(GUintFunction *item, GScanExpression **args, size_t count, GScanContext *ctx, GScanScope *scope, GObject **out) +static bool g_scan_uint_function_run_call(GScanUintFunction *item, GScanExpression **args, size_t count, GScanContext *ctx, GScanScope *scope, GObject **out) { bool result; /* Bilan à retourner */ unsigned long long offset; /* Position du mot ciblé */ GBinContent *content; /* Contenu à manipuler */ vmpa2t pos; /* Tête de lecture */ - uint8_t val_8; /* Valeur entière sur 8 bits */ - uint16_t val_16; /* Valeur entière sur 16 bits */ - uint32_t val_32; /* Valeur entière sur 32 bits */ - uint64_t val_64; /* Valeur entière sur 64 bits */ - - result = (count == 1 && G_IS_LITERAL_EXPRESSION(args[0])); + uint8_t val_s8; /* Valeur entière sur 8 bits */ + uint8_t val_u8; /* Valeur entière sur 8 bits */ + uint16_t val_s16; /* Valeur entière sur 16 bits */ + uint16_t val_u16; /* Valeur entière sur 16 bits */ + uint32_t val_s32; /* Valeur entière sur 32 bits */ + uint32_t val_u32; /* Valeur entière sur 32 bits */ + uint64_t val_s64; /* Valeur entière sur 64 bits */ + uint64_t val_u64; /* Valeur entière sur 64 bits */ + + result = (count == 1 && G_IS_SCAN_LITERAL_EXPRESSION(args[0])); if (!result) goto exit; - result = g_literal_expression_get_integer_value(G_LITERAL_EXPRESSION(args[0]), &offset); + result = g_scan_literal_expression_get_unsigned_integer_value(G_SCAN_LITERAL_EXPRESSION(args[0]), &offset); if (!result) goto exit; content = g_scan_context_get_content(ctx); @@ -302,29 +318,60 @@ static bool g_uint_function_run_call(GUintFunction *item, GScanExpression **args switch (item->size) { + case MDS_8_BITS_SIGNED: + result = g_binary_content_read_s8(content, &pos, &val_s8); + if (result) + *out = G_OBJECT(g_scan_literal_expression_new(LVT_SIGNED_INTEGER, + (long long []){ val_s8 })); + break; + case MDS_8_BITS_UNSIGNED: - result = g_binary_content_read_u8(content, &pos, &val_8); + result = g_binary_content_read_u8(content, &pos, &val_u8); if (result) - *out = G_OBJECT(g_literal_expression_new(EVT_INTEGER, (unsigned long long []){ val_8 })); + *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, + (unsigned long long []){ val_u8 })); + break; + + case MDS_16_BITS_SIGNED: + result = g_binary_content_read_s16(content, &pos, item->endian, &val_s16); + if (result) + *out = G_OBJECT(g_scan_literal_expression_new(LVT_SIGNED_INTEGER, + (long long []){ val_s16 })); break; case MDS_16_BITS_UNSIGNED: - result = g_binary_content_read_u16(content, &pos, item->endian, &val_16); + result = g_binary_content_read_u16(content, &pos, item->endian, &val_u16); if (result) - *out = G_OBJECT(g_literal_expression_new(EVT_INTEGER, (unsigned long long []){ val_16 })); + *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, + (unsigned long long []){ val_u16 })); + break; + + case MDS_32_BITS_SIGNED: + result = g_binary_content_read_s32(content, &pos, item->endian, &val_s32); + if (result) + *out = G_OBJECT(g_scan_literal_expression_new(LVT_SIGNED_INTEGER, + (long long []){ val_s32 })); break; case MDS_32_BITS_UNSIGNED: - result = g_binary_content_read_u32(content, &pos, item->endian, &val_32); + result = g_binary_content_read_u32(content, &pos, item->endian, &val_u32); if (result) - *out = G_OBJECT(g_literal_expression_new(EVT_INTEGER, (unsigned long long []){ val_32 })); + *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, + (unsigned long long []){ val_u32 })); break; + case MDS_64_BITS_SIGNED: + result = g_binary_content_read_s64(content, &pos, item->endian, &val_s64); + if (result) + *out = G_OBJECT(g_scan_literal_expression_new(LVT_SIGNED_INTEGER, + (long long []){ val_s64 })); + break; case MDS_64_BITS_UNSIGNED: - result = g_binary_content_read_u64(content, &pos, item->endian, &val_64); + result = g_binary_content_read_u64(content, &pos, item->endian, &val_u64); if (result) - *out = G_OBJECT(g_literal_expression_new(EVT_INTEGER, (unsigned long long []){ val_64 })); + *out = G_OBJECT(g_scan_literal_expression_new(LVT_UNSIGNED_INTEGER, + (unsigned long long []){ val_u64 })); break; default: |