From 946f5f093c7265dc5a5e00694325605b249eea43 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 9 Feb 2016 17:38:45 +0100 Subject: Built raw instructions from uleb128 values. --- ChangeLog | 6 ++++++ src/arch/raw.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/arch/raw.h | 3 +++ 3 files changed, 49 insertions(+) diff --git a/ChangeLog b/ChangeLog index 128478a..ddd89ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 16-02-09 Cyrille Bagard + * src/arch/raw.c: + * src/arch/raw.h: + Build raw instructions from uleb128 values. + +16-02-09 Cyrille Bagard + * src/arch/archbase.h: Fix a bug by handling non rugular sizes of values. diff --git a/src/arch/raw.c b/src/arch/raw.c index d04f141..0dfb566 100644 --- a/src/arch/raw.c +++ b/src/arch/raw.c @@ -230,6 +230,7 @@ GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *addr, MemoryDat break; default: + assert(false); goto grinfv_error; break; @@ -251,6 +252,45 @@ GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *addr, MemoryDat /****************************************************************************** * * * Paramètres : content = flux de données à analyser. * +* addr = position courante dans ce flux. [OUT] * +* * +* Description : Crée une instruction de type 'db/dw/etc' pour un uleb128. * +* * +* Retour : Instruction mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GArchInstruction *g_raw_instruction_new_uleb128(const GBinContent *content, vmpa2t *addr) +{ + GArchInstruction *result; /* Instruction à retourner */ + vmpa2t start; /* Départ original de lecture */ + uleb128_t value; /* Valeur uleb128 à représenter*/ + MemoryDataSize leb_size; /* Taille de la valeur */ + + copy_vmpa(&start, addr); + + if (!g_binary_content_read_uleb128(content, addr, &value)) + goto grinu_error; + + leb_size = MDS_FROM_BYTES(compute_vmpa_diff(&start, addr)); + assert(leb_size != MDS_UNDEFINED); + + result = g_raw_instruction_new_from_value(&start, leb_size, (uint64_t)value); + + return result; + + grinu_error: + + return NULL; + +} + + +/****************************************************************************** +* * +* Paramètres : content = flux de données à analyser. * * size = taille de chacun des éléments à représenter. * * count = nombre de ces éléments. * * addr = position courante dans ce flux. [OUT] * diff --git a/src/arch/raw.h b/src/arch/raw.h index 459ade2..b40b411 100644 --- a/src/arch/raw.h +++ b/src/arch/raw.h @@ -55,6 +55,9 @@ GType g_raw_instruction_get_type(void); /* Crée une instruction de type 'db/dw/etc' simple. */ GArchInstruction *g_raw_instruction_new_from_value(const vmpa2t *, MemoryDataSize, uint64_t); +/* Crée une instruction de type 'db/dw/etc' pour un uleb128. */ +GArchInstruction *g_raw_instruction_new_uleb128(const GBinContent *content, vmpa2t *); + /* Crée une instruction de type 'db/dw/etc' étendue. */ GArchInstruction *g_raw_instruction_new_array(const GBinContent *, MemoryDataSize, size_t, vmpa2t *, SourceEndian); -- cgit v0.11.2-87-g4458