Дизассемблер 2.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mika0x65, 9 июл 2009.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Странно, второй день подряд не могу попасть в свою предыдущую тему. Не выкачивается весь HTML. Происходит это только в том случае, если залогинен. Модераторы, скиньте, пожалуйста, эту тему в этот пост: http://wasm.ru/forum/viewtopic.php?id=33513 . Заранее благодарен.

    bugaga
    Не, я вообще не понял "кто на ком стоял" :). Что делает сервер? Что делает клиент? Как взаимодействуют? И для чего?

    Synth
    Щупатели нужны, причем очень. Мне страшно не хватает времени на тестирование, особенно вдумчивого -- всякие необычные комбинации префиксов, например. Если желание еще не пропало, постучись, пожалуйста, в ICQ (номер в профиле), разберемся.

    По поводу пожеланий.
    Флаги есть. Я просто забыл внести их в выходную структуру :).
    Код (Text):
    1. uint8_t tested_flags; //Флаги, которые тестирует инструкция.
    2. uint8_t modified_flags;  //Флаги, которые модифицирует инструкция.
    3. uint8_t set_flags;  //Флаги, которые устанавливает инструкция.
    4. uint8_t cleared_flags; //Флаги, которые очищает инструкция.
    5. uint8_t undefined_flags; //Неопределнные флаги.
    Все эти флаги находятся в таблицах, надо будет скопировать их в результат. Черт, опять выходная структура подрастет.

    Почему не надо убирать длину инструкции? Она вернется как результат вызова ф-ии дизассемблирования.

    Не совсем понял, как и зачем :).

    Нечто подобное есть: наличие modrm/sib отображается во флагах инструкции. Наличие imm/rel/disp можно выяснить из операндов. Хотя, флаги инструкции почти не заполнены, можно будет внести туда информацию о imm/rel/etc. С другой стороны, хотелось бы избежать дублирования информации. Может лучше заполнить флаги чем-то более полезным?

    С этим несколько сложнее. Дизассемблер, как я говорил, скорее движек для дизассемблирования, чем дизассемблер :). Т.е. о "потоковом" дизассемблировании я пока не думал.

    dendi
    Прикинул, в принципе, из выходной структуры можно собрать инструкцию заново. Но сначала надо дизассемблер закончить :).

    s0larian
    Восьми бит не хватит. Инструкций больше чем 256.

    Насчет многопоточности и скорости -- я не против многопоточности и скорости. С другой стороны, если на дизассемблирование уходит секунда, то разница даже на четырех ядрах не будет особо заметна. Тем более, что алгоритм дизассемблирования не очень сложный и выполняется довольно быстро.

    На libdisasm я смотрел. Вообще, мой дизассемблер на него очень похож, т.к. там отличные идеи, которые просто нельзя не подобрать. Только рекурсию в поиске в таблице я убрал, т.к. не нужна, на мой взгляд. Ну и 64 бита у меня поддерживаются.


    --
    Забыл сказать: Sol_Ksacap предложил ввести Unicode для мнемоник. Сделаю так: мнемоники будут TCHAR. Чтобы можно было собрать как удобнее.

    Судьба типа операнда REL, похоже, никого не волнует. Раз возражений нет, убираю его. Инструкции jcc/call/jmp будут иметь операнд типа IMM. Тем более, что разницы между REL и IMM никакой, кроме названия.
     
  2. Synth

    Synth New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2007
    Сообщения:
    50
    длину убирать не надо, иногда в процессе работы к ней нужно иметь возможность обратиться... не помню уже где, но где-то мне это нужно было.

    рел убирать не надо, он нужен! пусть будет обычный DWORD. я по карйней мере считаю что должно быть так.

    по поводу юнионов на модрм. в ХДЕ32 это сделано так:
    Код (Text):
    1.     BYTE    modrm;      /* ModR/M byte                                   */
    2.     BYTE    modrm_mod;  /*   mod field of ModR/M                         */
    3.     BYTE    modrm_reg;  /*   reg field of ModR/M                         */
    4.     BYTE    modrm_rm;   /*   r/m field of ModR/M                         */
    не юнион, но всё доступно

    по поводу составных частей - имм может быть 0, и фиг ты тестанёшь его на наличие этой части в этой инструкции без табличного флага )
     
  3. Synth

    Synth New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2007
    Сообщения:
    50
    да, и ещё - имхо пофиг выходные размеры и прочие заморочки с размерами. для любителей мини - есть ХДЕ32. а то что делаешь ты - это другое. тут должна быть информативность, местами даже избыточность информации, для удобства юзабилити. ИМХА!
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну, вопрос с длиной можно решить довольно просто:

    Код (Text):
    1. struct INSTRUCTION_EX
    2. {
    3.         struct INTRUCTION instr;
    4.         uint8_t len;
    5. };
    Т.е. небольшое расширение решит проблемы страждущих :).

    Ты мог бы привести пример, когда REL реально пригодится? Мне, например, в голову не приходит так сразу. Хотя убирать тоже не хочется. А щупатель возмущен его наличием :).

    Я не стал разбирать modrm/sib. Просто копирую их в выходную струтуру, и все. По сути, они уже разобраны -- есть все операнды, и их типы. Для адреса я сделал свой modrm/sib байт. С его помощью можно унифицированно подойти к разобру адреса, независимо от того, как он описан, с помощью modrm или sib.
    Код (Text):
    1.         struct ADDR
    2.         {
    3.             uint8_t seg; //сегментный регистр.
    4.             uint8_t mod; //мое поле mod. Битовая маска, описывающая наличие base/index/scale/disp.
    5.             uint8_t base; //код базового регистра.
    6.             uint8_t index; //код индексного регистра.
    7.             uint8_t scale; //множитель (1/2/4/8).
    8.         } addr;
    Думаю, такое кодирование охватывает большинство нужд. Ну а для специфики остаются скопированные байты modrm/sib.

    Не уловил. Я всегда точно знаю, присутствует ли imm, или нет. А его значение меня не волнует. Оно в любом случае будет скопировано в результирующую инструкцию и расширено со знаком до восьми байт.

    В каком-то смысле согласен. Я просто хочу найти золотую середину. И просто так выбрасывать байты на ветер мне жалко :).
     
  5. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    1. REL не нужен однозначно. Все достаточно легко описывается с помощью IMM.
    2. Мнемоники тоже не для всех целей нужны, поэтому, возможно, имеет смысл сделать их наличие опциональным.
    3. C UNICODE больше геморроя. В большинстве программ, даже в юникодных, можно обойтись без трансляции. Ну а тип TCHAR вообще разрушит сложившуюся кроссплатформенную идиллию :)
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    1. Ок, убираю.
    2. Тут надо подумать.
    3. Да, видимо, придется свою поддержку Unicode сделать.
     
  7. Synth

    Synth New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2007
    Сообщения:
    50
    для начала по поводу длины. и зачем мне расширять? ))) расширить можно всё что угодно )

    Код (Text):
    1.             else // is_rel_jump || is_rel_call
    2.                 jump_rva = pInstrFrom->rel32 + sign_extend_to_32(pInstrFrom->rel8) + pInstrFrom->OldRVA + pInstrFrom->len;
    ну вот примерно так например у меня в коде. я юзаю ХДЕ32

    по поводу имм = 0. это я всё говорю что практически для дальнейших целей бывает нужно узнать, юзает ли УЖЕ ОТДИЗАСМЛЕННАЯ функа имм. т.е. я продизассемблировал программу, начинаю анализ... и гдето у меня идёт if в зависимости юзает ли команда имм или нет.
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ну так REL никуда не исчезает, вместо него будет IMM. Логика та же, просто название другое.

    Насчет IMM все равно не уловил :). У инструкции есть несколько операндов, наличие/отсутствие операнда описывается флагом OPERAND_PRESENT. Тип тоже известен. Если OPERAND_PRESENT выставлен и тип операнда -- IMM, то в поле value лежит его значение.
     
  9. Synth

    Synth New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2007
    Сообщения:
    50
    ммм
    теперь уловил я ) таки да, именно это я и имел ввиду. но составные части, которые описывал я - они нужны больше для создания готовых инструкций.
     
  10. Mika0x65

    Mika0x65 New Member

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