Дизассемблеры длин

Тема в разделе "WASM.BEGINNERS", создана пользователем _taha_, 28 мар 2007.

  1. _taha_

    _taha_ New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    9
    Понимаю, что темы уже были, но там не то. Хочу задать пару конкретных вопросов

    У меня такой вопрос... блин даж не знаю с чего начать...
    ну вот инструкция имеет такой формат: байт префикса, байт кода, байт ModR/M, байт SIB, imm, displacement.
    Естественно обязателен только байт кода. С префиксом всё понятно, тупо через cmp проверяем. Дальше идёт

    code. Вот тут начинаются вопросы... Как узнал из неоторых книг, code может иметь следующий формат:

    yyyyy:xxx (например push <reg>)
    где yyyyy - код инструкции, xxx - регситр

    ----------------------------------------------------------------------------
    PUSH EAX --> Let’s study this instruction
    The opcode for this mnemonic is 0x50, looking at the opcode as a single byte
    doesn’t help us a lot, so let’s look at the binary form of this opcode.

    0x50 == 01010000b

    and then let’s make the 8-Bits look like this

    --> 01010:000 ==
    Код (Text):
    1. <rrr>
    2.  
    3. What we’ve done is that we grouped the leftmost 5-Bits together (CODE) and
    4. the the rightmost three bits together (register).
    5.  
    6. • The 5-Bits (01010) are the [CODE] block responsible for the instruction
    7. (PUSH <reg>)
    8. • The 3-Bits (000) are the <rrr> or the register code for the register (eax)
    9. ----------------------------------------------------------------------------
    10.  
    11. а может иметь вот такой
    12.  
    13. yyyyyy.d.w
    14. где yyyyyy - код инструкции, d - направление (reg->imm), w - размер (dword/byte)
    15. ну ту ещё ModR/M будет. Вот пример:
    16.  
    17. 8BD0  MOV EDX,EAX
    18. [100010.1.1][11.010.000]
    19.   byte code   ModR/M
    20.  
    21. Вопрос в следующем: Как дизассемблеры длин отличают первый формат,от второго и узнают о наличии ModR/M? Хотел сам ответить на свой вопрос и скачал HDE (маленький такой дизасм длин). Потрасерив пример и почитав сорсы, сделал вывод. Он проверяет на наличие префикса, если оного нет, прибавляет к началу некой таблицы (содержащий байты и пронумерованную от 0 до FF) значение code, получая некую константу забитую в таблицу. Далее взависимости от неё он и пляшет, т.е. либо считывает значения из ModR/M и SIB, либо сразу  переходит в конец и считает длину (тут много вариантов). Тогда заданный вопрос отпадает и возникает следующий: Неужели незя обойтись без таблицы?
    22.  
    23. да и:
    24.  
    25. [quote]Taha (00:34:11 28/03/2007)
    26. hde
    27.  
    28. ProTeuS (00:34:30 28/03/2007)
    29. сорцы ж есть )[/quote]
    30. А я не понял где смеяться) Мож кто объяснит.
    31.  
    32. В конце книги приведён скелет дизассемблера
    33.  
    34. ----------------------------------------------------------------------------------
    35. – Use this byte to jump to the necessary procedure to decode this byte
    36.   (using a jump-table)
    37.     • The (jump-table) will -jump to the corresponding decoding procedure
    38.        for each [CODE] byte
    39.     • Each decoding procedure will use (all/some) of the following procedures
    40.       · A procedure t...
    41. ----------------------------------------------------------------------------------
    42.  
    43. И это всёже значит - от таблицы не убежишь?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    да.
    Хотя некоторые делают switch'em, он по сути это та же таблица.
     
  3. _taha_

    _taha_ New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    9
    сенкс

    а вот по поводу hde...

    что там смешного? я так и не узнал. вот линк
    http://patkov-site.narod.ru/download/hde.zip
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    _taha_
    Лучше делать таблицу - размер для таких вещей критичен. Глять Catch32. Хотябы на него стоит равняться.
     
  5. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    я бы сказал, не глянь, а применяй! Этот движок прошел хорошее тестирование и профессионалами проверен! Смысл изобретать новые грабли?
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    EvilsInterrupt
    В принцыпе ты прав. Я сам его юзал. И знаю что он проверен реально профессионалами. 1.4 кб весит если не ошибаюсь. Что еще надо для счастья :)

    А так хотелось бы такое же чудо но для x86_64 платформы.
     
  7. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    TermoSINteZ
    Зная автора этого проекта, я думаю если кто продолжит его проект, он даже обрадуется! Но это мое мнение
     
  8. _taha_

    _taha_ New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    9
    перерыл все поисковики, ничего....
    поиск по форуму ничего не дал...
    в асе ни у кого нет...

    потом заметил
    вобщем Catchy32 )))))

    спасибо большое, буду разбираться
     
  9. 666666

    666666 New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    2
    Разобрался ;)?

    P.S. Рекомендую разбираться со стаканом анаши, под коей он и писался. А для ...64 придется наверное 2 уже.
     
  10. _taha_

    _taha_ New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    9
    ага, почти
    у меня было токо две трети стакана))