Нужен логгер, который записывает абсолютно всю информацию об исполнении процесса и потом предоставляет ее в удобоваримой графической форме. Выбираешь диапазон памяти, а логгер потом выполняет инструкции по одной и после каждой инструкции запоминает саму инструкцию, содержимое изменяемых регистров и содержимое изменяемых байтов из диапазона памяти. После создания лога можно просматривать историю изменения каждого байта, т.е. когда, откуда скопировался, с чем был поксорен, куда и кем был записан пойнтер на этот байт, сколько раз был прочитан и изменен, на выполнение какого участка кода повлиял, какие инструкции и в какой момент времени читали или изменяли байт. Кто-нибудь встречал такую прогу?
Трейсер на основе любой подходящей (по уровню антиотладки) технологии, плюс аппаратные точки останова на нужные байты, там где надо - PAGE_NOACCESS для областей памяти. Остальное - анализ окресностей кода зацепившего соответствующее исключение. Для некоторых кусков кода - вполне будет работать. Чтобы работало для всех - надо писать свою виртуальную машину и эмулировать все инструкции, включая и ОС, самому...
Большой размер лога - не беда. Просмотрщик должен иметь много разных фильтров, чтобы не потеряться в куче информации. Например, можно выбрать 2 куска по 10 байтов памяти, в которую вводятся имя и серийник, и просмотреть исчерпывающую информацию о том, что программа делала с ними и что они делали с программой.
можно выбрать 2 куска по 10 байтов памяти, в которую вводятся имя и серийник Если тебе только это нужно, нафиг огород городить с суперлогами и их суперпросмотрщиками?
Ну это мне сейчас только это нужно, а завтра мне что-нибудь более сложное понадобится. Хотелось бы иметь универсальный инструмент для изучения работы программ.
Son of God Да встречал - собственноручно написанный отладчик. Но он работает только на моей машине(Pentium 3 + не APIC), поскольку решаемые вопросы специфичны к конкретной аппаратуре. Т.о. если позволяет уровнь знаний - пиши совой, а если необходимо только изменить денежную сумму, или очки опыта в игре, то вполне сойдет и Art Money помоему это так называется.
Хотелось бы иметь универсальный инструмент для изучения работы программ. Это не возможно ... Универсальность это миф !!! Всегда выплывает задача которая не зезет в заданные рамки.
При любой системе аксиом и правилах вывода всегда найдутся утверждения, истинность или ложность которых нельзя доказать в рамках данной системы. Типичный пример - парадокс Бертрана-Рассела. Или доказательство невозможности построения универсальной машины Тьюринга.
А почему бы нет ? Та же трассировка, только в "пассивном режиме". Последовательно трейсит код - изменило регистр\флаг - в лог. Встретилось обращение к памяти - кусок дампа в лог. Как специализированная утилита для небольших программ - вполне осуществимая реальность.
в SoftICE под 9х был trace simulation mode. Т.е. можно было делать лог исполнения определённого участка(участков) кода, а потом ходить по нему в режиме симуляции трассировки. Дебаггер IDA умеет делать лог исполнения. Но всё это, конечно, не в тех масштабах, что тебе нужно. Кстати, Pentium4 имеет аппаратные средства для записи лога исполнения, может пригодится для твоего логгера. См. "Branch Trace Store (BTS)" в Интеловском мануале.
Я тут делаю кое-что в этом плане для Windows двумя разными способами, используя Branch Trace Store и динамическую двоичную трансляцию. С BTS можно определить только какие инструкции были исполнены (без адресов данных и самих данных). При этом ещё нужно чтобы код был неизменяемым – записываются только адреса кода. Несмотря на аппаратную поддержку тормозит довольно сильно. Зато сразу и kernel трассируется и без особых усилий. Второй способ позволяет получить всю информацию об исполнении. Исполняется не сам код, а его динамически созданная копия (a la Crusoe), которая сохраняет что нужно. Реально в файл записывается только небольшая часть данных считанных из памяти, остальное восстанавливается повторным исполнением кода из trace-файла. Это позволяет существенно уменьшить trace-файл. Скорость исполнения снижается в 10-50 раз. Пока что не все проблемы решены, например прерывания на границе инструкций. Да и не все инструкции реализованы. Могу дать screenshot'ы, но мне некуда их выложить. С практическим использованием пока никак, но BTS версию можно доделать в относительно короткие сроки, я использую её для отладки второго варианта и некоторых исследований ядра. Можно использовать Int 1, но это будет ещё медленнее (особенно при использовании отладочного API – OllyDbg трассирует только где-то около 5000 инструкций в секунду) и придётся сохранять гораздо больше информации.