Вот тут завёл тему про анализ произвольных cp/m приложений.
По ходу действия стал вопрос: "какие есть 'умные' интерактивные дизассемблеры для z80 (кроме дорогущего IDA Starter/Pro)"?
И что эти "умники" умеют?
1) где можно было бы промаркировать часть кода как исполняемый, часть как данные? (для кода получить дизассемблер, для данных, в зависимости от типа DB xx/DW xxxx).
2) какие (и где) есть инструменты динамического анализа кода?
к примеру, для того, чтобы получить маркировку участка исходного кода как "исполняемых данных" достаточно запустить программу под эмулятором, некоторое время погонять её с включенным логированием состояния регистра PC (указатель адреса исполняемой команды) - как результат получим массив адресов, по которым реально расположен исполняемый код.
Аналогично можно проанализировать и запись/чтение из адресов памяти:
а) если из ячейки памяти данные только считывались - перед нами константа,
б) если только записывались, а потом исполнялись - перед нами кусок самомодифицирующегося кода,
в) если записывались/считывались - перед нами переменная (разрядность переменной определяется по команде считывания, возможный вид участка памяти - по способу адресации (если через индексные регистры - то, возможно перед нами массив глобальных переменных),
г) перемещался ли блок памяти и откуда/куда (в каком количестве).
д) логирование исполнений команд перехода (сбор для каждого исполняемого адреса с какого адреса перешли по данному адресу (если предыдущей командой была команда условного/безусловного перехода).
3) какие (и где) есть инструменты статического анализа кода?
к примеру, указываем стартовый адрес блока (org #0100) - и пробегаем код (без исполнения) с анализом ветвлений: строим граф переходов, в котором каждая из команд условного перехода - вершина, параллельно помечая пройденные адреса команд как исполняемый код. Если какие-то исполняемые участки были пропущены динамическим анализом в п. 2), то тут мы получим информацию о дополнительных редкоисполняемых участках программы.
При подобном анализе есть несколько (разрешимых) проблем:
анализ переходов по jp (hl), jp (sp) = ret. В случае с ret - нужен контроль за состоянием стека.
Ну и инструмент для разбора всей этой статистики =)
И где и как это реализовано? Где и как это можно реализовать? =)