|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 23, 2004 14:54:06 · Поправил: zss Может кто когда-нибудь пытался написать небольшой дизассемблер ? Есть описание форматов инструкций, опкодов и т.д. Хотелось бы узнать сам алгоритм (вопрос также относится к быстродействию и определению защиты от дизассемблировани). Может также у кого-нибудь есть готовые структуры данных для облегчения ? З.Ы. Если есть, то можно ссылочку на разбор алгоритма и т.п. Спасибо |
|
|
Дата: Авг 23, 2004 15:08:55 z0mbie.host.sk :) почти классика |
|
|
Дата: Авг 23, 2004 21:25:25 · Поправил: Безпощадный даос z0mbie тебя просветит - это факт :) Если ты о быстродействии дизассемлирования инструкций, то это происходит почти мгновенно, другое дело анализ надизасембленного это достаточно долго притом что без использования эмулятор качество листинга очень низкое. Можешь глянуть сюда [url=]http://wasm.ru/forum/index.php?action=vthread&forum=5&topic=6618[/url] это первые две версии моего кривого движка :) Сейчас замочу парочку багов и выложу третью версию с примером использования (бинарный дизассемлер 32бита) |
|
|
Дата: Авг 23, 2004 21:58:42 Все дело в том, что у меня есть описание инструкций, опкодов и т.д. Но я не знаю с чего начинать. Я понимаю, что необходимо начинать проверку на префиксы. А если их не один ? Просто хочу Вас попросить привести сам алгоритм разбора. З.Ы А вообще кто-нибудь пытался создать совместный дизасм с обсуждением на форуме - может из этого вышло бы что - нибудь оригинальное (а то посмотрев многие исходники приходишь к выводу, что все пишут одно и тоже, изобретая велосипед) З.Ы.Ы. Кстати, а почему дизассемблирование ведется побайтово. Ведь процессор - это ведь в своем роде конечный автомат (или он тоже ведет разбор побайтово ?) Если нет, то можно попытаться смоделировать его работу - это будет намного быстрее. |
|
|
Дата: Авг 24, 2004 01:26:37 · Поправил: zzzyab Я это делал так: прописывал все инструкции по номерам потом тип адресации а потом регистры - это все уже побитно (в одном байте много чего закодировано). Для двухбайтных инструкций сначало распознается первый байт а потом сама инструкция - кобинация байтов всегда устойчива. Самое сложное это вызовы и переходы по регистрам (ер. сall [edx], jmp eax и.т.п). Да и обычные условные переходы тоже создают много неудобств. Т.к. я стараюсь дизасмить по ходу исполнения программы бо код может изменятся - ер. самомодифицирующиеся. Вот тебе куски моего самодельного дизасма для примера
sub eax,eax
lodsb
mov edx,opcode[eax*4]
call edx
ret
.......
modrm:
sub ebx,ebx
lodsb
mov bl,al
shr al,6
mov operand_size,putOpSize
mov edx,addressing[eax*4]
mov eax,offset _reg_
call edx
ret
modrmb:
sub ebx,ebx
lodsb
mov bl,al
shr al,6
mov operand_size,putOpSizeb
mov edx,addressing[eax*4]
mov eax,offset _regb_
call edx
ret
m_a:
mov eax,moff32
mov [addr_type+20],eax
mov [sib_base+20],eax
call m_
call dword ptr [edx]
mov byte ptr [edi],']'
inc edi
ret
...............
................
m_:
sub edx,edx
mov dl,bl
shr dl,3
and dl,7
shl dl,2
call operand_size
add edx,offset addr_typ
ret
m_a:
mov eax,moff32
mov [addr_type+20],eax
mov [sib_base+20],eax
call m_
call dword ptr [edx]
mov byte ptr [edi],']'
inc edi
ret
mb_a:
mov eax,ebp_a
mov [addr_type+20],eax
mov [sib_base+20],eax
call m_
call dword ptr [edx]
mov byte ptr [edi],'+'
inc edi
push [esi]
call hex4outb
mov byte ptr [edi],']'
inc edi
add esi,2
ret
..........
add_rmb:
mov dword ptr [edi],' dda'
add edi,4
call _rmb
ret
add_rm:
mov dword ptr [edi],' dda'
add edi,4
call _rm
ret
add_rb:
mov dword ptr [edi],' dda'
add edi,4
call _rb
ret
add_r:
mov dword ptr [edi],' dda'
add edi,4
..........
_rmb:
call modrmb
mov edx,offset __regb
call regb
ret
_rm:
call modrm
mov edx,offset __reg
call reg
ret
_rb:
mov edx,offset regb__
call regb
call modrmb
ret
_r:
mov edx,offset reg__
call reg
call modrm
ret
........
.data
opcode dd add_rmb,add_rm,add_rb,add_r,add_accb,add_acc,push_es,pop_e........
addressing dd m_a,mb_a,md_a,reg_a
....................
sib_base dd eax_a,ecx_a,edx_a,ebx_a,esp_a,0,esi_a,edi_a
sib_index dd eax_p,ecx_p,edx_p,ebx_p,nema_,ebp_p,esi_p,edi_p
Это начальная часть проги, а вообще дизасм это очень имхо сложная задача. |
|
|
Дата: Авг 24, 2004 21:08:34 |
|
|
Дата: Авг 24, 2004 22:09:14 Эх, бездельники, Свина на вас нету. Он бы показал, что здесь вам не тут и как сапоги на пьяную голову одевать. zzzyab - ассемблер на принципе таблиц - это сакс. Мне лень искать, но где-то на форуме Свин высказал все, что думает по этому поводу. zss Ты не мучься - ты движок от OllyDbg возьми. На сайте автора лежит. В движке Свин копался - поэтому движок вроде ничего будет! |
|
|
Дата: Авг 25, 2004 06:02:02 · Поправил: zzzyab Я нашел тему svina про динну команд (в нее еще вникнуть надо), а также посмотрел _15056069__486dis_c.zip и дизасм с z0mbie.host.sk. Эти дизасмы на С да еще там куча case`ов и if-else`ов, и таблица присутствует - покажите мне без сase`овый код, - короче таких валом в сети были бы хорошие не брался бы за разработку своего. Я дизасмлю по ходу, пока полностью не расшифруюется инструкциюя и ее длинна включая и префмкс следующия не начинается, и условные переходы имхо это тормознуто. Читайте статью с таблицами по дизасму (имхо она отличная, я с помощью нее и начал разработку). Автор К. Касперский -ищите в сети. |
|
|
Дата: Авг 25, 2004 06:50:44 Читайте статью с таблицами по дизасму (имхо она отличная, я с помощью нее и начал разработку). Автор К. Касперский -ищите в сети. Не Касперский, а Касперски. Касперский - это Евгений :) Далее, Крис в той таблице наделал туеву хучу ошибок. Свин ее очень жестоко распинал. Если я тебя правильно понял - то вот документ: http://www.wasm.ru/docs/1/DisassembingErrata.zip Edmond постил сюда таблицу с декодированными опкодами. Свин отнесся к таблице куда более благожелательно. Хотя, сказал, что ошибки есть и там. Еще раз предлагаю взять движок Olly. |
|
|
Дата: Авг 25, 2004 09:16:49 Таблицы - это все конечно хорошо (удобнее). Но ведь у процессора нет никаких таблиц :) Он все делает на лету. Так вот хотелось бы такой же алгоритм придумать. Как вариант (я уже об этом говорил) создать некий конечный автомат и подавать ему на вход код. Мне кажется, что в этом случае будет выигрыш во многом (как минимум в производительности) Или я не прав ? |
|
|
Дата: Авг 25, 2004 10:07:39 2 zss Как вариант (я уже об этом говорил) создать некий конечный автомат и подавать ему на вход код. Мне кажется, что в этом случае будет выигрыш во многом (как минимум в производительности) Или я не прав ? Боюсь, что да ;-) На самом деле для программной реализации конечных автоматов (КА) используется в основном два метода - таблицы состояний либо дикая мешанина if/switch-case/goto и т.п. Дизассемблер x86 можно моделировать КА (да это и есть КА в конце концов), но при реализации от вышеупомянутых методов никуда не денешься. А как процессор "в железе" декодирует инструкции - это уже другой вопрос ;-) |
|
|
Дата: Авг 25, 2004 10:22:45 zss >Таблицы - это все конечно хорошо (удобнее). Но ведь у >процессора нет никаких таблиц :) Он все делает на лету. >Так вот хотелось бы такой же алгоритм придумать. Чем такой дизассемблер по твоему круче будет, быстрее? или это уже эмулятор? я непойму zzzyab >Эти дизасмы на С да еще там куча case`ов и if-else`ов, и >таблица присутствует - покажите мне без сase`овый код Без таблицы if`ов ваше немеренно станет >Я дизасмлю по ходу, пока полностью не расшифруюется >инструкциюя и ее длинна включая и префмкс следующия не >начинается А все остальные наугад длину определяют? Другое дело что весят нехило или использовать неудобно, а модифицировать тяжело |
|
|
Дата: Авг 25, 2004 17:58:58 Без таблицы if`ов ваше немеренно станет ни... не понимать по рюсски. Че ваше? "неменренно" - это "не измеренно" или "много" ? Я думаю регистровый сall\jmp лучше case\elseif. А все остальные наугад длину определяют Мне не нравится что они дизасмят все подряд без перебора (особенно запакованые данные), а мне надо по ходу исполнения - если что всегда додизасмть можно. WinDasm отличная прога конечно, но она делает не АСМ файл а гониво своего стандарта.Вот я хочу сфарганить что-то типо,но с АСМ файлами. volodya http://www.wasm.ru/docs/1/DisassembingErrata.zip (дя и iczelion) в идиотскои стандарте сhm - обломно, я не знаю как его переделать. Пожалуйста, где оно есть в нормальном текстовом (или хтябы pdf) виде. |
|
|
Дата: Авг 25, 2004 18:16:38 zzzyab Ищи во форуму. Где-то было. |
|
|
Дата: Авг 25, 2004 19:31:11 zzzyab Идёшь на сайт http://yarix.by.ru/ берешь прогу htm2chm декомпилишь chm и получаешь вместо chm кучу html ;-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.077 |