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

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

  1. zss

    zss New Member

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



    Но если завелся такой спор, то может попробуем реализовать хотябы часть базовых функций для дизассемблирования. Обсуждая их на форуме можно избавиться от неочевидных ошибок и сэкономить время.
     
  2. zzzyab

    zzzyab New Member

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



    К сожалению http://z0mbie.host.sk/disasm.txt Forbidden

    (You don't have permission to access /disasm.txt on this server.)



    Не монимаю почему это должны быть именно IF, имхо они тормозные - почему не прямой jmp\mov или хтя бы сall ?



    Выскажитесь остальные - много IF это тормоз или нет ? Есть смысл, если возможно, не испльзовать IF.





    В том что дизассемблер сделает мне это кодом, а не данными. Идиотский IDA е.р. даже ресурсы за код считает и соотв. их дизасмит
     
  3. ozzman

    ozzman New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2004
    Сообщения:
    56
    >Идиотский IDA

    прежде, чем чего-либо хаять, подумай, а сможешь ли написать хотя бы приблизительно ткой же "идиотский"

    дизассемблер?
     
  4. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Если захочу да, и это займет неск. лет времени, но зачем ? он уже и так есть. Мне все-таки больше нравится WinDasm
     
  5. Max

    Max Member

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

    К сожалению http://z0mbie.host.sk/disasm.txt Forbidden

    http://z0mbie.host.sk/disasme.txt - это тоже самое, только на английском



    Не монимаю почему это должны быть именно IF, имхо они тормозные - почему не прямой jmp\mov или хтя бы сall

    а куда и как ты будешь делать jmp или call?

    очевидно что-то типа jmp [eax]?

    так это и называется табличкой.



    Выскажитесь остальные - много IF это тормоз или нет ?

    ес-но!

    при табличной эмуляции ты делаешь переход на декодер по некоторому критерию (упрощенно скажем по первому байту опкода) за одну команду - jmp [eax]



    в противном случае, выход на декодер будет выполняться за тучу if-ов, что будет существенно медленнее, типа
    Код (Text):
    1.  
    2.     shl al,1
    3.     jc 1xxxxxxx
    4.   0xxxxxxx:
    5.     ...
    6.   1xxxxxxx:
    7.     ...


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



    если нужен только дизассемблер длин, бери движок от z0mbie, рекомендую xde - он корректно декодирует опкоды с инвалидным полем codr (он же ttt, он же reg, кто как называет ;))

    а начнешь писАть свой движок - в конечном итоге напишешь тот же xde :)



    added

    похоже, по внешним ссылкам на статьи z0mbie не зайти - надо зайти в корень (http://z0mbie.host.sk), а там уже искать статью "Disassemblers within viruses"
     
  6. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Да, я за jmp, вот уже и начало декодера: пример дизасма add al,immed


    Код (Text):
    1.  
    2. decoder:
    3.     sub eax,eax
    4.     mov   al,byte ptr [esi]; начало кода  к-рый дизасм.
    5.     mov edx,opcode[eax*4]
    6.     jmp edx
    7.  
    8. add_accb:
    9.     mov dword ptr [edi],'   dda'
    10.     add edi,4
    11.     jmp _accb
    12.  
    13. _accb:
    14.     mov dword ptr [edi],' la,'
    15.     add edi,3
    16.     inc   esi
    17.       push  [esi]
    18.     inc   esi
    19.       call  hex4outb ; байт в ascii и добав. 'h'
    20.     jmp   decoder
    21.  
    22. .data
    23. opcode dd add_rmb,add_rm,add_rb,add_r,add_accb,add_acc,push_es,pop_es........
    24.  




    ИМХО декодер инструкций, не самая сложная задача, - намного сложнее определение данных и работа с условными переходами, - создание рабочих asm файлов. Если Olly создает asm файлы к-рые компилятся и потом прога с них работает (для теста достаточно notepad и сalc потом wordpad....), то я стану его использовать. А создавать свой дизасм тоже интересно. Я не в прикол это делаю - все для практ. использования - хочу еще занятся дизасмом драйверов.



    Посмотрел исходник этого Olly http://home.t-online.de/home/Ollydbg/disasm.zip - не понимаю чем он хорош. Те же if\case и asm файлы он не делает. Так что я орентируюсь на WinDasm.
     
  7. Max

    Max Member

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

    вот уже и начало декодера

    как говорится, самое сложное - это начать :)



    mov al,byte ptr [esi]

    mov edx,opcode[eax*4]

    jmp edx




    к сожалению, не все опкоды можно однозначно идентифицировать по первому байту, и уж тем более их операнды - есть еще modrm-байт, sib-байт, поле codr, префиксы, которые влияют на размер адреса/данных etc.

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



    советую почитать сначала лит-ру по структуре опкода, потом посмотреть как делают люди (в том же olly или xde), а уж потом начинать писАть свой дизассемблер.



    ИМХО декодер инструкций, не самая сложная задача

    глубокое заблуждение



    намного сложнее ... работа с условными переходами

    а вот анализ и учет кросс-референсов это как два пальца...



    А создавать свой дизасм тоже интересно

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



    кстати, тока вспомнил, z0mbie в одном из своих движков делал пример полного дизасма файла с последующим ассемблированием - вроде как на FAR'е проверял, и вроде как работало, так что ищи на его сайте...
     
  8. Artem

    Artem New Member

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





    И всё-таки декодирование - элементарная задача. А вот с ветвлениями можно повозиться!
     
  9. zss

    zss New Member

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



    Писать свой дизасм (как мне представляется) необходимо все-таки уже имея на руках какие-то наработки.



    1. Я сейчас пользуюсь дизассемблером длин z0mbie, но хотелось бы иметь и свой :) (это не к вопросу о изобретении велосипеда, а понять как это делается и может быть придумать что-то новое)



    2. Я тогда упрощу задачу. Мне, в самом деле, и не нужет дизассемблер целиком (хотя и интересно написать свой). Мне нужно было, используя его, определять команды переходов (jxx) и изменять адреса переходов. Тоесть копируя часть функции в буфер эти Jxx уже будут указывать на валидные адреса - и вот их и надо было изменять.



    Сложно ли это сделать ?
     
  10. zzzyab

    zzzyab New Member

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

    htm2chm из http://yarix.by.ru/ - нерабочая. Наверне из-за того что у меня нет МСИЕ.



    Artem

    У тебя пример дизасма с использованием ООП - имхо для дизасма ООП не нужно.



    Max

    Про все эти sib и моdr я знаю,и соласен таблица опкодов большая и она там не одна, а про внуков ты сильно приувеличел, - в ваших дизасмах тоже самое, только там еще и if\case,а мой кусок кода это всего лиш пример работающей без сase\if. На форуме обсуждать идею создания дизасма я только начал, но в жизни - уже давно, и у меня есть соотв. инфо и исходники - и Olly имхо заслуживает внимания не намного больше остальных.



    zss

    Вот проги-"велосипеда" делающией рабочие asm файлы; правильно определяющей данные и ресурсы еще нет. Пока есть только неудачные разработки. Изменять переходы, и не только их, совсем не сложно, но для этого нужны совсем другие проги (ер. hiew - редактор; Soft-ice - поиск нужных мест в коде)
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Извините, что не по теме.

    imho если уж начинать, то тогда так:
    Код (Text):
    1. decoder:
    2.     ;sub    eax,eax
    3.     movzx   eax,byte ptr [esi];mov   al,byte ptr [esi]; начало кода  к-рый дизасм.
    4.     inc esi;mov edx,opcode[eax*4]
    5.     jmp opcode[eax*4];edx




    По теме: ещё есть такая штука как RosAsm. C notepad и сalc он с налёту не пока справляется, но сама концепция интересная и opensource. Синтаксис.. хм, в общем это не MASM =)
     
  12. Smile

    Smile New Member

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

    >Про все эти sib и моdr я знаю,и соласен таблица опкодов большая и она там не одна а про внуков ты сильно приувеличел, - в ваших дизасмах тоже самое



    В моей таблице ~214 эелементов по 9 байт (1.8кб), там все общие инструкции c дополнительными группами. Это по-твоему большая таблица?



    >только там еще и if\case,

    Код фукции декодирования ~1400 батй (1.4кб) да в ней достаточно много команд сравненя(test и cmp всего ~100) и что?

    Первую версию я писал на ассемблере, естественно, код быль лучьше, таблица ~1.0кб(без индексов имен и псевдо операндов) функция ~400 байт,вносить частые изменения и менять код очень проблематично и долго :dntknw:



    >а мой кусок кода это всего лиш пример работающей без сase\if.

    А многоли ты выиграешь от такого подхода, по скорости да, а в остальном?
     
  13. Artem

    Artem New Member

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



    Вообще редкий проект проиграет от использования ООП. Но мой код очень легко переделать в вариант без ООП - просто вынести из классов методы и всё!
     
  14. Asterix

    Asterix New Member

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

    > htm2chm из _http://yarix.by.ru/ - нерабочая. Наверне из-за того что у меня нет МСИЕ.



    МСИЕ это что, IE что-ли?

    Почему нерабочая, ты в винде, что прога то пишет?

    Надеюсь ты русскую версию скачал(бесплатная, полнофункциональная), у меня htm2chm 3.0.6
     
  15. zzzyab

    zzzyab New Member

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

    htm2chm включается, но все функции не выполняются - "сlass not registered", - ИЕ не установлен, и не собираюсь его устанавливать, потому и нужна подобная прога, работающая без ИЕ.



    Smile

    да у меня больше таблиц - все 4 байтные:превичный опкод (на все 256),вторичный опкод (уже меньше раза в 2),modrm,sib,регистры это все маленькие таблички так что это еще меньше, - не больше 1,8 кб это точно.



    О таблицах уже достаточно. Давайте перейдем к алгоритмам определения данных и ветвлению. У кого есть примеры кода?
     
  16. Asterix

    Asterix New Member

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

    > ИЕ не установлен, и не собираюсь его устанавливать, потому и нужна подобная прога, работающая без ИЕ.



    Не понял, IE ведь ставится виндой по умолчанию и его вроде как нельзя удалить?

    Потом, чем тебе IE мешает? Я пользуюсь Оперой, но это не мешает быть установленным и IE, они никак не конфликтуют.
     
  17. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Люди, объясните мне кто-нибудь, почему Оля вдёт себя следующим образом:



    Я пишу в тексте программы Int3. При передаче управления на эту команду винда показывает мне приглашение отладиться. Если я выбираю "отмена" (т.е. отладка), то грузится отладчик по умолчанию - Оля. (здесь пока всё ясно)



    А вот тогда и начинается непонятное: Int3 в совокупности в предыдущим байтом считается какой-либо недопустимой командой (например in или запись/чтение в/из недоступной области памяти).



    Приходится писать Nop Int3 Nop. Чтобы было понятно, что предшествующая Int3 команда закончилась и Int3 - это новая команда.



    P.S. Вроде как раз по теме вопрос.
     
  18. Smile

    Smile New Member

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

    По теме? Мужык, вполне возможно, что ставишь ты int3 в конце неполной инструкции или переход попадает не на int3, а предидущий байт или другая инструкци портит код, например:



    jmp $+3

    db 0xE6

    int3



    зпись в порт не из 98/me, наверное рапрещена? и поэтому тебе кажется что ты вылетаешь по int3, не надо бросать презрительный вгзляд на олю, проверь еще раз тк хз, что у тебя там случилось
     
  19. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Это не в тему. ИЕ создает угрозу безопасности, - у меня свой вариант установки win98 типо 98lite, в 2000 пока не умею делать установку чистой от ИЕ системы. И мне не нужны проги, к-рые без этого ИЕ, имхо побочного в системе, не работают.



    И для этой темы можно создать отдельный пост (ер. "Нужен ли ИЕ ?" ). А сдесь давайте про соотв. алгоритмы.
     
  20. Smile

    Smile New Member

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

    Пока нету времени добавить в движок анализ инструкции и некоторые дополнительные структуры, а ты уже говоришь о разделении кода/данных,определении ветвлений, как только будет готова следующая вервсия, приму участие в обсуждении