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

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

  1. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Smile,



    На Олю взгяд самый лучший, я ей по нескольку часов на дню пользуюсь. Вопрос в том, что я пишу программу:



    Mov Ax, 0xE566

    Xor Ebx, Ebx



    И вставляю туда Int3:



    Mov Ax, 0xE566

    Int3

    Xor Ebx, Ebx



    Когда запускается Оля она мне пишет:



    in eax, 0CC

    xor ebx, ebx



    При выполнении Step Over (F8) Оля застревает на команде с пояснением:



    Privileged instruction - use Shift F7/F8/F9 to pass exception to program.



    О чём я и спрашивал. Это вроде как разбор примера движка дизассемблирования.



    P.S. Да, кстати Int3 я намеренно вставляю, чтобы отладить программу с определённого места (это я к словам "вылетаешь по Int3"). Только приходится писать не Int3, а Nop Int3 Nop.
     
  2. Smile

    Smile New Member

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

    >О чём я и спрашивал. Это вроде как разбор примера движка дизассемблирования.

    А вот еще один мистический пример дизассемблирования:



    если в полнолуние, в ручную, 666h раз, набрать dw 666h

    а потом дизассемблировать получится 666h инструкций

    PUSH ESatana
     
  3. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Есть инструкция с числом. Дизасемблируется без проблем, но это может быть как просто число так и offset.Это наверное самое сложное в дизасме - пока нет метода лучше чем у Windasm, но он и половины offset`ов не находит. А как определить размер блока по offset`у вообще не имею понятия. Кто-нить работал над этим ?
     
  4. Artem

    Artem New Member

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



    У Windasm и метода то особого нет :) - строки только и распознаёт





    Для начала надо определить, на что указывает число - код или данные (или вообще никуда не указывает). Если на данные - проверить не является ли блок строкой. Также концом блока можно считать ближайший адрес, на который указывает offset в какой-нибудь другой инструкции.

    Я сейчас работаю над проблемой разделения кода и данных. Фиг знает, когда закончу, т.к. времени очень мало. Но определённые идеи есть.
     
  5. The Svin

    The Svin New Member

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

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > это может быть как просто число так и offset.

    > Это наверное самое сложное в дизасме - пока нет метода лучше чем у Windasm

    посмоти как это сделано в ИДЕ. она автоматически распознает большинство указателей простыми эврестическими приемами, а вообще в идеале надо писать эмулятор и смотреть - если непосредственное значение используется в косвенной адресации, то это либо индекс, либо указатель. но идексы обычно невелики по модулю, в то время как указатели в win32-программах в 99% случаях находятся за пределами 4 метров, что выдает их с головой.

    все примемы, которые использует ИДА мне перечислять лениво (тем более, что они уже описаны в "Образе мышления"), вот только пара из них: если непосредственное значение указывает в пределы imagesize и здесь расположен пролог функции (или хотя бы просто код), то это ссылка на код, если здесь расположены данные - это ссылка на данные. прием простой, но он работает ;) тем более, что для библиотечных функций мы можем явно распознать какие их аргументы - указатели, а какие нет.
     
  7. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Когда я только начинал, я испытывал все - остановился на Windasme. У иды очень много ошибок (у меня была тогда вер. 3.х) дизасменные с помощю нее проги и потом опять собраные были не работоспособны. Больше всего мне не нравилось в ИДЕ что она считала кодом все и данные и ресурсы, и даже Debug инфо, а дакже дизасмила только в ТASM совместимом стиле. ер. db STR 'Hello',0 оно или АСМ кодом дизасмило или dd STR 48656c6c,6f006472

    А Windasm не лепит такой бред, просто ставятся ссылки "Possible reference" и все оставляется как есть,он в 65% случаях правильно определяет строчные данные и почти все виды ресурсов, и никаких дибильных TACMОвских примочек.



    Размер блока и я определяю по следующему offset. но если следующего нет ? ер. последний.



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

    Artem New Member

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



    Так проблема как раз в том и состоит, чтобы определить, где код, а где данные!



    zzzyab



    Конечно, сделать автоматический анализ идеальным практически невозможно. Если говорить о проблеме разделения кода и данных, то вполне реально достичь очень неплохих результатов, а в ряде случаев (я бы даже сказал, во многих случаях) - 100% правильного разделение кода и данных. Я надеюсь, мой анализатор будет справляться с этим лучше, чем IDA, в основном, за счёт статистического анализа.
     
  9. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Переменную можно организовать следующим образом:


    Код (Text):
    1. var4323: mov eax,87654321h ;так значение переменной загружается в регистр
    2.  
    3. ...
    4.  
    5.          mov [var4323 + 1],eax ;так в память сохраняется новое значение переменной




    Ваши действия? ;)
     
  10. The Svin

    The Svin New Member

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

    Кроме самомодифицирующего кода один из многочисленных возможных примеров например при создании класса окна поместить в указатель имени класса указатель на любой байт кода после которого есть (на разумной дистанции) байт=00.

    Тут уже не работает логический принцип "исключения" третьего поэтому задача поставленая как симметрическая разность (или это код или это данные, типа поциент либо жив либо мёртв) не разрешима в принципе. Байт кода на который указывает указатель имени класса будет одновременно и рабочим опкодом и данными которые система будет использовать при создании окна.
     
  11. zss

    zss New Member

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

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

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




    Очень интересная вещица :). Раз все говорят, что дизассемблировать необходимо пошагово, то придется так и делать :dntknw:



    З.Ы. Кстати Smile, а почему ты говоришь, что этого недостаточно ?. Насколько я понимаю алгоритм следующий (применительно к данному движку):

    1. Определяется разрядность (проверяется последний бит опкода на 1 и префикс 0x66).

    Например:

    Код (Text):
    1.  
    2.    BOOL Mode = FALSE; // 0 - 32 bit, 1 - 16 bit
    3.    Mode = (Opcode & 1);
    4.    if (flag & Fx66) Mode = !Mode;
    5.    




    Сразу вопрос : а как быть если опкод > 1 байта (0xF0, 0x9B, 0xD9 ...)



    2. Смотрим есть ли байт ModRm

    3. Если есть, то определяем регистр из поля Reg

    4. Смотрим на поле Rm. Если = 100b => есть байт Sib

    5. Разбираем Sib

    6. Записываем результат с учетом напрвления источника и приемника (2 бит в опкоде)



    Или такой алгоритм работать не будет ? Может еще как ?
     
  12. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    Потому, что есть еще и псевдо(операнды по-умолчанию) которые нигде не закодированны, а также размер указателя или операнда не всегда стандартен, например для инструкции bound, может скоро разрожусь(гы) статьей



    банзай!
     
  13. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Что вы думаете по поводу добавления к дизасемблеру PE базы данных значений EA. Например при изменении ЕA в одном месте автоматически изменяються такиеже EA во всем коде.
     
  14. andruha123

    andruha123 New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2004
    Сообщения:
    15
    Адрес:
    USA, CA
    Все ЕА по всему коду не выщимишь. Что не будь да пропустишь. А потом будешь чесать репу. Просто возни много.
     
  15. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Какие могут быть варианты тогда, тупых дизасмов полно, а хочу что-то продвинутое сделать.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Эмулирующий дизасм.
     
  17. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    А как оно эмулируеться ? Мне на ум кроме софтайса нечиго не приходит - это пока очень сложно для меня.



    И еще такой вопросы: как декодируеться префикс Brunch prediction, в своем дизасме я его ставлю на db - вроде не зависает, но как опредилить работает ли оно. Вообще я решил ставить в db все чего не понимает masm.





    И какие методы расчета скорости, я придумал пока создание 10mb файла с однотипными иструкциями, выполнение дизасма через софтайс, софтайс показывает потом время торможения например для инстркуций add,adc,or,sub,xor... регистр-регистр ~10 cек
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    >>А как оно эмулируеться ? Мне на ум кроме софтайса нечиго не приходит - это пока очень сложно для меня.

    Софтайс не эмулятор, а отладчик.

    Эмуляция довольно сложная тема. Это исполнение команд не процессором а твоей программой. Как пример можно привести VMWare, Emu8086.