Дизассемблер [Mediana]

Тема в разделе "WASM.PROJECTS", создана пользователем Mika0x65, 26 мар 2010.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Зачем callback? Я проверяю длину инструкции всякий раз после считывания ее части, чтобы длина не превышала 15 байт. Можно сделать эту проверку до чтения, чтобы уложиться ровно в 15 байт, для всеобщего спокойствия, но это не очень красиво с т.з. архитектуры. Думаю стоит написать ф-ию, которая получает значение из потока инструкций и контролирует длину. Так я смогу локализовать установку ошибки ERR_TOO_LONG в одном месте.
     
  2. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    Код (Text):
    1.     base = malloc(IN_BUFF_SIZE);
    2.     ptr = base;
    3.     end = ptr + IN_BUFF_SIZE;
    4.  
    5.    /* ... заполняем буфер */
    6.  
    7.     while(ptr < end)
    8.     {
    9.         res = medi_disassemble(ptr, &instr, &params);
    10.         /* ... */
    11.         ptr += res;
    12.         params.base += res;
    13.     }
    дано:
    ptr = end -1;
    *ptr = 0xF0; // LOCK
    -------------
    проверка условия: ptr < end ? -> да
    ------------
    вызываем функцию medi_disassemble;
    1. читается байт. ага. ето префикс... длина инструкции меньше макс длины...
    2. читаем дальше. "А дальше нельзя, дальше стена".
    тут 2 развития событий - функция выполняется до конца, декодируя байты, расположенные за буфером
    или вылетает исключение.
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну так резервировать надо больше, скажем, на 16 байт. В чем проблема-то?
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Mika0x65
    мне из другой части программы пришло 5 байт, и мне надо узнать что эта за инструкция, я конечно могу забить ее нулями "до упора" но лучше сделать чтото вроде
    f(...., size_t p_MaxSize s=16) и если команда больше чем позволено читать возвращать соответствующий код ошибки
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. #ifdef UNICODE
    2. typedef wchar_t unichar_t;
    3. #define _UT(s) L##s
    4. #define unistrcpy  wcscpy
    5. #define unistrncpy wcsncpy
    6. #define unistrchr  wcschr
    7. #define unistrlen  wcslen
    8. #else
    9. typedef char unichar_t;
    10. #define _UT(s) s
    11. #define unistrcpy  strcpy
    12. #define unistrncpy strncpy
    13. #define unistrchr  strchr
    14. #define unistrlen  strlen
    15. #endif
    А зачем не используешь функции вида *_s ? Их не настолько трудно юзать ;)
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    лучше с префиксом _t
    _tcscpy, _tcslen, _tcscmp и т.д.
    их действительно правильнее юзать
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В help.ru напиши, что использующий либу под unicode пусть декларит не только UNICODE, но и _UNICODE.
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не использую потому, что в *nix этих ф-ий нет, а дизассемблер должен работать как в Win, так и в *nix.

    Вообще, у меня Unicode зависит только от макроопределения UNICODE.
     
  9. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    готов написать что-нибудь эдакое опенсорсное, поначалу взяв Mediana как дизассемблер. тем более опыт в написании таких графов имеется. но это только после того, как мне будут высказаны требования и предложения. лучше даже - конкретное ТЗ.
     
  10. common_up

    common_up New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    85
    Ждем хидеры под фасм.
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    common_up
    Заканчиваю уже. Почти все перевел, несколько мелочей осталось.
     
  12. void_

    void_ New Member

    Публикаций:
    0
    Регистрация:
    15 май 2007
    Сообщения:
    13
    Под масм планируются или самому переписывать придется?
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Под FASM я сделал, но не протестировал. А common_up пропал куда-то :). В принципе, можно сделать и под MASM. Но учитывая, что я им никогда не пользовался, это займет какое-то время...
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    void_
    Так там пару хидеров переписать, минутное дело, собрать и сдампить двиг в бинарь(не понятно почему не сделано), прежде немного изменив таким образом, дабы в начале бинаря был вызов двига, или его сервисов в зависимости от передаваемого ID.
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Есть предложение немного поменять группировку инструкций (Mediana назначает каждой инструкции одну или несколько групп, например, GRP_GEN -- общие инструкции, GRP_SSE -- SSE инструкции и т.д.) С одной стороны, группировку инструкций определял не я, я просто взял их из готового XML файла (http://ref.x86asm.net), немного изменив. С другой стороны, на группировку инструкций сильно влияет цель дизассемблера, турдно угодить сразу всем. Но я постараюсь.

    Вот список групп и их описание:
    Я удалил группы obsolete, prefix, добавил группы VMX, SSE1, SSE2 и т.д. Кто-нибудь хотел бы что-то добавить/убрать/переделать?
     
  16. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    MinGW не хочет компилировать sample.c

     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ох уж этот pstdint.h... Попробуй заменить все подключения pstdint.h на <stdint.h>. Кстати, в дизассемблере есть несколько ошибок, которые я еще не исправил (часть исправил, но еще не выложил). Исправление предположительно будет через неделю.
     
  18. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Я к http://wasm.ru/forum/viewtopic.php?id=41579 прикрутить хочу, в WinGraph32 на выходе что бы удобнее код было анализировать.


    Помогло изменение в mediana.h

    Код (Text):
    1. // #include "pstdint.h"
    2. #include <stdint.h>
    Но при компиляции, уйма предупреждений.
     
  19. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да, их я как раз и исправил в невыложенной версии. Через неделю надеюсь появится время исправить.
     
  20. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Не нашел опции вывода мнемоники в верхнем регистре, внутренней возможности не предусмотрено?