Вход

Просмотр полной версии : Дизассемблеры Z80 и инструменты статического и динамического анализа кода.



siril
20.04.2013, 13:19
Вот тут (http://zx.pk.ru/showthread.php?p=594692) завёл тему про анализ произвольных cp/m приложений.

По ходу действия стал вопрос: "какие есть 'умные' интерактивные дизассемблеры для z80 (кроме дорогущего IDA Starter/Pro)"?

И что эти "умники" умеют?

1) где можно было бы промаркировать часть кода как исполняемый, часть как данные? (для кода получить дизассемблер, для данных, в зависимости от типа DB xx/DW xxxx).

2) какие (и где) есть инструменты динамического анализа кода?
к примеру, для того, чтобы получить маркировку участка исходного кода как "исполняемых данных" достаточно запустить программу под эмулятором, некоторое время погонять её с включенным логированием состояния регистра PC (указатель адреса исполняемой команды) - как результат получим массив адресов, по которым реально расположен исполняемый код.

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

д) логирование исполнений команд перехода (сбор для каждого исполняемого адреса с какого адреса перешли по данному адресу (если предыдущей командой была команда условного/безусловного перехода).

3) какие (и где) есть инструменты статического анализа кода?
к примеру, указываем стартовый адрес блока (org #0100) - и пробегаем код (без исполнения) с анализом ветвлений: строим граф переходов, в котором каждая из команд условного перехода - вершина, параллельно помечая пройденные адреса команд как исполняемый код. Если какие-то исполняемые участки были пропущены динамическим анализом в п. 2), то тут мы получим информацию о дополнительных редкоисполняемых участках программы.

При подобном анализе есть несколько (разрешимых) проблем:
анализ переходов по jp (hl), jp (sp) = ret. В случае с ret - нужен контроль за состоянием стека.

Ну и инструмент для разбора всей этой статистики =)

И где и как это реализовано? Где и как это можно реализовать? =)

esl
20.04.2013, 13:37
все равно имхо иде конкуренции пока нет :(

по части вопросов посмотри на
http://simonowen.com/blog/2012/12/04/spectrum-snapshot-tracing/

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

---------- Post added at 12:37 ---------- Previous post was at 12:35 ----------

кстати под CP/M есть дизасм в котором можно расставлять DB/DW/CODE etc etc
название сразу не вспомню, но имхо использовать его сейчас смысла нет

perestoronin
20.04.2013, 13:44
IDA
IDA далеко не умный, хотя зачатки интеллекта у него кое-какие заложены.
Лучше программиста никто не справится с задачей дизассемблирования, а для этого годится любой простой подручный дизассемблер
http://www.tablix.org/~avian/blog/articles/z80dasm/
http://www.z80.info/z80sdt.htm#SDT_DISASM_UNIX

Также можно поспрашивать здесь: http://www.z88dk.org/forum/forums.php

Raydac
20.04.2013, 13:56
Лучше программиста никто не справится с задачей дизассемблирования, а для этого годится любой простой подручный дизассемблер

зависит от объемов анализируемого, комп может и тупой но он железный как паровоз

esl
20.04.2013, 14:04
IDA далеко не умный, хотя зачатки интеллекта у него кое-какие заложены.
Лучше программиста никто не справится с задачей дизассемблирования, а для этого годится любой простой подручный дизассемблер


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

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

например,
есть голый файл, с чего начать
нашли в дампе строку текста, перешли к ней
нашли ссылку на нее (допустим поиском по адресу)
посмотрели как используется

ну типа загрузили в HL и CALL XXX
перешли в XXX
посмотрели - вывод, назвали StrPut, написали в автокомет что параметры в HL - str, b-x,c-y
теперь в коде всегда будет при CALL XXX ; HL - str, b-x,c-y
что помогает



в редакторе этого не получить

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

плюс возможность писать код для автоанализа

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

и прочеее

siril
20.04.2013, 14:04
Лучше программиста никто не справится с задачей дизассемблирования

Верно, однако если процесс можно сделать более простым и приятным зачем отказываться от инструментов?

Если иметь под рукой собранную качественную статистику об исполняемом коде, можно делать следующее: наткнулись в дизассемблированном листинге на jp (hl) какому-либо адресу: посмотрели в статистике по каким адресам с этой инструкции осуществлялись переходы, и жить стало веселее.

Всё что может быть автоматизировано - должно быть автоматизировано =)

esl
20.04.2013, 14:09
обычно в одном окне IDA
в другом - эмулятор в отладчике ;)
сильно помогает

