summaryrefslogtreecommitdiff
path: root/src/format/exe_format.h
blob: 32e35ffdb2be10b9905f3f7bb6488c91abb9a631 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

/* OpenIDA - Outil d'analyse de fichiers binaires
 * exe_format.h - prototypes pour le support des formats d'exécutables
 *
 * Copyright (C) 2008 Cyrille Bagard
 *
 *  This file is part of OpenIDA.
 *
 *  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/>.
 */


#ifndef _FORMAT_EXE_FORMAT_H
#define _FORMAT_EXE_FORMAT_H


#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>


#include "../analysis/prototype.h"



/* ------------------------ MANIPULATION DES PARTIES DE CODE ------------------------ */


/* Description d'une partie binaire */
typedef struct _bin_part bin_part;


/* Crée une description de partie de code vierge. */
bin_part *create_bin_part(void);

/* Attribue une description humaine à une partie de code. */
void set_bin_part_name(bin_part *, const char *);

/* Définit les valeurs utiles d'une partie de code. */
void set_bin_part_values(bin_part *, off_t, off_t, uint64_t);

/* Fournit les valeurs utiles d'une partie de code. */
void get_bin_part_values(const bin_part *, off_t *, off_t *, uint64_t *);

/* Supprime de la mémoire une description de partie de code. */
void delete_bin_part(bin_part *);

/* Etablit la comparaison entre deux blocs binaires. */
int compare_bin_parts(const bin_part **, const bin_part **);




/* FIXME !!!!!!!!!!!! */

/* Support générique d'un format d'exécutable */
typedef struct _exe_format exe_format;



/* ------------------------ DETECTION DE FORMATS EXECUTABLES ------------------------ */


/* Indication à propos du support d'un format */
typedef bool (* exe_match_fc) (const uint8_t *, off_t);

/* Méthode de chargement d'un format */
typedef exe_format * (* exe_load_fc) (const uint8_t *, off_t);


/* Procède au chargement des formats d'exécutables reconnus. */
bool init_all_exe_formats(void);

/* Charge si possible un nouvel exécutable binaire. */
exe_format *load_new_exe_format(const uint8_t *, off_t);





/* Architectures de destination des formats */
typedef enum _FormatTargetMachine
{
    FTM_JVM,                                /* Java Virtual Machine        */
    FTM_MIPS,                               /* Mips 32 ou 64 bits          */
    FTM_386,                                /* Intel 80386                 */

    FTM_COUNT

} FormatTargetMachine;




/* Types de symbole */
typedef enum _SymbolType
{
    STP_SECTION,                            /* Simple morceau de code      */
    STP_STRING                              /* Chaîne de caractères        */

} SymbolType;


/* Types de symbole */
typedef enum _ResolvedType
{
    RTP_SECTION,                            /* Simple morceau de code      */
    RTP_STRING                              /* Chaîne de caractères        */

} ResolvedType;


/* Fournit une référence vers le contenu binaire analysé. */
const uint8_t *get_exe_content(const exe_format *, off_t *);


/* Fournit l'adresse mémoire du point d'entrée du programme. */
uint64_t get_exe_entry_point(const exe_format *);



/* Indique le type d'architecture visée par le format. */
FormatTargetMachine get_exe_target_machine(const exe_format *);



/* Recherche une section donnée au sein de binaire. */
bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64_t *);

/* Récupère tous les symboles présents dans le contenu binaire. */
size_t get_exe_symbols(const exe_format *, char ***, SymbolType **, uint64_t **);

/* Récupère tous les éléments identifiées dans le binaire. */
size_t get_exe_resolved_items(const exe_format *, char ***, ResolvedType **, uint64_t **);

/* Recherche le symbole correspondant à une adresse. */
bool resolve_exe_symbol(const exe_format *, char **, SymbolType *, vmpa_t *);

/* Fournit le prototype de toutes les routines détectées. */
GBinRoutine **get_all_exe_routines(const exe_format *, size_t *);



#endif  /* _FORMAT_EXE_FORMAT_H */