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

 WASM Phorum —› WASM.RESEARCH —› Как написать дизассемблер?

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

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


Дата: Авг 8, 2003 14:08:55 · Поправил: Edmond

The Svin
Вы наверно не совсем поняли.
Конечно нет!! Не быстро!!!

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

А теперь представте, как вы напишите процедуру подсветки, если этими структурами будет ФОРМАТ ИНТЕЛ!!!

Что качается компилятора XASM, то прежде чем сгенерированный скриптами код асма попадёт к линкёру, он проходит стадию низкоуровневой оптимизации.

Представте, что мы используем формат ИНТЕЛ?

Вот у вас есть код:

push 0
push 0
push 0
push 0
push 0



После оптимизации

xor eax,eax
push eax
push eax
push eax
push eax
push eax



Когда всё представлено в лёгком структурированном виде, когда легко отделяются параметры от команды, скорость анализа соотвествующая, а ЕЩЁ СКОРОСТЬ МОДИФИКАЦИИ!!!!

Именно из-за неё кстати мой формат и не прошёл.
Если со скорость анализа, я могу смирится, то со скоростью модификации ( которая раз в 10 меньше, чем у анализа) нет.


Дата: Авг 8, 2003 14:12:24

Edmond
мне всё равно, что уже придумали

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

А вот в ЯВУ не всегда
Ну мы же с вами дисассемблер обсуждаем :)


Дата: Авг 8, 2003 14:17:18

это чуть ли не первое, что напрашивается на ум...

дааа, а мир додумывался до него аж 20 лет :)))


Дата: Авг 8, 2003 15:16:23

я вообще ради чего все это затеял...
в мозгу (мозгах?, мозге? :)) уже давно крутится идея забодяжить штучку типа Мистфола от Z0MBiE... кто не знает, это чтобы дизассемблировать PE файл, добавить в него свой код (виря например), а потом все это собрать до кучи.
Так вот, есть идея написать что-то типа эмулятора с целью того, чтобы на произвольный момент кода можно было определить, инициирована ли ячейка памяти или нет, занят регист значением или нет и т.п.
Например:
1. mov eax,1
2. mov [esi],eax
3. ...

N. mov eax,2

По идее, эта хреновина должна определять, что в блоке операций (3..N-1) регистр eax свободен, т.е. может спокойно использоваться инструкциями встраиваемого кода.
Это простейший вариант, т.к. на практике из блока (3..N-1) может идти условный переход...
Или например call [eax+4], что сплошь и рядом встречается в HLL при использовании ООП - Мистфол на таких инструкциях обламывается, и это правильно :), вот и хочется это исправить.
Все это необходимо для разделения кода и данных при анализе PE файлов - вещь очень насущная, и может использоваться от вирмэйкинга до защиты шареваринга... и, конечно, снятию ее :))
Проблема в том, что аппарат получается очень умным, и чего-то я не соображу с какой стороны к нему лучше начать подходить...


Дата: Авг 8, 2003 15:34:11

Я, честно скажу, потерялся.
Но напоследок:
1. Речь шла о дизассемлере а не ассемблере.
2. Я так и не понял, почему в некомактном формате, легче искать переменные или разваливать её на другие структуры.
И в твоём псевдоформате эти структуры, и в интеловском они же, и единственное, что я увидел что этот "промежуточный формат" легче для работы в HLL.
3. Ассемблер он вообще то язык, и как язык реальность описывает приблизительно. Бинарный код - реальность.
И нет такого ассемблера который способен в точности закодировать любой вариант, который тебе нужен. И дизассемблера который раскодирует любую последовательность.
У нас разговор плавно перешёл к компиляторам, хотя вначале начался с декодирования.
В декодировании нет никаких входных push 0 - это неточный
высокоуровневый язык асма.
есть
65 00
66 65 00
68 00 00 00 00
66 68 00 00
и так далее.
И никакого синтаксиса обеспечивающего точное соответсвие
любой из последовательностей нет, а потому и разговор
блоки опкода - подсветка в асме несостоятелен.
асм язык приблизительный, просто чуть точнее C.
Синтаксис делают как человеку понятней и удобней, формат
и алгоритм - как машине быстрей и компактней.
Пытаться искусствено "испортить" формат чтобы его скрипты
легче обрабатывали, какой тогда смысл у всех здесь потеющих над оптимизацией низкоуровневых программистов - непонятно.
Я повторюсь - внимательное изучение формата кода Интела и
осознание его
1. Познакомит с форматом программиста, и позволит ему найти промежуточную форму исходя из этого формата а не какого-то придуманого.
2. Научат его новым форматам их логике и приёмам отличным
от Сишных приметивов, более гибким, компактным, содержащим
внутрений потенциал. Не только форматы опкода но и других
системных структур Интела разительно отличаются от того что предлогают софтовые технологии.
А то вобще создаётся впечатление, что если у тех кто работает над структурами и алгоритмами в hardware идёт прогрессия - всё более интересные алгоритмы и структуры с сильным потенциалом, у софтверных программистов - регрессия.
В результате одно другое компенсирует и стоим на месте.
Лучшие алгоритмы до сих пор у Кнута ищут, который написал их в прошлом веке до того как многие из здесь присутсвующих появились на белый свет.


