diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2008-07-27 23:43:10 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2008-07-27 23:43:10 (GMT) | 
| commit | 0164ddde7b01a6e3e3aa84ebdeb4ea9b381f063a (patch) | |
| tree | 8ca31386754fa174fc1d94cedc958d7344723bc4 /src | |
| parent | 1bf9c5ebe8bb3326e10491974cd43b221e2a56a1 (diff) | |
Fixed a bug when reading immediate values.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@8 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/operand.c | 13 | ||||
| -rw-r--r-- | src/binary.c | 94 | 
2 files changed, 97 insertions, 10 deletions
| diff --git a/src/arch/operand.c b/src/arch/operand.c index cd7c2b4..33807bc 100644 --- a/src/arch/operand.c +++ b/src/arch/operand.c @@ -133,19 +133,18 @@ bool fill_imm_operand(asm_operand *operand, AsmOperandSize size, const uint8_t *              *pos += 1;              break;          case AOS_16_BITS: -            operand->value.val16 = data[*pos] || (data[*pos + 1] << 8); +            operand->value.val16 = data[*pos] | (uint16_t)data[*pos + 1] << 8;              *pos += 2;              break;          case AOS_32_BITS: -            operand->value.val32 = data[*pos] || (data[*pos + 1] << 8) || (data[*pos + 2] << 16); +            operand->value.val32 = data[*pos] | (uint32_t)data[*pos + 1] << 8 +                | (uint32_t)data[*pos + 2] << 16 | (uint32_t)data[*pos + 3] << 24;              *pos += 4;              break;          case AOS_64_BITS: -            /* -            operand->value.val64 = data[*pos] || (data[*pos + 1] << 8) || (data[*pos + 2] << 16) -                || (data[*pos + 3] << 24) || (data[*pos + 4] << 32) || (data[*pos + 5] << 40) -                || (data[*pos + 6] << 48) || (data[*pos + 7] << 56); -            */ +            operand->value.val64 = data[*pos] | (uint64_t)data[*pos + 1] << 8 | (uint64_t)data[*pos + 2] << 16 +                | (uint64_t)data[*pos + 3] << 24 | (uint64_t)data[*pos + 4] << 32 | (uint64_t)data[*pos + 5] << 40 +                | (uint64_t)data[*pos + 6] << 48 | (uint64_t)data[*pos + 7] << 56;              *pos += 8;              break;      } diff --git a/src/binary.c b/src/binary.c index fcbb49f..a026021 100644 --- a/src/binary.c +++ b/src/binary.c @@ -24,18 +24,97 @@  #include "binary.h" +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/types.h> + + +  #include "arch/processor.h" + +/* Charge en mémoire le contenu d'un fichier. */ +uint8_t *map_binary_file(const char *, size_t *); + + + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : filename = nom du fichier à charger.                         * +*                length   = taille des données mises en mémoire. [OUT]        * +*                                                                             * +*  Description : Charge en mémoire le contenu d'un fichier.                   * +*                                                                             * +*  Retour      : Adresse du contenu binaire ou NULL en cas d'échec.           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +uint8_t *map_binary_file(const char *filename, size_t *length) +{ +    uint8_t *result;                        /* Données à retourner         */ +    int fd;                                 /* Fichier ouvert en lecture   */ +    struct stat info;                       /* Informations sur le fichier */ +    int ret;                                /* Bilan d'un appel            */ + +    fd = open(filename, 0, O_RDONLY); +    if (fd == -1) +    { +        perror("open()"); +        return NULL; +    } + +    ret = fstat(fd, &info); +    if (ret == -1) +    { +        perror("fstat()"); +        close(fd); +        return NULL; +    } + +    *length = info.st_size; + +    result = (uint8_t *)mmap(NULL, *length, PROT_READ, MAP_PRIVATE, fd, 0); +    if (result == MAP_FAILED) +    { +        perror("mmap()"); +        result = NULL; +    } + +    ret = close(fd); +    if (ret == -1) +        perror("close()"); + +    return result; + +} + + + + + + +  void fill_snippet(GtkSnippet *snippet)  { +    size_t length; +    uint8_t *bin_data; +    int ret; + +      asm_processor *proc;      asm_instr *instr; -    //    char *data = "\x66\xba\x0c\x00\x00\x00\x66\xb9\x28\x00\x00\x00\x66\xbb\x01\x00\x00\x00\x66\xb8\x04\x00\x00\x00\xcd\x80\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a"; +    uint8_t *data = "\x66\xba\x0c\x00\x00\x00\x66\xb9\x28\x00\xee\x00\x66\xbb\x01\x00\x00\x00\x66\xb8\x04\x00\x00\x00\xcd\x80\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a"; -    uint8_t *data = "\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x90"; +    //uint8_t *data = "\x66\xbb\x00\x00\x00\x00\x66\xb8\x01\x00\x00\x00\xcd\x80\x90";      off_t pos;      off_t len; @@ -48,8 +127,17 @@ void fill_snippet(GtkSnippet *snippet)      proc = create_x86_processor();      pos = 0; -    len = 15; +    len = 0x28; + + + +    bin_data = map_binary_file("/tmp/hello", &length); + +    printf(" ~~ bin_data ~~ :: %p\n", bin_data); + + +    ret = munmap(bin_data, length);      gtk_snippet_set_processor(snippet, proc); | 
