/* Chrysalide - Outil d'analyse de fichiers binaires * id.c - constitution des identifiants de taille dynamique * * Copyright (C) 2012-2017 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "id.h" #include "../../../common/endianness.h" /****************************************************************************** * * * Paramètres : id = identifiant à fournir. * * size = référence pour la taille utilisée. * * blob = flux de données à analyser. [OUT] * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * * * Description : Ecrit un identifiant enregistré dans une taille dynamique. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool _set_jdwp_dynsized_id(const jdwp_dynsized_id *id, uint32_t size, bin_t *blob, off_t *pos, off_t len) { uint8_t id8; /* Valeur sur 1 octets */ uint16_t id16; /* Valeur sur 2 octets */ uint32_t id32; /* Valeur sur 4 octets */ uint64_t id64; /* Valeur sur 8 octets */ switch (size) { case 1: id8 = (uint8_t)*id; if (!write_u8(&id8, blob, pos, len, SRE_BIG)) return false; break; case 2: id16 = (uint16_t)*id; if (!write_u16(&id16, blob, pos, len, SRE_BIG)) return false; break; case 4: id32 = (uint32_t)*id; if (!write_u32(&id32, blob, pos, len, SRE_BIG)) return false; break; case 8: id64 = (uint64_t)*id; if (!write_u64(&id64, blob, pos, len, SRE_BIG)) return false; break; default: return false; break; } return true; } /****************************************************************************** * * * Paramètres : blob = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * size = référence pour la taille utilisée. * * id = identifiant à fournir. [OUT] * * * * Description : Lit un identifiant enregistré dans une taille dynamique. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool _get_jdwp_dynsized_id(const bin_t *blob, off_t *pos, off_t len, uint32_t size, jdwp_dynsized_id *id) { uint8_t id8; /* Valeur sur 1 octets */ uint16_t id16; /* Valeur sur 2 octets */ uint32_t id32; /* Valeur sur 4 octets */ uint64_t id64; /* Valeur sur 8 octets */ switch (size) { case 1: if (!read_u8(&id8, blob, pos, len)) return false; *id = (jdwp_dynsized_id)id8; break; case 2: if (!read_u16(&id16, blob, pos, len, SRE_BIG)) return false; *id = (jdwp_dynsized_id)id16; break; case 4: if (!read_u32(&id32, blob, pos, len, SRE_BIG)) return false; *id = (jdwp_dynsized_id)id32; break; case 8: if (!read_u64(&id64, blob, pos, len, SRE_BIG)) return false; *id = (jdwp_dynsized_id)id64; break; default: return false; break; } return true; }