Дата: Авг 8, 2003 15:37:29

Max
Со стороны графов как уже сказал 90210
Хотя я бы подошёл со стороны поиска w/r, как снова таки сказал 90210 :)

, инициирована ли ячейка памяти или нет, занят регист значением или нет и т.п.

Для этого достаточно составить таблицы переменных и регистров.

Регистр считается занятым, если далее существует операция чтения из него, если же далее операция записи -- регистр свободен!!!

Операция Чтения/Записи это не только mov -- это любая инструкция которая модифицирует регистр!!!

Я бы не сказал этот анализ -- слишком умным.. :)


Дата: Авг 8, 2003 15:48:02

The Svin
1. Речь шла о дизассемлере а не ассемблере.

Да, о компиляторе, но задачи очень близки.. И там, и там анализ.

Бинарный код - реальность.
Неа :)))) Прочитай то, что я прислал :)

У нас разговор плавно перешёл к компиляторам

Каюсь, что болит о том, .. :)

блоки опкода - подсветка в асме несостоятелен.

На самомо деле состоятелен.
Вот например возмём задачу Max

Что там нужно, нам нужно взять блок кода, и анализировать его на операции чтения записи.

Чтобы это сделать мы должны группировать команды на читающие и записывающие, или на то и другое сразу...

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

Мои слова бы подтвердил 90210 который написал перекомпилятор.... в сущности в начале работы - тот же дизассемблер.

ЯВУ.. да, я не столько занимаюсь вопросами дизасма, сколько вопросами оптимизации кода ассемблера, перевод его в абстрактный код ассемблера (вроде .NET).

Вот тема машинной оптимизации АСМ кода -- просто золотая.
Сколько в ней только увёрток нет. Одно дело, когда человек сидит и оптимизирует, а другое научить машину.


Дата: Авг 8, 2003 15:57:24

Для этого достаточно составить таблицы переменных и регистров
Логично, но для этого надо объяснить автомату, какая инструкция что делает, а это не очень просто - перед movsb может стоять repz и он должен это понимать...

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

Я бы не сказал этот анализ -- слишком умным.. :)
   call VirtualAlloc
   ...
   call [eax+4]

это чуть посложнее, а вот совсем весело:
   idiv ecx

кто может сказать, какая инструкция выполнится следующей - следующая, или инструкция SEH?
для этого, надо во-первых знать состояние регистров eax,ecx,edx, а во-вторых, определить, вызовит idiv переполнение или нет.
Если кто думает, что это просто - читаем здесь http://z0mbie.host.sk/idiv_r.txt


Дата: Авг 8, 2003 16:02:34

The Svin
Я повторюсь - внимательное изучение формата кода Интела и
осознание его


Может вы меня как-то не так поняли!!!!
Я с вами полностью согласен. Но повторяю снова - вы путаете Оптимальность структуры и Оптимальность алгорима для структуры.
Это взаимосвязано!!!!

Помните эту фразу Вирта? Программы = Структуры + Алгоритмы
А не просто струкутры

Да, формат Интеловских кодов -- очень не плох (ну не скажу, что лучше нельзя). Да, но ведь их анализ ведёться специальными миросхемами, которые были созданы ради этого!!!!!

Думаете я этого не понимаю?
Да, пожалуста.
Тут же используется принцип:

