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

Тема в разделе "WASM.RESEARCH", создана пользователем zss, 23 авг 2004.

  1. zss

    zss New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    40
    Адрес:
    Чехов-2
    Может кто когда-нибудь пытался написать небольшой дизассемблер ?



    Есть описание форматов инструкций, опкодов и т.д.



    Хотелось бы узнать сам алгоритм (вопрос также относится к быстродействию и определению защиты от дизассемблировани).



    Может также у кого-нибудь есть готовые структуры данных для облегчения ?



    З.Ы. Если есть, то можно ссылочку на разбор алгоритма и т.п.



    Спасибо
     
  2. kyprizel

    kyprizel New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    232
    Адрес:
    TSK
    z0mbie.host.sk :) почти классика
     
  3. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    z0mbie тебя просветит - это факт :)



    Если ты о быстродействии дизассемлирования инструкций, то это происходит почти мгновенно, другое дело анализ надизасембленного это достаточно долго притом что без использования эмулятор качество листинга очень низкое.



    Можешь глянуть сюда

    http://wasm.ru/forum/index.php?action=vthread&forum=5&topic=6618

    это первые две версии моего кривого движка :)

    Сейчас замочу парочку багов и выложу третью версию

    с примером использования (бинарный дизассемлер 32бита)
     
  4. zss

    zss New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    40
    Адрес:
    Чехов-2
    Все дело в том, что у меня есть описание инструкций, опкодов и т.д. Но я не знаю с чего начинать.



    Я понимаю, что необходимо начинать проверку на префиксы. А если их не один ?



    Просто хочу Вас попросить привести сам алгоритм разбора.



    З.Ы А вообще кто-нибудь пытался создать совместный дизасм с обсуждением на форуме - может из этого вышло бы что - нибудь оригинальное (а то посмотрев многие исходники приходишь к выводу, что все пишут одно и тоже, изобретая велосипед)



    З.Ы.Ы. Кстати, а почему дизассемблирование ведется побайтово. Ведь процессор - это ведь в своем роде конечный автомат (или он тоже ведет разбор побайтово ?)

    Если нет, то можно попытаться смоделировать его работу - это будет намного быстрее.
     
  5. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Я это делал так: прописывал все инструкции по номерам потом тип адресации а потом регистры - это все уже побитно (в одном байте много чего закодировано). Для двухбайтных инструкций сначало распознается первый байт а потом сама инструкция - кобинация байтов всегда устойчива. Самое сложное это вызовы и переходы по регистрам (ер. сall [edx], jmp eax и.т.п). Да и обычные условные переходы тоже создают много неудобств. Т.к. я стараюсь дизасмить по ходу исполнения программы бо код может изменятся - ер. самомодифицирующиеся.





    Вот тебе куски моего самодельного дизасма для примера


    Код (Text):
    1.  
    2.         sub     eax,eax
    3.         lodsb
    4.         mov     edx,opcode[eax*4]
    5.         call    edx
    6.         ret
    7. .......
    8.  
    9. modrm:
    10.         sub     ebx,ebx
    11.         lodsb
    12.         mov     bl,al
    13.         shr     al,6
    14.         mov     operand_size,putOpSize
    15.         mov     edx,addressing[eax*4]
    16.         mov     eax,offset _reg_
    17.         call    edx
    18.         ret
    19. modrmb:
    20.         sub     ebx,ebx
    21.         lodsb
    22.         mov     bl,al
    23.         shr     al,6
    24.         mov     operand_size,putOpSizeb
    25.         mov     edx,addressing[eax*4]
    26.         mov     eax,offset _regb_
    27.         call    edx
    28.         ret
    29.  
    30.  
    31. m_a:
    32.         mov     eax,moff32
    33.         mov     [addr_type+20],eax
    34.         mov     [sib_base+20],eax
    35.         call    m_
    36.         call    dword ptr [edx]
    37.         mov     byte ptr [edi],']'
    38.         inc     edi
    39.         ret
    40. ...............
    41. ................
    42. m_:
    43.         sub     edx,edx
    44.         mov     dl,bl
    45.         shr     dl,3
    46.         and     dl,7
    47.         shl     dl,2
    48.         call    operand_size
    49.         add     edx,offset addr_typ
    50.         ret
    51. m_a:
    52.         mov     eax,moff32
    53.         mov     [addr_type+20],eax
    54.         mov     [sib_base+20],eax
    55.         call    m_
    56.         call    dword ptr [edx]
    57.         mov     byte ptr [edi],']'
    58.         inc     edi
    59.         ret
    60. mb_a:
    61.         mov     eax,ebp_a
    62.         mov     [addr_type+20],eax
    63.         mov     [sib_base+20],eax
    64.         call    m_
    65.         call    dword ptr [edx]
    66.         mov     byte ptr [edi],'+'
    67.         inc     edi
    68.         push    [esi]
    69.         call    hex4outb
    70.         mov     byte ptr [edi],']'
    71.         inc     edi
    72.         add     esi,2
    73.         ret
    74. ..........
    75.  
    76. add_rmb:
    77.         mov     dword ptr [edi],'       dda'
    78.         add     edi,4
    79.         call    _rmb
    80.         ret
    81. add_rm:
    82.         mov     dword ptr [edi],'       dda'
    83.         add     edi,4
    84.         call    _rm
    85.         ret
    86. add_rb:
    87.         mov     dword ptr [edi],'       dda'
    88.         add     edi,4
    89.         call    _rb
    90.         ret
    91. add_r:
    92.         mov     dword ptr [edi],'       dda'
    93.         add     edi,4
    94. ..........
    95.  
    96.  
    97. _rmb:
    98.         call    modrmb
    99.         mov     edx,offset __regb
    100.         call    regb
    101.         ret
    102. _rm:
    103.         call    modrm
    104.         mov     edx,offset __reg
    105.         call    reg
    106.         ret
    107. _rb:
    108.         mov     edx,offset regb__
    109.         call    regb
    110.         call    modrmb
    111.         ret
    112. _r:
    113.         mov     edx,offset reg__
    114.         call    reg
    115.         call    modrm
    116.         ret
    117. ........
    118. .data
    119. opcode dd add_rmb,add_rm,add_rb,add_r,add_accb,add_acc,push_es,pop_e........
    120. addressing dd m_a,mb_a,md_a,reg_a
    121. ....................
    122. sib_base dd eax_a,ecx_a,edx_a,ebx_a,esp_a,0,esi_a,edi_a
    123. sib_index dd eax_p,ecx_p,edx_p,ebx_p,nema_,ebp_p,esi_p,edi_p
    124.  




    Это начальная часть проги, а вообще дизасм это очень имхо сложная задача.
     
  6. andruha123

    andruha123 New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2004
    Сообщения:
    15
    Адрес:
    USA, CA
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Эх, бездельники, Свина на вас нету. Он бы показал, что здесь вам не тут и как сапоги на пьяную голову одевать.

    zzzyab - ассемблер на принципе таблиц - это сакс. Мне лень искать, но где-то на форуме Свин высказал все, что думает по этому поводу.



    zss

    Ты не мучься - ты движок от OllyDbg возьми. На сайте автора лежит. В движке Свин копался - поэтому движок вроде ничего будет!
     
  8. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Я нашел тему svina про динну команд (в нее еще вникнуть надо), а также посмотрел _15056069__486dis_c.zip и дизасм с z0mbie.host.sk. Эти дизасмы на С да еще там куча case`ов и if-else`ов, и таблица присутствует - покажите мне без сase`овый код, - короче таких валом в сети были бы хорошие не брался бы за разработку своего. Я дизасмлю по ходу, пока полностью не расшифруюется инструкциюя и ее длинна включая и префмкс следующия не начинается, и условные переходы имхо это тормознуто.



    Читайте статью с таблицами по дизасму (имхо она отличная, я с помощью нее и начал разработку). Автор К. Касперский -ищите в сети.
     
  9. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Читайте статью с таблицами по дизасму (имхо она отличная, я с помощью нее и начал разработку). Автор К. Касперский -ищите в сети.



    Не Касперский, а Касперски. Касперский - это Евгений :)

    Далее, Крис в той таблице наделал туеву хучу ошибок. Свин ее очень жестоко распинал. Если я тебя правильно понял - то вот документ:

    http://www.wasm.ru/docs/1/DisassembingErrata.zip

    Edmond постил сюда таблицу с декодированными опкодами. Свин отнесся к таблице куда более благожелательно. Хотя, сказал, что ошибки есть и там.

    Еще раз предлагаю взять движок Olly.
     
  10. zss

    zss New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2004
    Сообщения:
    40
    Адрес:
    Чехов-2
    Таблицы - это все конечно хорошо (удобнее). Но ведь у процессора нет никаких таблиц :) Он все делает на лету. Так вот хотелось бы такой же алгоритм придумать.



    Как вариант (я уже об этом говорил) создать некий конечный автомат и подавать ему на вход код. Мне кажется, что в этом случае будет выигрыш во многом (как минимум в производительности)



    Или я не прав ?
     
  11. Skif

    Skif New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2003
    Сообщения:
    55
    2 zss





    Боюсь, что да :derisive:

    На самом деле для программной реализации конечных автоматов (КА) используется в основном два метода - таблицы состояний либо дикая мешанина if/switch-case/goto и т.п. Дизассемблер x86 можно моделировать КА (да это и есть КА в конце концов), но при реализации от вышеупомянутых методов никуда не денешься. А как процессор "в железе" декодирует инструкции - это уже другой вопрос :derisive:
     
  12. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    zss

    >Таблицы - это все конечно хорошо (удобнее). Но ведь у >процессора нет никаких таблиц :) Он все делает на лету. >Так вот хотелось бы такой же алгоритм придумать.

    Чем такой дизассемблер по твоему круче будет, быстрее? или это уже эмулятор? я непойму



    zzzyab

    >Эти дизасмы на С да еще там куча case`ов и if-else`ов, и >таблица присутствует - покажите мне без сase`овый код

    Без таблицы if`ов ваше немеренно станет



    >Я дизасмлю по ходу, пока полностью не расшифруюется >инструкциюя и ее длинна включая и префмкс следующия не >начинается

    А все остальные наугад длину определяют?

    Другое дело что весят нехило или использовать неудобно, а модифицировать тяжело
     
  13. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115


    ни... не понимать по рюсски.

    Че ваше? "неменренно" - это "не измеренно" или "много" ?



    Я думаю регистровый сall\jmp лучше case\elseif.







    Мне не нравится что они дизасмят все подряд без перебора (особенно запакованые данные), а мне надо по ходу исполнения - если что всегда додизасмть можно.



    WinDasm отличная прога конечно, но она делает не АСМ файл а гониво своего стандарта.Вот я хочу сфарганить что-то типо,но с АСМ файлами.



    volodya

    http://www.wasm.ru/docs/1/DisassembingErrata.zip (дя и iczelion) в идиотскои стандарте сhm - обломно, я не знаю как его переделать. Пожалуйста, где оно есть в нормальном текстовом (или хтябы pdf) виде.
     
  14. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    zzzyab



    Ищи во форуму. Где-то было.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    zzzyab

    Идёшь на сайт http://yarix.by.ru/

    берешь прогу htm2chm

    декомпилишь chm и получаешь вместо chm кучу html :derisive:
     
  16. Artem

    Artem New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2003
    Сообщения:
    29
    Адрес:
    Russia
    А что плохого в таблицах? (ведь речь идёт о таблицах инструкций или нет?) Такой вариант реализуется легко и красиво. И работает достаточно быстро: на моих 1533 MHz опредление длины инструкции - ~40 мс на Мб кода, декодирование - ~70 мс/Мб.

    Кому интересно, в аттаче выдержки из моего кода (самой таблицы инструкций там нет; поддержка только до PII, но это не суть важно).

    [​IMG] 1654135354__dasm.txt
     
  17. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Такой вариант реализуется легко и красиво



    А вот работает не очень :)
     
  18. Artem

    Artem New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2003
    Сообщения:
    29
    Адрес:
    Russia
    volodya

    Почему не очень?
     
  19. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    >>„Без таблицы if`ов ваше немеренно станет“ ни... не понимать по рюсски. Че ваше? "неменренно" - это "не измеренно" или "много"?



    Много.

    Тоесть придется декодировать каждый опкод, или схожую группу опкодов, примерно так как это сделанно здесь

    http://z0mbie.host.sk/disasm.txt

    Только вот для дизассемблера, такой информации бутет явно недостаточно



    >>„А все остальные наугад длину определяют“ Мне не нравится что они дизасмят все подряд без перебора особенно запакованые данные), а мне надо по ходу исполнения - если что всегда додизасмть можно.



    Хм... нутак в чем проблема, распакуй данные, а потом их дизассемблируй



    >>WinDasm отличная прога конечно, но она делает не АСМ файл а гониво своего стандарта.Вот я хочу сфарганить что-то типо,но с АСМ файлами.



    Я думаю,если напишешь конвертор из WinDasm формата в нужный тебе формат, потратишь намного меньше нервных клеток и времени
     
  20. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Письма к Крису есть и просто текстом в разделе BOOKS.

    В разделе "Образовательные программы" есть обучалки и статьи. Не все вопросы там освящены но хоть что-то.

    На форуме есть декодер modrm с исходниками и тестовой программой. Там даже преобразование имён регистров из кодов регистров делается без прямого табличного метода.

    Дело не в том, чтобы полностью отказаться от табличного метода, а чтобы дешифратор декодировал хотя бы "общие поля". Вобщем так много уже сказано, что добавить в обычном режиме "болтовни" нечего, нужно дополнительные статьи писать, которые в конечно счёте должны вылится в некие обобщения - полные алгоритмы декодирования.

    Сейчас некогда, рецензирую книжку по прикладной логике.

    Здесь кстати есть ребята которые понимают в декодировании "общих полей" не хуже меня. Уступаю им слово :)