diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-09-27 22:50:50 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-09-27 22:50:50 (GMT) |
commit | 32f7a1126f8ac5a602f60a29de18eb7c5683dcc2 (patch) | |
tree | f92189c4d5d8f164c4b666289dd40344d71d39f9 /src/analysis/contents | |
parent | ad4ae001fbb37bdccd99ef1e01404ae72c0a1318 (diff) |
Read LEB128 values from binary contents.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@579 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis/contents')
-rw-r--r-- | src/analysis/contents/file.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c index 9f1c10c..f24e930 100644 --- a/src/analysis/contents/file.c +++ b/src/analysis/contents/file.c @@ -109,6 +109,12 @@ static bool g_file_content_read_u32(const GFileContent *, vmpa2t *, SourceEndian /* Lit un nombre non signé sur huit octets. */ static bool g_file_content_read_u64(const GFileContent *, vmpa2t *, SourceEndian, uint64_t *); +/* Lit un nombre non signé encodé au format LEB128. */ +static bool g_file_content_read_uleb128(const GFileContent *, vmpa2t *, uleb128_t *); + +/* Lit un nombre signé encodé au format LEB128. */ +static bool g_file_content_read_leb128(const GFileContent *, vmpa2t *, leb128_t *); + /* Indique le type défini par la GLib pour les contenus de données. */ @@ -193,6 +199,9 @@ static void g_file_content_interface_init(GBinContentInterface *iface) iface->read_u32 = (read_u32_fc)g_file_content_read_u32; iface->read_u64 = (read_u64_fc)g_file_content_read_u64; + iface->read_uleb128 = (read_uleb128_fc)g_file_content_read_uleb128; + iface->read_leb128 = (read_leb128_fc)g_file_content_read_leb128; + } @@ -729,3 +738,77 @@ static bool g_file_content_read_u64(const GFileContent *content, vmpa2t *addr, S return result; } + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * +* val = lieu d'enregistrement de la lecture. [OUT] * +* * +* Description : Lit un nombre non signé encodé au format LEB128. * +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_file_content_read_uleb128(const GFileContent *content, vmpa2t *addr, uleb128_t *val) +{ + bool result; /* Bilan de lecture à renvoyer */ + phys_t pos; /* Tête de lecture courante */ + phys_t length; /* Taille de la surface dispo. */ + + pos = get_phy_addr(addr); + + if (pos == VMPA_NO_PHYSICAL) + return false; + + length = get_mrange_length(&content->range); + + result = read_uleb128(val, content->data, &pos, length); + + if (result) + advance_vmpa(addr, pos - get_phy_addr(addr)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * +* val = lieu d'enregistrement de la lecture. [OUT] * +* * +* Description : Lit un nombre signé encodé au format LEB128. * +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_file_content_read_leb128(const GFileContent *content, vmpa2t *addr, leb128_t *val) +{ + bool result; /* Bilan de lecture à renvoyer */ + phys_t pos; /* Tête de lecture courante */ + phys_t length; /* Taille de la surface dispo. */ + + pos = get_phy_addr(addr); + + if (pos == VMPA_NO_PHYSICAL) + return false; + + length = get_mrange_length(&content->range); + + result = read_leb128(val, content->data, &pos, length); + + if (result) + advance_vmpa(addr, pos - get_phy_addr(addr)); + + return result; + +} |