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

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

<< . 1 . 2 . 3 . 4 . >>

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


Дата: Авг 25, 2004 22:04:49

А что плохого в таблицах? (ведь речь идёт о таблицах инструкций или нет?) Такой вариант реализуется легко и красиво. И работает достаточно быстро: на моих 1533 MHz опредление длины инструкции - ~40 мс на Мб кода, декодирование - ~70 мс/Мб.
Кому интересно, в аттаче выдержки из моего кода (самой таблицы инструкций там нет; поддержка только до PII, но это не суть важно).

1654135354__dasm.txt


Дата: Авг 25, 2004 22:11:01

Такой вариант реализуется легко и красиво

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


Дата: Авг 25, 2004 22:13:20

volodya
Почему не очень?


Дата: Авг 26, 2004 02:49:29

>>„Без таблицы if`ов ваше немеренно станет“ ни... не понимать по рюсски. Че ваше? "неменренно" - это "не измеренно" или "много"?

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

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

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

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

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


Дата: Авг 26, 2004 03:49:30

Письма к Крису есть и просто текстом в разделе BOOKS.
В разделе "Образовательные программы" есть обучалки и статьи. Не все вопросы там освящены но хоть что-то.
На форуме есть декодер modrm с исходниками и тестовой программой. Там даже преобразование имён регистров из кодов регистров делается без прямого табличного метода.
Дело не в том, чтобы полностью отказаться от табличного метода, а чтобы дешифратор декодировал хотя бы "общие поля". Вобщем так много уже сказано, что добавить в обычном режиме "болтовни" нечего, нужно дополнительные статьи писать, которые в конечно счёте должны вылится в некие обобщения - полные алгоритмы декодирования.
Сейчас некогда, рецензирую книжку по прикладной логике.
Здесь кстати есть ребята которые понимают в декодировании "общих полей" не хуже меня. Уступаю им слово :)


Дата: Авг 26, 2004 09:27:55

Спасибо всем за участие ! :)

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


Дата: Авг 26, 2004 11:07:33

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 е.р. даже ресурсы за код считает и соотв. их дизасмит


Дата: Авг 26, 2004 11:20:52

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


Дата: Авг 26, 2004 11:26:07

Если захочу да, и это займет неск. лет времени, но зачем ? он уже и так есть. Мне все-таки больше нравится WinDasm


Дата: Авг 26, 2004 13:39:09 · Поправил: Max

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-ов, что будет существенно медленнее, типа
    shl al,1
    jc 1xxxxxxx
  0xxxxxxx:
    ...
  1xxxxxxx:
    ...

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

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

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


Дата: Авг 26, 2004 14:29:34 · Поправил: zzzyab

Да, я за jmp, вот уже и начало декодера: пример дизасма add al,immed
decoder:
	sub	eax,eax
	mov   al,byte ptr [esi]; начало кода  к-рый дизасм.
	mov	edx,opcode[eax*4]
	jmp	edx

add_accb:
	mov	dword ptr [edi],'	dda'
	add	edi,4
	jmp	_accb

_accb:
	mov	dword ptr [edi],' la,'
	add	edi,3
	inc   esi
      push  [esi]
	inc   esi
      call	hex4outb ; байт в ascii и добав. 'h'
	jmp   decoder

.data
opcode dd add_rmb,add_rm,add_rb,add_r,add_accb,add_acc,push_es,pop_es........


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

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


Дата: Авг 26, 2004 17:19:49

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

mov al,byte ptr [esi]
mov edx,opcode[eax*4]
jmp edx


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

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

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

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

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

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


Дата: Авг 26, 2004 21:15:03 · Поправил: Artem

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

>намного сложнее ... работа с условными переходами
а вот анализ и учет кросс-референсов это как два пальца... “


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


Дата: Авг 27, 2004 09:54:21

Да... я так понимаю, что зря я затеял это все :)

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

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

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

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


Дата: Авг 28, 2004 05:07:01 · Поправил: zzzyab

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

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

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

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

<< . 1 . 2 . 3 . 4 . >>


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