diff options
Diffstat (limited to 'src/format/elf/dynamic.c')
-rw-r--r-- | src/format/elf/dynamic.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/format/elf/dynamic.c b/src/format/elf/dynamic.c new file mode 100644 index 0000000..e1f50b0 --- /dev/null +++ b/src/format/elf/dynamic.c @@ -0,0 +1,109 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * program.c - gestion des en-têtes de programme d'un ELF + * + * Copyright (C) 2010-2013 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA 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. + * + * OpenIDA 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 <http://www.gnu.org/licenses/>. + */ + + +#include "dynamic.h" + + +#include "elf-int.h" +#include "program.h" + + + +/****************************************************************************** +* * +* Paramètres : format = description de l'exécutable à consulter. * +* index = indice de la section recherchée. * +* dynamic = ensemble d'informations à faire remonter. [OUT] * +* * +* Description : Recherche un en-tête de programme DYNAMIC au sein de binaire.* +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool find_elf_dynamic_program_header(const GElfFormat *format, elf_phdr *dynamic) +{ + bool result; /* Bilan d'opération à renvoyer*/ + uint16_t max; /* Nombre d'en-têtes présents */ + uint16_t i; /* Boucle de parcours */ + + result = false; + + max = ELF_HDR(format, format->header, e_phnum); + + for (i = 0; i < max && !result; i++) + { + if (!find_elf_program_by_index(format, i, dynamic)) + break; + + result = (ELF_PHDR(format, *dynamic, p_type) == PT_DYNAMIC); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* dynamic = programme de type PT_DYNAMIC. * +* type = sorte d'élément recherché. * +* item = élément retrouvé dans la section. [OUT] * +* * +* Description : Retrouve un élément donné dans la section dynamique. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool find_elf_dynamic_item_from_pheader(const GElfFormat *format, const elf_phdr *dynamic, int64_t type, elf_dyn *item) +{ + bool result; /* Bilan à retourner */ + off_t max; /* Nombre d'entités présentes */ + off_t i; /* Boucle de parcours */ + off_t pos; /* Position de lecture */ + + result = false; + + max = ELF_PHDR(format, *dynamic, p_filesz) / ELF_SIZEOF_DYN(format); + + for (i = 0; i < max && !result; i++) + { + pos = ELF_PHDR(format, *dynamic, p_offset) + i * ELF_SIZEOF_DYN(format); + + if (!read_elf_dynamic_entry(format, &pos, item)) + break; + + result = (ELF_DYN(format, *item, d_tag) == type); + + } + + return result; + +} |