· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› My disassemble engine

Посл.отвђт Сообщенiе


Дата: Июл 28, 2004 03:18:30

Интересно ваше мнение насчет движка, и его перспектив.


_859924254__dis_0.1.zip


Дата: Июл 28, 2004 17:38:44

„Интересно ваше мнение насчет движка, и его перспектив. “

Я думаю пока нужно очень много доробатывать, у тебя посути работает только функция декодирования (disassemble), притом с ошибками, и не поддерживает полный набор команд (MMX/SSE/i32e).

Ошибки которые сразу бросились в глаза:
1. Не реализовано перекрытие префиксов
2. Не реализована максимальная длина инструкции (15 байт)

блоки if ... else if помоему лучше реализоваться через case.

Остальное надо смотреть более детально


Дата: Июл 28, 2004 18:29:26

Smile
Хармер прав, очень слабенько.
для сравнения можешь взять xde от z0mbie и посмотреть - там еще масса всяких ньюансов.

кстати, xde кто-нить пробовал?
я в нем сегодня ночью небольшой но серьезный еррор нашел.
xset = reg2xset(flag & C_OPSZ8 ? 1 : diza->defdata, rm)

работает не правильно.
имхо надо
xset = reg2xset(flag & C_DATA1 ? 1 : diza->defdata, rm)


может еще кто какие баги находил?
интересно было бы мнение The Svin'а по xde, мне вообще понравилось, хотя плотно я его еще не юзал.


Дата: Июл 28, 2004 20:58:14

HarmEr

FLUSH_PREFIX
повторяюшийся перефикс сбрасывается, так сделанно в движке ОллиДебаг, это неправильно ?

MMX/SSE добавлю
Исправлю максимальную длину

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

А насчет багов хм... мало тестировал

Max

Я и посматриваю понемногу :)


Дата: Июл 28, 2004 22:10:15 · Поправил: HarmEr

„FLUSH_PREFIX
повторяюшийся перефикс сбрасывается, так сделанно в движке ОллиДебаг, это неправильно ? “


На сколько я понял по логике у тебя префиксы отделяються от самой инструкции в случае повтора, а такого быть не должно.
    tmp = *ip;
    if (tmp == 0x66)
    {
        if (dis->os)
            return FLUSH_PREFIX;
        dis->os = *ip;
    }
..............
    err = disassemble (&dis, optbl);
    if (err == FLUSH_PREFIX)
    {
        dis.len = 1;
    }
    else
    if (err == ERROR)
    {
        if (tlen >= bufsize) return -1;
             dis.len = 1;
    }


Тоесть все опознавание префиксов ты должен перенести в функцию disassemble, если у инструкции несколько префиксов, например смена сегментов, то выбираеться послений, и с этим учетом формируеться длинна команды, и притом префиксы никто не запрещает повторять.

В качестве теста рекоимендую сгенерить прогу, поставить несколько повторяющихся префиксов, и пройтись в SingleStepMode по этому участку, уверяю что пройдет оно все за 1 шаг.

Я даже както делал такой фокус, ставил 14, 15 префиксов в SEH секцию перед, скажем nop, и если длина команды получалась <=15 байт то проц это хавал нормально, и SEH не срабатывал, а в случее превышения происходила ошибка. А вот "большинство дизасемблеров" на этом обламывались, потому как не умеют обрабатывать такое правильно.

следующий пункт.
Нужно ли переходить на опкоды, операнды и пр. в текстовом формате?
в моем движке, по разбору полиморф кода, все строиться на преобразовании команд проца в команды VM, на основе команд VM производиться анализ кода. По моему мнению это достаточно эфективно.
А визуализация на уровне мнемотик идет в самый последний момент. И это без труда позволяет реализовать, например, конвертацию синтаксиса Masm||Tasm<->AT&T & etc.


Дата: Июл 29, 2004 00:48:11

Верно, если длина инструкции больше 15, вылетает с исключением и все перефиксы относятся к инструкции сгенерировавшей исключение.

