Алгоритм дизассемблирования.

Тема в разделе "WASM.RESEARCH", создана пользователем ERROR_OR, 25 ноя 2006.

  1. ERROR_OR

    ERROR_OR New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    1
    Здравствуйте, Васмовцы. Очень надеюсь на вашу помощь, ибо обратиться больше не к кому. Программирую для себя, в свободное от земных дел время, прогрммированию нигде не учился, поэтому прошу отнестись с пониманием.
    Очень давно уже вынашиваю идею написать дизассемблер, можно сказать это моя мечта, если я это реализую можно считать, что я добился своего в этой области, поэтому очень прошу помочь.

    Я перечитал все подобные темы на форуме, прочёл мануалы интела, изучил, насколько смог, исходники OllyDASM, но поскольку учить меня некому и не программист я по жизни, мне сложно это всё осмыслить, тем более с английским не всё так гладко. Скажите, насколько я понимаю процесс дизассемблирования строится следующим образом:

    1. Определение префиксов команды.
    2. Разбор опкода(т.е. парсинг полей s/w/reg, но из мануалов мне непонятно наличие или отсутствие этих полей в том или ином опкоде, объсните, если не затруднит).
    3. Парсинг байта mod r/m(если можно объясните на чём строится принцип парсинга, я так понял нужно просто загнать те таблицы, что даны в мануалах интела и по ним производить поиск нужного значения?).
    4. Парсинг байта sib(его наличие в команде мне вообще непонятно как определить и как его интерпретировать я тоже затрудняюсь ответить).
    5. Поля смещения и непосредственного операнда(ну тут всё ясно, если я до этого дойду, то справлюсь сам)

    Но самое главное, что должна содержать главная таблица? Насколько я понял из OllyDASM:
    [операнд][длину операнда][мнемонику]

    Это мне понятно, но значение остальных полей загадка:

    const t_cmddata cmddata[] = {
    { 0x0000FF, 0x000090, 1,00, NNN,NNN,NNN, C_CMD+0, "NOP" },
    { 0x0000FE, 0x00008A, 1,WW, REG,MRG,NNN, C_CMD+0, "MOV" },
    { 0x0000F8, 0x000050, 1,00, RCM,NNN,NNN, C_PSH+0, "PUSH" },


    0x0000FF - вот это вообзе загадка всех загадок:) Написано, что это вроде "Mask for first 4 bytes of the command", но зачем эта маска нужна?



    Т.е. я понимаю, что WW указывает на аличие бита W, но откуда узнать наличие этих битов во всех командах?
    Далее на примере того же MOV:

    #define REG 1 // Integer register in Reg field
    #define MRG 12 // Memory/register in ModRM byte


    REG,MRG,NNN - почему именно так, я не пойму?

    Назначение C_XXX+n мне тоже не совсем ясно.

    Помогите разобраться с этой кашей в голове, буду очень вам признателен за это.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Для каждой команды указано.
    Значит плохо читал мануалы. Присутствие этого байта можно определить из ModR/M.
    Текущий байт/word/dword and Mask, и потом сравнивается с опкодом.
    Это как раз чтобы игнорировать изменяющиеся части опкода, биты s,w,reg.
     
  3. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    ERROR_OR
    После п.2 иногда требуется посмотреть на сво-ва опкода и если есть ситуация что перед данным опкодом может стоять 0x66, 0xF2,0xF3, SSE,SSE2 etc команды, нужно глянуть на выделенные префиксы, на этапе парсинга префиксов.

    А вообще, анализирую чужие исходники дизасмов, алгоритма дизассемблирования как такового нет!
    Более по духу мне пришелся сорец движка Ms-Rem

    зы:
    Пиши в личку свою аську!
     
  4. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Где указано? Не вижу и всё тут...

    Ага, вот это увидел, разобрался.

    Текущий b/w/d чего?
    Т.е. например есть команда MOV, она имеет несколько опкодов в зависимости от типа адресации и эта маска позволяет игнорировать тип адресации и выделять непосредственно мнемонику?
     
  5. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Я его тоже долгое время изучал, мне показалось, что рему удалось выделить полную закономерность построения кодов команд, но для изучения прицнипов его дизассемблер совсем не годится, очень трудно даётся мне. А мне как раз и хочется понять всю суть, а не тупо использовать готовые решения.

    PS Удалось-таки зайти под своим аккуантом, ERROR_OR - это я.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну я смотрел у Зубкова, что под руку попало =)
    А так можешь сравнивать разные опкоды одной инструкции. Например mov r/m, r. Для Imm8 и Imm16/32 различается в бите d.
    Входного потока данных.
    8A /r MOV r8,r/m8
    8B /r MOV r32,r/m32
    В таблице OllyDasm
    { 0x0000FE, 0x00008A, 1,WW, REG,MRG,NNN, C_CMD+0, "MOV" }
    Или другой пример
    Push reg, кодируется как 50-58, 0x58 & 0xF8 == 0x50.
     
  7. alkor

    alkor New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2005
    Сообщения:
    16
    Адрес:
    Russia
    Может быть поможет: http://www.wasm.ru/baixado.php?mode=tool&id=210
     
  8. alkor

    alkor New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2005
    Сообщения:
    16
    Адрес:
    Russia
    Может быть поможет: http://www.wasm.ru/baixado.php?mode=tool&id=210
     
  9. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > эта маска позволяет игнорировать тип адресации и выделять непосредственно мнемонику?

    Нет, это означает что ОЛЯ тупо брутфорсит опкоды по своей таблице, накладывая маски. Т по этому скоростью не отличается.
    Хотя на самом деле надо было сделать один switch для простых опкодов, и второй switch для 0x0f, и расставить в них флажки для опкодов - есть mod/rm или нет, некоторые редкие исключения, и т.д.
    Все остальное для х386 элементарно разбирается на основе полученных флажков, префиксов, и последующих байт.
    С расширенным набором есть подводные камни, типа когда fpu опкод с безобидным префиксом оказывается sse3 командой, это тока по докам внимательно смотреть =)
     
  10. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    так для ольки скорость и не нужна этож тебе не емуль в антивире и этой хватает :)

    к стати доктор ты уже того трояна миссис что я давал задетектил ? ;)
     
  11. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    ахтунк Ахтунк

    Миссис незамедлительно задавайте ваши исходники а стало быть и минусдейный шелкод хранящийся по адресу

    Z:\NewProjects\spambot\new\driver\objfre\i386\driver.pdb

    В бэхоце иначе , каманда бравых войдохедов примет меры :)

    Ваши данные уходят тем кто :)))