понедельник, 20 июня 2011 г.

god hate us all

а вот например давеча я используя udis86 нарвался на некий файлик, содержащий инструкцию paddd (которая содержится в MMX и якобы должна поддерживаться. Однако же...). Далее последовало внимательное и поучительное разглядывание bug tracker
Судя по всему проект мертв, ибо ни единого бага с сентября 2009 года не было пофикшено. Более того - ssse3/sse4/AES instructions не поддерживаются официально
Несколько подумав полез смотреть другие движки дизассемблера. Требования очень просты - должен собираться под 32/64 бита под windows/linux, в user mode & kernel mode, имена opcodes должны быть легко отключаемы (для экономии места в драйвере например)
Резко стало еще грустнее
  • BeaEngine - полная упячка
  • diStorm - BSD лицензия канешно сильно лучше чем GPL, но файл include/mnemonics.h повергает в адское уныние
  • Mediana - кодировать имена мнемоник в общей с парзером инструкций таблице - полный crap
Остальное даже не решился посмотреть
Проще всего самому добавить/пофиксить все что нужно в том же udis86 чем найти то что требуется на самом деле. Хотя канешно добавление пары семейств команд будет довольно ресурсоемким занятием

PS: добавление инструкции paddd потребовало ровно 4 строчки и установки петона под винду

Список opcodes, не поддерживаемых текущей версией udis86 (из тех что я нашел)
  • paddd
  • короткая форма fabs (без префикса 0f)
  • vmlaunch
  • xgetbv
  • xsetbv
  • xrstor
  • xsave
  • getsec 
  • vmread
  • vmwrite
  • AVX инструкции
Список есс-но никоим образом не претендует на полноту и все такое

19 комментариев:

  1. XED который в PIN tools используется.
    Если только не смущает, то он жирный сильно - несколько сотен килобайт.

    ОтветитьУдалить
  2. он c сорцами ?
    лицензия человеческая ?

    ОтветитьУдалить
  3. Ну все правильно - делайте свой форк. Желательно на GitHub'е, может я даже присоединюсь :)

    ОтветитьУдалить
  4. > может я даже присоединюсь
    ололо, радость то какая нежданная - к нам может быть даже присоединится не осиливший собственного названия для своего бложика придумать !
    я прям весь аж дрожу от открывающихся перспектив, бгг

    ОтветитьУдалить
  5. Какой зеленый и толстый мальчик :) Откуда же столько негатива?

    ОтветитьУдалить
  6. redp, ты все еще веришь в движки написанные чужими дядями ?

    ОтветитьУдалить
  7. можно ведь продолжить списочек вопросов:
    ты все еще используешь компилятор, написанный чужими дядями ?
    ты все еще используешь интернет, изобретенный чужими дядями ?
    ты все еще используешь булеву алгебру, выдуманную чужим дядей ?
    ты все еще живешь в доме, построенном чужими дядями ?
    ты все еще потребляешь колбасу, сделанную чужими дядями из туалетной бумаги ?
    хе-хе
    ты слышал термин "разделение труда" например ?

    ОтветитьУдалить
  8. это все из другой оперы
    ожидай что кто-то разделит то что долго и ресурсоемко

    ОтветитьУдалить
  9. А видишь ли, государыня императрица, пушка - это особь статья, а мортира - это ... тоже особь статья! (с)
    бгг

    ОтветитьУдалить
  10. А можно подробнее про Mediana? Мешает мнемоника в выходной инструкции, или что?

    ОтветитьУдалить
  11. например попробуй ее для драйвера собрать

    ОтветитьУдалить
  12. >например попробуй ее для драйвера собрать

    Вообще, на драйвера планы были -- отчасти для этого был введен Unicode. Я так понимаю, смущает размер таблиц и невозможность отключить в них мнемоники?

    ОтветитьУдалить
  13. код, который отвечает за разбор opcodes, должен быть отделен от куска, который печатает инструкции.
    См. например как это в том же udis86 сделано - можно банально не линковать syn-intel.c в драйвер и все будет работать без него
    Размер при этом тоже важен

    ОтветитьУдалить
  14. А, ну так у меня отделен. Тут проблема с документацией, хотя я это, вроде, описывал. Достаточно убрать или написать #undef макросов:

    //Include/exclude dumping functions.
    #define MEDIANA_CTRL_DUMP
    #define MEDIANA_CTRL_DBG_DUMP

    из файла mediana_ctrl.h и вывод инструкций не будет включен при компиляции.

    ОтветитьУдалить
  15. насколько я помню строчки с именами мнемоник при этом все равно остаются в коде

    ОтветитьУдалить
  16. Да, мнемоника -- это часть таблиц и никуда она не исчезает. Макросы отключают код, который отвечает за вывод инструкции. Была мысль сделать мнемонику вообще отдельно и подключать ее с помощью макроса во время компиляции. Но тогда файл tables.inc будет выглядеть жутко, т.к. каждый элемент, описывающий инструкцию, будет содержать #ifdef ... #endif. Учитывая, что tables.inc и так не подарок, я так делать не стал. Может быть, стоит подумать о такой опции, но перед этим надо посчитать размер таблиц без мнемоник, у меня есть ощущение, что их (таблиц) вклад в размер секции данных -- основной.

    ОтветитьУдалить
  17. можно грубо прикинуть - например в файле tables.inc 2289 OPCODE_DESCRIPTORs, из них 987 пустые. Пусть длина одной мнемоники в среднем 6 байт. Получим 2289 * 4 (размер указателя) + 1302 * 6 = почти -17Kb
    Но и это не все - например размер одной OPCODE_DESCRIPTOR 28байт (под 32бита). Заменив их описание указателем на описание и таким образом имея только один дескриптор для GRP_NULL мы получим 987 * 28 - 2289 * 4 = еще -18Kb

    ОтветитьУдалить
  18. Так, посчитал я, что сколько занимает:

    sizeof(*opcode_descr): 32
    Mnemonics: 7301
    Tables: 71456
    Empty entries: 29504

    Расчеты, в общем-то, почти верны. Можно ввести еще один уровень косвенности, но тут есть проблема. Допустим, у меня есть массив

    struct OPCODE_DESCRIPTOR *opcodes_1byte[] =
    {
    name0,
    name_1,
    NULL
    }

    Вот эти вот name0 и name1 надо как-то генерировать. Можно взять что-то в духе мнемоника_операнды типа add_reg_1byte_const, но выглядеть это будет пугающе. Размер уменьшится на 25 килобайт примерно. И появляется вопрос: а стоит ли уродовать исходник из-за двадцати пяти килобайт? И повлияют ли эти 23 килобайт на драйвер? В общем, у меня сомнения...

    ОтветитьУдалить
  19. хозяин - барин (c)
    я бы на вашем месте например задумался над мета-форматом, из которого можно было простым скриптом генерить tables.inc под всякие цели и бесчеловечные эксперименты

    ОтветитьУдалить