Vadim
20.04.2013, 14:19
кстати под CP/M есть дизасм в котором можно расставлять DB/DW/CODE etc etc
название сразу не вспомню, но имхо использовать его сейчас смысла нет
Сразу видно, что CP/M софт вы не искали. Не то что "есть". Есть и много. Самый продвинутый - DD80.

Shadow Maker
20.04.2013, 16:15
Я поддерживаю Esl, лучше IDA нет инструмента для тотального дизассемблирования. Она единственная заточена именно под нужды разборщика кода, все остальные конечно дизассемблер делают, но все, что я видел - неуклюжи, неудобны, сложно менять ссылки (ну вот переназвать метку, например, захотел - целая проблема, если метка неуникальная - например надо тебе переназвать Print, а у тебя кроме этого принта - еще куча всяких PrintX, PrintXY и тп, простым редактором этого не сделаешь, надо или регекспы писать, или еще чего, в общем полный неудобняк).

Из CP/M самый нормальный был действительно DD80, я помню в сравнении со спековскими дизасмами в 90х он был как космические технологии. Но он же консольный, поэтому никакой интерактивности, сиди и переписывай карту. Вроде еще IXH, IYH и прочие не особо документированные не поддерживал, не помню уже.

alone
20.04.2013, 16:25
Pro Tracker, Perfect Commander и Mr Gluk Reset Service я дизассемблировал в дизассемблере Иноземцева. Очень интерактивно и удобно.

Vadim
20.04.2013, 16:29
Вроде еще IXH, IYH и прочие не особо документированные не поддерживал, не помню уже.
Ничего недок не поддерживает. Я почти все свои дизасмы делал через него. А имена меток меняю в текстовом редакторе, по мере разбора исходника.

Shadow Maker
20.04.2013, 16:30
Ну это на безрыбье же. Сейчас-то зачем изголяться. Я тоже че-то там дизассемблировал в ZXD, получалось нормально, но с IDA не сравнить.

---------- Post added at 16:30 ---------- Previous post was at 16:29 ----------


Я почти все свои дизасмы делал через него. А имена меток меняю в текстовом редакторе, по мере разбора исходника.
Ну вот я как раз пример и написал, что если надо поменять Print, а у тебя кроме Print еще куча, начинающихся с Print, будет хреновато.

Vadim
20.04.2013, 16:53
Сейчас-то зачем изголяться. Я тоже че-то там дизассемблировал в ZXD, получалось нормально, но с IDA не сравнить.

Я пробовал IDA, но что-то не нашёл там особо крутого. Скажу сразу, что разбирался мало. Первой проблемой было указать ей, что код стартует не с 0.

Eltaron
20.04.2013, 17:44
Первой проблемой было указать ей, что код стартует не с 0.
Там прямо при открытии файла указываешь offset, с которого он в памяти располагается.

esl
20.04.2013, 17:55
Сразу видно, что CP/M софт вы не искали. Не то что "есть". Есть и много. Самый продвинутый - DD80.

ага, ни искал, точно
проcто использовал на Корвете resourcer
вот вытянул для фомы доку со своего диска рабочего тех времен





Oперационная система CP/M.
Диалоговый дизассеммблер.
Руководство оператора.

Содержание.



1. Введение.................................. ...................

1.1. Возможные ошибки...................................... .....

2. Описание команд...................................... ......

2.1. команда ";" - ввод коментария.............................
2.2. команда "A" - поиск DB....................................
2.3. командА "B" - ввод меток..................................
2.4. команда "C" - корректировка управляющей таблицы...........
2.5. команда "D" - вывод содержимого памяти....................
2.6. команда "E" - ввод меток в таблицу символов...............
2.7. команда "F" - поиск адреса или метки......................
2.8. команда "K" - удалить метку...............................
2.9. команда "L" - вывод листинга..............................
2.10. команда "O" - установка смещения..........................
2.11. команда "P" - создание пролога............................
2.12. команда "Q" - подавление вывода на консоль................
2.13. команда "R" - чтение файла................................
2.14. команда "S" - запись на диск..............................
2.15. команда "U" - определение области коментариев.............
2.16. команда "Z" - закрыть файл .ASM...........................

3. Пример дизассемблирования.............. ...................


4. Краткий перечень команд...................................





1. Введение

RESOURCE - диалоговый дизассемблер, который был разработан
не по заранее составленноме плану, а в результате длитeльного
общения с компьютером,и который модифицировался свыше двух лет
постановки в СР/М.

