В попытке потрейсить ASProtect родилась идея автоматизировать немного функцию Animate Into. Основная мысль в том, чтобы автоматически вычислять границы циклов и входить в функции один раз только для того, чтобы убедиться, что они возвращаются в точку вызова. Прикрепленный плагин для Olly и производит данные действия. В данный момент есть еще идея отлавливать call и ret которые фактически не несут смысловой нагрузки вызова функции и возврата из нее, а применяются для односторонней передачи управления. Испытывалось это все на калькуляторе упакованном UPX. Исходники пока выкладывать не хочется - хочется их немного причесать
Добавлен отлов CALL и RET, которые применяются для односторонней передачи управления. Появился диалог настроек, позволяющий регулировать поток сообщений, выводимых в лог, выводить все пройденные инструкции в файл и задавать точку останова, так как обычные бряки работу плагина не останавливают. Последнюю версию выложил наверху.
Немного подробнее о том, что делает плагин. Плагин анализирует каждую выполняемую инструкцию, обращая особое внимание на rep, call, ret и различные jmp. Конструкции rep и все инструкции кроме вышеперечисленных просто выводятся в файл (если необходимо) и прошагиваются. Инструкции call ищутся в двух списках: "untrustedCall" и "trustedCall". Инструкции попавшие в первый список, анализируются так же, как если бы они были jmp. Инструкции попавшие во второй список прошагиваются с занесением в файл. Все остальные call заносятся в стек вызовов плагина, при этом запоминается предполагаемая точка возврата и значение esp. Инструкции ret ищутся в списке "untrustedRet". Попавшие в этот список инструкции анализируются также как и jmp. Для остальных производится поиск соответствующего вызова в списке вызовов и по результатам этого поиска заполняются списки untrustedRet (ret, используемые для передачи управления как jmp), untrustedCall (call, используемые для односторонней передачи управления) и trustedCall (обычные вызовы функций). Инструкции jmp, передающие управление вперед просто прошагиваются. Инструции jmp, передающие управление назад проверяются на наличие цикла. Для этого статически анализируются все инструкции от адреса перехода jmp до самого jmp. Выявляются исполняемые участки кода и инструкции, которые передают управление вперед за границы цикла. На все предполагаемые выходы из цикла ставятся бряки. Управление передается выполняемой программе. После остановки на брейкпоинте анализ продолжается с текущей инструкции. Плагин также переходит в режим пошагового выполнения при обработке исключения и не выходит из него до возвращения в программу из обработчика. Выполнение trustedCall вызовов без захода внутрь функции, а также вычисление границ циклов и позволяет достаточно быстро протрейсить приложение до нужной точки, при этом все выполненные инструкции можно сохранить в файл. По ходу работы плагин выводит в лог OllyDbg диагностические сообщения, уровень подробности которых можно регулировать. Так как пока плагин не останавливается на бряках поставленных юзером, в опции внесено поле для ввода адреса остановки. Выполнение плагина можно остановить с помошью меню отладки выбрав пункт пауза или нажав F12. Один шаг алгоритма можно выполнить выбрав пункт Step в меню плагина или нажав Alt+S.
Скачал. Если сегодня будет время обязательно протестирую на Alladin eToken. Это такая система авторизации по токенам. Там исполняемый файл как-то зашифрован Upx и Yoda Crypter. Толи исполняемый файл зашифрован сначала upx, а потом Yoda Crypter, то ли наоборот, то ли там что-то свое очень похожее на это. Но распаковать мне его удалось только вручную. Никакие унпакеры его не взяли. И это было очень трудно. Посмотрим как поведет себя твой плагин.
Спасибо, буду рад любым результатам Сам пока пытаюсь понять как правильнее обрабатывать исключения внутри трассируемой программы. Сейчас с исключениями все довольно криво. В частности, обработчик исключения не трассируется.
Все может быть, хотя никто до сих пор не жаловался Выложил пожатый чисто ZIPом - накладок быть не должно.
Я пытался по максимуму использовать уже существующие средства, такие как дизассемблер OllyDbg. Хотелось как можно быстрее получить работающий инструмент. Хотя алгоритмы лежащие в основе плагина могут быть легко перенесены под любой отладчик/дизассемблер предоставляющий подходящий интерфейс. Мне было бы интересно обменяться опытом на этой почве. Могу выложить описания алгоритмов, которые я использую (на это потребуется немного времени ).
Ну незнаю, я гонял прогу: Код (Text): model flat .code sta: mov ecx,manymanymany _1: mov [0],eax loop _1 end sta в итоге получалось 30к итераций / 1 сек. (мне этого крайне мало) waitfordebugevent--continuedebugevent на системах от 9х до ХР, и процах дурон800-сортон-2000+ (с TF флагом аналогичная ситуация).... Вобщем загвоздка не в железе, а в системе, поэтому пришлось придумывать и искать альтернативные пути, один из к-х на MSR и кстати который хорошо уживается с отладчиками 3-го кольца. К большому моему сожалению, отсутсвием фантазии я не страдаю, а вот писать проги для себя не умею (она самая мешает): то там так сделать, то там переделать... вобщем проект стоит на месте и есть куча разрозненного кода ----- ЗЫ по поводу архива посмотри аттач очень забавно ЗЗЫ я старался, скриншотил, а архив подменили , т.е. я хотел сказать, что прилепил скриншот к старой версии архива.