/* Chrysalide - Outil d'analyse de fichiers binaires * operand.c - opérandes de substitution pour variables * * Copyright (C) 2009-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 Chrysalide. If not, see . */ #include "operand.h" #include #include #include /* Définition d'un opérande de substitution pour variable de pile (instance) */ struct _GStackVarOperand { GArchOperand parent; /* Instance parente */ const GBinRoutine *routine; /* Routine d'appartenance */ const GX86ModRMOperand *child; /* Opérand d'origine substitué */ }; /* Définition d'un opérande de substitution pour variable de pile (classe) */ struct _GStackVarOperandClass { GArchOperandClass parent; /* Classe parente */ }; /* Initialise la classe des opérandes de substitution. */ static void g_stack_var_operand_class_init(GStackVarOperandClass *); /* Initialise l'instande d'un opérandes de substitution. */ static void g_stack_var_operand_init(GStackVarOperand *); /* Indique le type défini pour un opérande de substitution pour variable de pile. */ G_DEFINE_TYPE(GStackVarOperand, g_stack_var_operand, G_TYPE_ARCH_OPERAND); /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des opérandes de substitution. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_stack_var_operand_class_init(GStackVarOperandClass *klass) { } /****************************************************************************** * * * Paramètres : operand = instance à initialiser. * * * * Description : Initialise l'instande d'un opérandes de substitution. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_stack_var_operand_init(GStackVarOperand *operand) { } /****************************************************************************** * * * Paramètres : routine = routine d'appatenance de l'opérande. * * child = opérande d'origine à substituer. * * * * Description : Crée un opérande de substitution pour variable de pile. * * * * Retour : Instruction mise en place. * * * * Remarques : - * * * ******************************************************************************/ GArchOperand *g_stack_var_operand_new(const GBinRoutine *routine, const GX86ModRMOperand *child) { GStackVarOperand *result; /* Opérande à retourner */ result = g_object_new(G_TYPE_STACK_VAR_OPERAND, NULL); result->routine = routine; result->child = child; return G_ARCH_OPERAND(result); } #if 0 /****************************************************************************** * * * Paramètres : operand = opérande à transcrire. * * format = format du binaire manipulé. * * buffer = zone de texte à venir compléter. * * iter = point d'insertion du nouveau texte. * * * * Description : Ajoute à un texte GTK le contenu d'un opérande. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_stack_var_operand_add_to_gtk_buffer(const GStackVarOperand *operand, const GExeFormat *format, GtkTextBuffer *buffer, GtkTextIter *iter) { const GImmOperand *displacement; /* Décalage supplémentaire */ size_t value; /* Position dans la pile */ bool negative; /* Direction dans la pile */ size_t index; /* Indice de la variable */ char name[32]; /* Nom de la variable */ displacement = g_x86_mod_rm_operand_get_displacement(operand->child); g_imm_operand_to_size_t(displacement, &value, &negative); g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, "[", 1, RTT_HOOK); index = g_binary_routine_get_var_index_from_offset(operand->routine, value, negative); snprintf(name, 32, "%s%u", negative ? "local" : "arg", index); g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, name, strlen(name), RTT_VAR_NAME); g_content_exporter_insert_with_gtk_tag(G_CONTENT_EXPORTER(operand), buffer, iter, "]", 1, RTT_HOOK); } #endif