Adobe Profiler Fail

SilenceAndy 18 февраля 2010 в 16:59 10,2k
Доброго вечера всем хабравчанам. Я долго думал как назвать данный пост и решил назвать первым, что придет на ум. В принципе данное название почти полностью описывает то, о чем хочу рассказать. А расскажу я о том, как можно легко и просто вносить изменения в абсолютно любой просматриваемый вами swf файл без декомпиляции.


И так начнем. Нашим подопытным будет плеер YouTube.

Сначала я расскажу немного предыстории. Во Flex как и в любой приличной технологии есть возможность профайлинга приложений. Для профайлинга используется специальный агент — который загружает в себя конечный swf файл и передает данные в профайлер через socket соединение.

Тут у тех кто работает с flash может возникнуть вопрос «Как наш агент может получать данные из файла для профайлинга, если они находятся в разных доменах?»
Во Flash существует ограничение прав доступа. Например если мы загружаем файл A с сайта siteA.com, и в него загружаем файл B с сайта siteB.com, то для возможности доступа B к коду A, мы должны вручную дать права на доступ к коду A (используя ApplicationDomain и LoaderContext) или же передать ссылку на объект A в B. К тому же на siteB.com должен быть файл crossdomain.xml позволяющий осуществлять кроссдоменные загрузки. Такие дела.

Все очень просто. Когда наше flash приложение загружено, оно создает специальное недокументированное событие «allComplete», которое и отлавливает наш Flex Profiler, а из события мы уже можем получить ссылку на объект нашего приложения. Эта ссылка и есть та дырочка, через которую мы можем пролезть, в любое приложение.

А самое интересное в том, что в данный агент, загружаются абсолютно все файлы которое открываются Flash плеером — из всех плееров и плагинов для браузеров.

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

Этап нулевой


Для возможности дебага, нам нужен дебаг плеер. По размеру он чуть побольше стандартного. Скачать его можно тут.

Этап первый


Первое что нам понадобится, это наш собственный кастомный агент для профайлинга. Весь его код, составит 60 строк. Вот его код (из-за отсутствия нормальной подстветки AS3 кода, вставил как картинку, в низу кода есть ссылка на скачивание исходников).



Скачать: Исходный код | Скомпилированный агент

Скачиваем скомпилированный агент себе, и помещаем в любую понравившуюся нам папку.

Этап второй


Ок, теперь у нас есть собственный агент, который получает ссылку на загруженное приложение, и передает ее дебагеру. Добавим его в доверенные приложения. Для это нужно перейти на страницу настроек плеера, и выбрать файл Injector.swf

Теперь скачаем сам дебагер. В данном случае используется DeMonsterDebugger — отличный дебаггер выполненный в виде AIR приложения. Устанавливаем его.

Этап третий


Теперь нам нужно установить значение нашего профайлера в конфигурационный файл плеера. Файл имеет название mm.cfg и лежит в следующих директориях.

Windows 2000/XP C:\Documents and Settings\{username}\mm.cfg
Windows Vista/7 C:\Users\{username}\mm.cfg
Mac OSX /Library/Application Support/Macromedia/mm.cfg
Linux /home/username/mm.cfg

Если файла нет, просто создайте его.

Теперь прописываем путь до профайлера. Добавьте следующую строку в ваш mm.cfg:

PreloadSWF={путь до файла агента}

Пример:

PreloadSWF=D:/Workspace/Injector/bin/Injector.swf

Этап четвертый



Перезапускам наш браузер/браузеры или flash плеер. Запускаем заново, и открываем наш DeMonsterDebugger.



Главное помните, что у вас должен быть открыт всего 1 swf файл, иначе к клиенту дебагера подключится тот, чей код выполнится первым.

Чем это все чревато


Чревато геморроем для разработчиков. Благодаря этому багу, вы можете создать свои обертки для любого приложения на flash и делать code injection внутрь этих приложений. При чем определить такой injection на стороне приложения крайне трудно.

На вскидку могу придумать несколько применений этого бага:
  • Использование в браузерных мультиплеерных играх — это позволит вам видеть скрытые параметры, которые не выводятся на экран, вы можете контролировать передаваемые данные или просто написать бота.
  • Обертки для получение ссылок на ресурсы, актуально для сайтов с музыкой и видео
  • Обертки отключающие показ рекламы или обходящие проверки зашитые в приложение
Применений данного бага множество и я не уверен, что Adobe его скоро закроет, так как это неотъемлемая часть профайлинга и дебагинга кода во Flex. Данный баг нашел Жан-Филип Аклэр (Jean-Philippe Auclair), вы можете выразить ему свои респекты в комментариях к этому посту или подписаться на его твиттер.

Проголосовать:
+95
Сохранить: