diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-01-28 23:32:25 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-01-28 23:32:25 (GMT) |
commit | 16e0fd9d89ef433848678dfc8dd20426844a2868 (patch) | |
tree | 79075ae02c133cea21ffb555b1086aae833b3aac /tools/d2c/hooks | |
parent | 66c99d59d6a6d533de0bb65488de8243213bcdea (diff) |
Cleaned, rewritten and improved the whole code of the compiler.
Diffstat (limited to 'tools/d2c/hooks')
-rw-r--r-- | tools/d2c/hooks/Makefile.am | 31 | ||||
-rw-r--r-- | tools/d2c/hooks/decl.h | 37 | ||||
-rw-r--r-- | tools/d2c/hooks/grammar.y | 109 | ||||
-rw-r--r-- | tools/d2c/hooks/manager.c | 169 | ||||
-rw-r--r-- | tools/d2c/hooks/manager.h | 51 | ||||
-rw-r--r-- | tools/d2c/hooks/tokens.l | 26 |
6 files changed, 423 insertions, 0 deletions
diff --git a/tools/d2c/hooks/Makefile.am b/tools/d2c/hooks/Makefile.am new file mode 100644 index 0000000..1eb00a8 --- /dev/null +++ b/tools/d2c/hooks/Makefile.am @@ -0,0 +1,31 @@ + +BUILT_SOURCES = grammar.h + + +# On évite d'utiliser les variables personnalisées de type *_la_[YL]FLAGS +# afin de conserver des noms de fichiers simples, ie sans le nom de la +# bibliothèque de sortie en préfixe. + +AM_YFLAGS = -v -d -p hooks_ + +AM_LFLAGS = -P hooks_ -o lex.yy.c --header-file=tokens.h \ + -Dyylval=hooks_lval -Dyyget_lineno=hooks_get_lineno \ + -Dyy_scan_string=hooks__scan_string \ + -Dyy_delete_buffer=hooks__delete_buffer + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) + + +noinst_LTLIBRARIES = libd2chooks.la + +.NOTPARALLEL: $(noinst_LTLIBRARIES) + +libd2chooks_la_SOURCES = \ + decl.h \ + manager.h manager.c \ + tokens.l \ + grammar.y + + +# Automake fait les choses à moitié +CLEANFILES = grammar.h grammar.c grammar.output tokens.c tokens.h diff --git a/tools/d2c/hooks/decl.h b/tools/d2c/hooks/decl.h new file mode 100644 index 0000000..7db5640 --- /dev/null +++ b/tools/d2c/hooks/decl.h @@ -0,0 +1,37 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * decl.h - déclarations de prototypes utiles + * + * Copyright (C) 2016 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/>. + */ + + +#ifndef _TOOLS_D2C_HOOKS_DECL_H +#define _TOOLS_D2C_HOOKS_DECL_H + + +#include "manager.h" + + + +/* Interprête des données relatives à un champ de bits. */ +bool load_hooks_from_raw_line(instr_hooks *, const char *); + + + +#endif /* _TOOLS_D2C_HOOKS_DECL_H */ diff --git a/tools/d2c/hooks/grammar.y b/tools/d2c/hooks/grammar.y new file mode 100644 index 0000000..43e7ba0 --- /dev/null +++ b/tools/d2c/hooks/grammar.y @@ -0,0 +1,109 @@ + +%{ + +#include "tokens.h" + + +/* Affiche un message d'erreur suite à l'analyse en échec. */ +static int yyerror(instr_hooks *, char *); + +%} + + +%code requires { + +#include "decl.h" + +} + + +%union { + + char *string; /* Chaîne de caractères */ + +} + + +%define api.pure full + +%parse-param { instr_hooks *hooks } + +%code provides { + +#define YY_DECL \ + int hooks_lex(YYSTYPE *yylvalp) + +YY_DECL; + +} + + +%token NAME EQ + +%type <string> NAME + + +%% + + +hookings : /* empty */ + | hookings hooking + +hooking : NAME EQ NAME { register_hook_function(hooks, $1, $3); } + + +%% + + +/****************************************************************************** +* * +* Paramètres : hooks = structure impliquée dans le processus. * +* msg = message d'erreur. * +* * +* Description : Affiche un message d'erreur suite à l'analyse en échec. * +* * +* Retour : 0 * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int yyerror(instr_hooks *hooks, char *msg) +{ + printf("hooks yyerror line %d: %s\n", yyget_lineno(), msg); + + return 0; + +} + + +/****************************************************************************** +* * +* Paramètres : hooks = structure à constituer à partir de données lues. * +* raw = données brutes à analyser. * +* * +* Description : Interprête des données relatives à un champ de bits. * +* * +* Retour : true si l'opération s'est bien déroulée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool load_hooks_from_raw_line(instr_hooks *hooks, const char *raw) +{ + bool result; /* Bilan à faire remonter */ + YY_BUFFER_STATE state; /* Support d'analyse */ + int status; /* Bilan de l'analyse */ + + state = yy_scan_string(raw); + + status = yyparse(hooks); + + result = (status == 0); + + yy_delete_buffer(state); + + return result; + +} diff --git a/tools/d2c/hooks/manager.c b/tools/d2c/hooks/manager.c new file mode 100644 index 0000000..8e7ae77 --- /dev/null +++ b/tools/d2c/hooks/manager.c @@ -0,0 +1,169 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * manager.c - prise en compte d'une syntaxe du langage d'assemblage + * + * Copyright (C) 2014 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 "manager.h" + + +#include <malloc.h> +#include <string.h> + + +#include "../helpers.h" + + + +/* Paramèter d'une fonction de renvoi */ +typedef struct _instr_func +{ + char *type; /* Type de fonction définie */ + char *name; /* Désignation humaine */ + +} instr_func; + +/* Liste des fonctions de renvoi pour une instruction */ +struct _instr_hooks +{ + instr_func *funcs; /* Liste de fonctions présentes*/ + size_t func_count; /* Taille de cette liste */ + +}; + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée une liste de fonctions à lier à une instruction. * +* * +* Retour : Nouvelle structure prête à emploi. * +* * +* Remarques : - * +* * +******************************************************************************/ + +instr_hooks *create_instr_hooks(void) +{ + instr_hooks *result; /* Définition vierge à renvoyer*/ + + result = (instr_hooks *)calloc(1, sizeof(instr_hooks)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : hooks = gestionnaire d'un ensemble de fonctions associées. * +* * +* Description : Supprime de la mémoire une liste de fonctions liées. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void delete_instr_hooks(instr_hooks *hooks) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < hooks->func_count; i++) + { + free(hooks->funcs[i].type); + free(hooks->funcs[i].name); + } + + if (hooks->funcs != NULL) + free(hooks->funcs); + + free(hooks); + +} + + +/****************************************************************************** +* * +* Paramètres : hooks = gestionnaire d'un ensemble de fonctions associées. * +* type = type de fonction à enregistrer pour une instruction. * +* name = désignation de la fonction à associer. * +* * +* Description : Enregistre l'utilité d'une fonction pour une instruction. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void register_hook_function(instr_hooks *hooks, char *type, char *name) +{ + instr_func *func; /* Nouvelle prise en compte */ + + hooks->funcs = (instr_func *)realloc(hooks->funcs, ++hooks->func_count * sizeof(instr_func)); + + func = &hooks->funcs[hooks->func_count - 1]; + + func->type = make_string_upper(type); + func->name = strdup(name); + +} + + +/****************************************************************************** +* * +* Paramètres : hooks = gestionnaire d'un ensemble de fonctions associées. * +* fd = descripteur d'un flux ouvert en écriture. * +* * +* Description : Associe dans le code des fonctions à une instruction. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool write_hook_functions(const instr_hooks *hooks, int fd) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + instr_func *func; /* Nouvelle prise en compte */ + + result = true; + + for (i = 0; i < hooks->func_count && result; i++) + { + func = &hooks->funcs[i]; + + dprintf(fd, "\t\tg_arch_instruction_set_hook(instr, IPH_%s, (instr_hook_fc)%s);\n", + func->type, func->name); + + } + + if (hooks->func_count > 0 && result) + dprintf(fd, "\n"); + + return result; + +} diff --git a/tools/d2c/hooks/manager.h b/tools/d2c/hooks/manager.h new file mode 100644 index 0000000..e3d51b6 --- /dev/null +++ b/tools/d2c/hooks/manager.h @@ -0,0 +1,51 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * manager.h - prototypes pour la prise en compte d'une hookse du langage d'assemblage + * + * Copyright (C) 2014 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/>. + */ + + +#ifndef _TOOLS_D2C_HOOKS_MANAGER_H +#define _TOOLS_D2C_HOOKS_MANAGER_H + + +#include <stdbool.h> + + + +/* Liste des fonctions de renvoi pour une instruction */ +typedef struct _instr_hooks instr_hooks; + + + +/* Crée une liste de fonctions à lier à une instruction. */ +instr_hooks *create_instr_hooks(void); + +/* Supprime de la mémoire une liste de fonctions liées. */ +void delete_instr_hooks(instr_hooks *); + +/* Enregistre l'utilité d'une fonction pour une instruction. */ +void register_hook_function(instr_hooks *, char *, char *); + +/* Associe dans le code des fonctions à une instruction. */ +bool write_hook_functions(const instr_hooks *, int); + + + +#endif /* _TOOLS_D2C_HOOKS_MANAGER_H */ diff --git a/tools/d2c/hooks/tokens.l b/tools/d2c/hooks/tokens.l new file mode 100644 index 0000000..6aebe87 --- /dev/null +++ b/tools/d2c/hooks/tokens.l @@ -0,0 +1,26 @@ + +%top { + +#include "grammar.h" + +} + + +%option noyywrap +%option nounput +%option noinput +%option yylineno +%option noyy_top_state + + +%% + + +" " { } + +[ \t\n]+ { } +[a-z_][a-z0-9_]* { yylvalp->string = strdup(yytext); return NAME; } +"=" { return EQ; } + + +%% |