Структура RESOURCE.

RESOURCЕ - этo файл типa СОМ, который занимает при работе
адреса С 100Н до 1700H, за которыми идет стек, начиная с 1800Н
располагается управляющая таблица на 512 входов по 3 байта каж-
дый, которая определяет формат листинга, получаемого дизассембле-
ром т.е. выявление DB, DS, DW команд D т.д. начиная с 1Е00Н
располагается таблица символических имен, она не имеет определен-
ной длины и если символические имена не используются, занимает
два байта.


---------- Post added at 16:55 ---------- Previous post was at 16:49 ----------


Я пробовал IDA, но что-то не нашёл там особо крутого. Скажу сразу, что разбирался мало. Первой проблемой было указать ей, что код стартует не с 0.

при загрузке можно указать куда конкретно грузить
дальше просто перейти по нужному адресу и нажать "C" Code

я кстати ингода делаю полный дамп состояния памяти
(чтобы все переменные например были в рабочем состоянии)
а далше уже гружу все и начинаю с нужного адреса

ида вообще при заргузке кода как Z80 пишет при старте что не знает где взять адрес начала и говорит что надо начать самому.

Shadow Maker
21.04.2013, 00:39
Я пробовал IDA, но что-то не нашёл там особо крутого. Скажу сразу, что разбирался мало. Первой проблемой было указать ей, что код стартует не с 0.
Я даже боюсь спросить, сколько секунд пробовал, раз на этапе загрузки возникла проблема :) Короче это всё на уровне работы с инструментом, так всегда, пока не разберешься.

char
21.04.2013, 06:40
много разных утилит:

http://trd.speccy.cz/sbor.php
Ассемблеры Z80 для PC и сопутствующее

http://www.worldofspectrum.org/utilities.html
CROSS-DEVELOPMENT



1) где можно было бы промаркировать часть кода как исполняемый, часть как данные? (для кода получить дизассемблер, для данных, в зависимости от типа DB xx/DW xxxx).


ftp://ftp.worldofspectrum.org/pub/sinclair/tools/pc/SPEDIZ.zip

SPEDIZ: Spectrum Dizassembler v1.5 (PC/Windows), by SerzhSoft.
Can disassemble Z80 code, the result of which can then be fed again to e.g. SjASMPlus.

perestoronin
21.04.2013, 07:37
На этом ресурсе буду складывать и для Z80 инструменты которые можно использовать в Gentoo Linux (http://gentoo.ru/) помимо штатных из portage, некоторые ebuildы написаны мною лично:
http://portage.perestoroniny.ru/dev-embedded/

Barmaley_m
22.04.2013, 03:57
В пакете CP/M от ASC был дизассемблер под названием "DISZILOG". Там в консольном режиме можно было указать участки, где размещается код, а где - данные (и в каком они формате). Процедура дизассемблирования получалась итерационной: сначала примерно намечаешь отладчиком границы кода и данных, потом по мере понимания программы уточняешь координаты и запускаешь процесс заново. Также этот дизассемблер умел находить "мертвые" участки кода, перед которыми стоит команда безусловного перехода или возврата и к которым нет обращения командами перехода или вызова. Иногда даже эти "находки" оказывались верными. С помощью этого дизассемблера я в свое время успешно разобрал "библиотекарь" LIB80 с целью изучения формата REL и несколько музыкальных плееров на AY. С IDA не сравнить, но на реале на то время ничего лучшего в моем распоряжении не было.

jyly0s
29.03.2015, 21:29
подскажите алгоритм перевода игр выложенных на worldofspectrum в удобночитаемый код? c/c++ ?

Alex Rider
29.03.2015, 23:11
Ломаешь загрузчик, определяешь точку входа, и вперед от нее с IDA Pro. Можно в отладчике эмулятора найти места вывода на экран по записи в #4000 - #5aff и чтения из портов #1f и #fe и попробовать плясать от них. Полноценный дизассмблер - работа совсем не на один день. Цель какая? Декомпиляторов z80 в c/c++ не знаю, игр на них написаны единицы, и, как правило, там достаточно чистого ассемблера.

Shadow Maker
30.03.2015, 00:27
подскажите алгоритм перевода игр выложенных на worldofspectrum в удобночитаемый код? c/c++ ?
99% игр написаны на басике или ассемблере, откуда там c++?

denpopov
30.03.2015, 04:52
ггг, эмуляторы z80 на Си написаны?