Нет, информация которую я собираюсь добавить нужна для анализа, т.к некоторые инструкции ипользую псевдооперанды к примеру lods(0xAC), out итд

typedef struct dis_table {
/* без изменений */
unsigned char base;
unsigned long decode;
/*****************/

unsigned char oper1, oper2, oper3;
} dis_table;

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


Дата: Июл 29, 2004 12:45:57 · Поправил: HarmEr

Давай дождемся следующего релиза и будем тестить

Добавлено
Еще посмотри по префиксам, помоему не перед всеми командами можно ставить любой префикс. Тоже должен вылетать фаулт в случае неправильного применения, особенно каксаеться префикса REP.

Еще добавлю:
Префиксы 0x66, 0x67 можно ставить преед условными переходами, для включения/отключения оптимизации ветвлений конвеером процов P4 и старше. Хотя интел и не рекомендует это использовать, но всеже проц это поддерживает.


Дата: Авг 1, 2004 02:07:36

Вот и версия 0.2

- Длина инструкции 15, перекрываюшиеся перефиксы

- Поправлен баг с декодированием знаковых данных

- Сброс перефикса если в инструкции он указан как неприемлемый

- Карата опкодов построена с использованием макросов, в стиле Intel manual opcode map + информация о каждом операнде инструкции (включая псевдооперанды)

- Тестовая программа показывает типы и размер операндов


В следуюшей версии добалю mmx/sse, тем самым расправлюсь с функцией декодирования и можно будет приступить к проработке анализа инструкции.


_1408977776__dis_0.2.zip


Дата: Авг 24, 2004 17:29:57

Появилось время заняться движком, вылаживаю версию 0.3

На его основе написан легенький бинарный дизассемблер dza
Он не показывает названия инструкий, тк
мне влом добавить name_id с индексом имени.

По техническийм причинам убрал(возможно временно) перекрывающиеся перефиксы

И снова mmx/sse не добавил, насколько я понял это будет сделанно уже в полностью готовом и отлаженном(ну-ну:) движке

Сейчас немного посплю и добавлю имена инструкций

_67185278__dis_0.3.zip


Дата: Авг 27, 2004 02:23:36 · Поправил: Smile

Всетаки с третьей версией я поспешил, можно сказать ламернулся...

Во время тестирования нашел много мелких ошибок, и неправильно закодированных инструкци,исправил некоторые баги и недочеты, добавил индексы имен. Функции визуализации теперь печатают полноценные инструкции.

Вообщем это первая стабильная версия.
Тестировал с помошью OllyDbg 1.08b и Fasm 1.50, багов не нашел (разве что парочку в OllyDasmEngine:)


Дата: Авг 27, 2004 02:30:03


Дата: Авг 30, 2004 20:00:44

Гм, проекту стукнул месяц, единственные конструктивные предолжения поступили только от HarmEr, остальные наверное стесьнялись:))) или совершенно не интересовались такой запаркой.

Возможно кого-то разочаровали первые версии, или показались совершенно неработоспособными, это факт, на каждую версию, не считая первой, удалось выделить только 2-3дня, а ведь нужно еще и протестировать.

Последняя версия является логическим завершением декодирования инструкций. Далее она мутирует в инструмен для анализа кода.


Дата: Авг 31, 2004 06:21:14

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


Дата: Авг 31, 2004 13:22:16

Smile
единственные конструктивные предолжения поступили только от HarmEr, остальные наверное стесьнялись
это ты зря :))
я его даже компилил(v0.4), и даже запускал, пытаясь подсунуть "стандартные" ляпы дизасмов.
но, как ни странно, все работает (хотя плотно не проверял).
я бы тебе посоветовал коменты понаписать в модуле, где табличка описана, а то хотел табличку проверить, но в той куче дефайнов хрен чего поймешь.


Дата: Авг 31, 2004 21:02:18

Max
но, как ни странно, все работает
ничего странного, так и должно быть,а не будет поправим :))))

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

Кстати, дал движку имя - MDE (My Disassemble Engine :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054