1. Младшие биты - биты маршрутеризации
2. Старшие биты - биты определители

Этому принципу лет уже 30!!!

Так делаюстя сложные структуры

Вот классический пример записи числа структурой переменного размера

1. Первый бит в байте показывает сколько занимает число.
Если он установлен, то число занимает 2 байта.

Иначе число занимает один байт.

2. Если число занимает два байта, то старший бит второго байта указывает, содержит ли число старший разряд.
То есть если бит установлен, то на самом деле число занимает 3 байта, и его старшая часть содержится в третьем байте....
Если старший бит трьетьего байта установлен, то число занимает 4 байта

Вот простой пример из практики -- он самый лёгкий...

Если хотите, я покажу вам пример моего формата.
Посмотрим у кого лучше продумано у меня или у Интел!

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

Лучшие алгоритмы до сих пор у Кнута ищут,

Раз вы вспомнили Кнута, то и я всмомню, то как он хорошо показал, что оптимальность алгитма зависит от оптимальности структуры, но обратнопропорциональна сложности её анализа или архитектуре...

Кажется надо мне дописывать статьи о Управлении памятью, и показать как можно делать структуры и компактно и сохранять скорость анализа.


Дата: Авг 8, 2003 16:06:59

Max
Секундочку!!!
Вам что надо? Найти занятые регистры, или программу эмулировать. Помоему это совершенно разные задачи...

Предсказание переходов != слежение за регистрами.

Может тогда задачу сформулируете полнее. Или наоборот поподробнее.

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

Ссылочка дохлая :(


Дата: Авг 8, 2003 16:14:11

кто может сказать, какая инструкция выполнится следующей - следующая, или инструкция SEH?

Вообще говоря насчёт SEH!!!
При чём тут оно?

После обработки SEH должно всё равно вернуть всё на место..
Или передать управление в другую область. Нет -- это не ваша проблема.


Дата: Авг 8, 2003 16:23:57

какая инструкция что делает, а это не очень просто - перед movsb может стоять repz и он должен это понимать...

Это вы усложняете.

Держите таблицу команд

Типа там флаги у каждой комнды

1. Флаг Чтения
2. Флаг записи

Что сложного?

reps -- это команда, которая читает/пишет в ecx
И что?


Дата: Авг 8, 2003 16:28:41

Edmond

call:

1. Читает с [операнд]
2. Пишет в стек
3. Пишет в esp

То есть нужен список того, куда и во что команды пишет/читает

Например mov

1. Читает [операнд1]
2. Пишет [операнд2]

inс

1. Читает
2. Пишет

Можно даже ввести понятие модифицирует == читает/пишет


Дата: Авг 8, 2003 16:34:00

Edmond
Вам что надо? Найти занятые регистры, или программу эмулировать. Помоему это совершенно разные задачи...
Для того, чтобы определить заняты регистры или свободны необходимо "эмулировать программу", точнее ход ее выполнения, с целью определения моментов модификации регистра (т.е. он используется сейчас, и, скорее всего, будет использоваться позже), и их инициализации (типа mov, т.е. до этой команды состояние регистра не имеет значения).
Для этого необходимо пройти по всем возможным веткам программы, посмотреть какие из них могут привести нас к интересующей инструкции, а потом делать какие-то выводы.
Короче говоря, необходимо восстановить алгоритм программы, а для этого надо эмулировать ее выполнение.

После обработки SEH должно всё равно вернуть всё на место
Во-первых, не факт - на асме я могу замаскировать вызов подпрограммы неявно (через call), а через SEH, и таких примеров куча, напр. уход от отладчика:
   xor eax,eax
   mov [eax],eax

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

Ссылочка дохлая :(
Оппа! Внатуре! А пол-часа назад была живая, может кто-то быстро реагирует?
Можно попробовать на англицком сюда http://z0mbie.host.sk/idiv_e.txt


Дата: Авг 8, 2003 16:44:05

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

Что с самого начала????
Нууу. Это уже IA ^))

Ок, на этот вопрос я не знаю ответа.. Но подумаю.

а через SEH, и таких примеров куча, напр. уход от отладчика:

вот за что вы взялись!!! Ну что ж интересная головоломочка :))

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

Ну вы зверь!!!!!!

Тогда вам нужно отладчик + дизассемблер писать %)))

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


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