На главную

FLASH SWF AVM1/AVM2 Code Flow Tracer
SWF AVM1/AVM2 Tracer - утилита для реверса SWF-Flash. Получает информацию о потоке исполнения инструкций AVM1/AVM2 в SWF файле
Одно из применений - если декомпиляция завершается неудачно и нужно найти место и пропатчить обфусцированный swf файл

Возможности:
Полный лог выполняемых инструкций AVM1/AVM2 flash-плеера, включая строки и параметры
Для SWF > 8.5 дамп данных флеша (теги и данные тега doABC)


Работа основана на внедрении DLL в адресное пространство браузера, и перехвате управления.

Внимание:  Во время разработки, актуальной версией плеера была 10.0.45.2 поэтому все настроено на него.
Для работы надо скопировать эту версию (10.0.45.2 debug идет вместе с монитором) в папки, где находится плеер (NPSWF32.dll):
%WINDIR%\system32\Macromed\Flash\NPSWF32.dll - это файл плеера Для старой оперы (9.X) плеер лежал в папке с самим браузером

Теперь насчет браузеров:
Поддерживаются только браузеры, которые работают в одном процессе - Opera, FireFox 3.XX
НЕ ПОДХОДЯТ:  FireFox >= 4, Chrome, InternetExplorer

Описание работы:
Не секрет, что флеш плеер AVM1 (ActionScript2) является интерпретатором.
Это очень хорошо для создания монитора инструкций. Нужно в Flash-плеере найти место, где происходит выборка/декодирование опкодов , прикрутить дизассемблер инструкций, парсинг параметров, и получим более-менее рабочий логгер, что и было проделано

Для ActionScript3 (AVM2) разработчиками было проведена оптимизация по скорости за счет JIT (Just In Time compilation). Для скорости хорошо, для монитора плохо.
Порядок преобразования кода плеером при компиляции такой:

AVM2 ==> MIR ==> Код целевого процессора

Было потрачено много времени на обдумывание монитора AVM2
Была идея внедрять код в MIR (Macromedia Intermediate Representation) еще нет кода под целевой процессор, но уже нет и AVM2 кода
Была идея искать место кода генерации под целевой процессор, опять же успеха не имела.
В результате, была использована особенность флеш-плеера, а именно ИНТЕПРЕТИРОВАТЬ AVM2 код. А имеено код инициализации ($init, $cinit) Было найдено место в плеере где проводился анализ и патч

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

Как пользоваться tracer'om:
Трейсер состоит:
injector.exe - внедряет DLL в процесс
intruder.dll - собственно сам tracer
options.ini - настройки

1. Если нет браузера из списка, установить (см. выше)
2. Заменить DLL плеера (см. выше) 3. К сожалению работа плеера не такая простая)) Если мы запустим флеш на исполнение, то это не значит что будет исполнятся только он Например меню настроек в плеере по правой кнопке мыши, это тоже флеш. Поэтому для отделения других флешек от нашей и получения лога трассировки, нужно провести подготовительные вещи, а именно нужно в файле с флешем первые 8 байт записать в options.ini

[Options]
;First bytes of target SWF
byte0=0x43
byte1=0x57
byte2=0x53
byte3=0x09
byte4=0xc8
byte5=0x05
byte6=0x00
byte7=0x00
3. В архиве с трасером идет утилита injector.exe - выбираем exe браузера, внедряемся Если все прошло нормально, то на винте появится текстовый файл C:\flash.trace.txt с инструкциями и прочей инфой Будет выглятеть примерно так. (показано для AVM2, вырезано лишнее)

В архиве идет тестовая флешка , с настренным options.ini
Все что нужно - внедрится в браузер и открыть флешку. Должен появится лог-файл. Во время тарссировки работа замедляется, и лог может получится очень большим
Например лог от флешки под doswf (распакованный 27метров) тут

Формат лога:
Смещение в doABC tag| AVM опкоды | Дизасм. инструкции
00000588 D0 	getlocal0 
00000589 30 	pushscope 
0000058A F1 06 	debugfile 6 ("C:\Documents and Settings\user\My Documents\Flex Builder 3\ascccccc\src;;ascccccc.as")
0000058C F0 05 	debugline 5
0000058E 65 	getscopeobject 
00000590 60 0F 	getlex 15 ("Object")
00000592 30 	pushscope 
00000593 60 10 	getlex 16 ("flash.events::EventDispatcher")
00000595 30 	pushscope 
00000596 60 11 	getlex 17 ("flash.display::DisplayObject")
00000598 30 	pushscope 
00000599 60 12 	getlex 18 ("flash.display::InteractiveObject")
0000059B 30 	pushscope 
0000059C 60 13 	getlex 19 ("flash.display::DisplayObjectContainer")
0000059E 30 	pushscope 
0000059F 60 02 	getlex 2 ("flash.display::Sprite")
000005A1 30 	pushscope 
000005A2 60 02 	getlex 2 ("flash.display::Sprite")
000005A4 58 00 	newclass 0
00000484 D0 	getlocal0 



Заметки про обфусцированные файлы:
Возьмем к примеру протектор doswf
Он шифрует оригинальную флешку и приписывает загрузчик. чтобы получить лог от оригинальной флешки, нужно провести след.
1. получаем лог от криптованой флехи
2. К примеру, находим в лог-файле след. строки "Not our SWF => 46 57 53 XX YY ZZ WW CC "
Это означает что начинается исполнение флешки, и сигнатура не совпала с нашей. Одна из этих флешек будет искомой разкриптованой 3. подставляем в options.ini сигнатуру 46 57 53 XX YY ZZ WW CC. перезапускаем браузер и получаем лог уже от распакованой флешки Есть вариант останова на моменте передачи управления и дампа распакованой флешки (в этой версии не реализована) Плюс распакованую флешку надо патчить (там остается код протектора)

Epilogue
При желании утилиту можно превратить в отладчик swf с выводом регистров и стека байт-машины
Если у кого появится желание пишите))


СКАЧАТЬ FLASH_SWF_AVM_Tracer / DOWNLOAD FLASH_SWF_AVM_Tracer

Теги: Flash, SWF , AVM , AVM1, ActionScript2, ActionScript3, reversing tool
© black_ninja    http://blackninja2000.narod.ru

Используются технологии uCoz