/* OpenIDA - Outil d'analyse de fichiers binaires
* processor.c - gestion générique des architectures
*
* 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 .
*/
#include "processor.h"
#include
#include
#include "instruction-int.h"
#include "processor-int.h"
/******************************************************************************
* *
* Paramètres : proc = architecture visée par la procédure. *
* data = flux de données à analyser. *
* pos = position courante dans ce flux. [OUT] *
* len = taille totale des données à analyser. *
* offset = adresse virtuelle de l'instruction. *
* *
* Description : Décode une instruction dans un flux de données. *
* *
* Retour : Instruction mise en place. *
* *
* Remarques : - *
* *
******************************************************************************/
asm_instr *decode_instruction(const asm_processor *proc, const uint8_t *data, off_t *pos, off_t len, off_t off, uint64_t offset)
{
asm_instr *result; /* Représentation à renvoyer */
off_t old_pos; /* Sauvegarde de la position */
old_pos = *pos;
result = proc->fetch_instr(proc, data, pos, len, offset);
#define NULL ((void *)0)
if (result == NULL)
{
*pos = old_pos;
printf("err while decoding opcode 0x%0hhx at 0x%08llx\n", data[*pos], offset);
result = create_db_instruction(data, pos, len);
}
result->vaddress = offset;
result->offset = off + old_pos;
result->length = *pos - old_pos;
return result;
}
/******************************************************************************
* *
* Paramètres : input = chaîne de caractères à traiter. *
* *
* Description : S'assure qu'une chaîne de caractère tient sur une ligne. *
* *
* Retour : Adresse de la chaîne de caractères modifiée. *
* *
* Remarques : - *
* *
******************************************************************************/
char *escape_crlf_bin_string(char *input)
{
size_t inlen;
regex_t preg;
int ret;
size_t curpos;
regmatch_t pmatch[2];
inlen = strlen(input);
ret = regcomp(&preg, "(\t|\n|\r)", REG_EXTENDED | REG_ICASE);
/* TODO: ret */
for (curpos = 0; regexec(&preg, &input[curpos], 2, pmatch, 0) != REG_NOMATCH; )
{
inlen += 1 + 1;
input = (char *)realloc(input, inlen * sizeof(char *));
memmove(&input[curpos + pmatch[1].rm_eo + 1], &input[curpos + pmatch[1].rm_eo], inlen - 1 - curpos - pmatch[1].rm_eo);
switch (input[curpos + pmatch[1].rm_so])
{
case '\t':
memcpy(&input[curpos + pmatch[1].rm_so], "\\t", 2);
break;
case '\n':
memcpy(&input[curpos + pmatch[1].rm_so], "\\n", 2);
break;
case '\r':
memcpy(&input[curpos + pmatch[1].rm_so], "\\r", 2);
break;
}
curpos += pmatch[1].rm_eo + 1;
}
return input;
}
/******************************************************************************
* *
* Paramètres : proc = architecture visée par la procédure. *
* format = format du binaire manipulé. *
* instr = instruction à traiter. *
* buffer = tampon de sortie mis à disposition. [OUT] *
* len = taille de ce tampon. *
* syntax = type de représentation demandée. *
* *
* Description : Traduit une instruction en version humainement lisible. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void print_hinstruction(const asm_processor *proc, const exe_format *format, const asm_instr *instr, char *buffer, size_t len, AsmSyntax syntax)
{
proc->print_instr(proc, format, instr, buffer, len, syntax);
}