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

 WASM Phorum —› WASM.RESEARCH —› Алгоритм дизассемблирования

<< . 1 . 2 . 3 . 4 .

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


Дата: Сен 7, 2004 02:31:23

> это может быть как просто число так и offset.
> Это наверное самое сложное в дизасме - пока нет метода лучше чем у Windasm
посмоти как это сделано в ИДЕ. она автоматически распознает большинство указателей простыми эврестическими приемами, а вообще в идеале надо писать эмулятор и смотреть - если непосредственное значение используется в косвенной адресации, то это либо индекс, либо указатель. но идексы обычно невелики по модулю, в то время как указатели в win32-программах в 99% случаях находятся за пределами 4 метров, что выдает их с головой.
все примемы, которые использует ИДА мне перечислять лениво (тем более, что они уже описаны в "Образе мышления"), вот только пара из них: если непосредственное значение указывает в пределы imagesize и здесь расположен пролог функции (или хотя бы просто код), то это ссылка на код, если здесь расположены данные - это ссылка на данные. прием простой, но он работает ;) тем более, что для библиотечных функций мы можем явно распознать какие их аргументы - указатели, а какие нет.


Дата: Сен 7, 2004 20:03:06

Когда я только начинал, я испытывал все - остановился на Windasme. У иды очень много ошибок (у меня была тогда вер. 3.х) дизасменные с помощю нее проги и потом опять собраные были не работоспособны. Больше всего мне не нравилось в ИДЕ что она считала кодом все и данные и ресурсы, и даже Debug инфо, а дакже дизасмила только в ТASM совместимом стиле. ер. db STR 'Hello',0 оно или АСМ кодом дизасмило или dd STR 48656c6c,6f006472
А Windasm не лепит такой бред, просто ставятся ссылки "Possible reference" и все оставляется как есть,он в 65% случаях правильно определяет строчные данные и почти все виды ресурсов, и никаких дибильных TACMОвских примочек.

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

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


Дата: Сен 7, 2004 20:43:23

kaspersky
„вот только пара из них: если непосредственное значение указывает в пределы imagesize и здесь расположен пролог функции (или хотя бы просто код), то это ссылка на код, если здесь расположены данные - это ссылка на данные. прием простой, но он работает ;) “
Так проблема как раз в том и состоит, чтобы определить, где код, а где данные!

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


Дата: Сен 7, 2004 21:28:01

Переменную можно организовать следующим образом:
var4323: mov eax,87654321h ;так значение переменной загружается в регистр

...

         mov [var4323 + 1],eax ;так в память сохраняется новое значение переменной


Ваши действия? ;)


Дата: Сен 8, 2004 00:40:36

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


Дата: Сен 22, 2004 16:07:03

>>Тоесть придется декодировать каждый опкод, или схожую группу опкодов, примерно так как это сделанно здесь
http://z0mbie.host.sk/disasm.txt
Только вот для дизассемблера, такой информации бутет явно недостаточно


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

З.Ы. Кстати Smile, а почему ты говоришь, что этого недостаточно ?. Насколько я понимаю алгоритм следующий (применительно к данному движку):
1. Определяется разрядность (проверяется последний бит опкода на 1 и префикс 0x66).
Например:
   BOOL Mode = FALSE; // 0 - 32 bit, 1 - 16 bit
   Mode = (Opcode & 1);
   if (flag & Fx66) Mode = !Mode;
   


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

2. Смотрим есть ли байт ModRm
3. Если есть, то определяем регистр из поля Reg
4. Смотрим на поле Rm. Если = 100b => есть байт Sib
5. Разбираем Sib
6. Записываем результат с учетом напрвления источника и приемника (2 бит в опкоде)

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


Дата: Сен 22, 2004 22:31:23

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

банзай!

<< . 1 . 2 . 3 . 4 .


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