Дмитрий DarkByte Москин

Мой блог, да.
logo

История о том, как я смотрел порно

Опубликовано 11.02.2012 автором Дмитрий Москин
Несмотря на то, что статья будет посвящена деобфускации и анализу флеш ролика, не упомянуть порно никак нельзя, ибо в нём заключалась цель всего того, о чём будет написано ниже :)

Собственно всё началось с ссылки, которую мне скинул друг. Ему требовалось написать скрипт на PHP, который по ссылке на сайт, мог бы формировать прямую ссылку на видео ролик. Всё бы было хорошо, и он бы и сам справился, если бы на сайте не было защиты от подобных действий, а именно, к ссылке на видео добавлялся хеш, который непонятно откуда брался и как считался. Сначала я подумал, что хеш считается на JS и подставляется в ссылку при создании объекта SWFObject. Но этот объект не был модифицирован, и других внедрений JS в процесс формирования ссылки не было. Оставалось только одно: хеш формируется в самом видео плеере.

Чтобы подтвердить свою догадку, я создал htm файл с объектом embed, указывающим на videoplayer.swf с параметрами "config=/player/config.php?h=93223567f331116c86b1695600f1c402%26t=1328986356%26vkey=209bc587999e7256d18d", сниффером посмотрел запрос, который отправляет флешка на сервер, записал pkey, затем повторил ту же операцию, но изменяя параметры h, t и vkey. В результате узнал, что pkey зависит от vkey, при этом pkey получается длинной 32 символа в hex, что навело на мысль о том, что это md5 хеш. Но никакие комбинации vkey в md5 не совпадали с pkey, поэтому пришлось начинать вскрытие флеш плеера.

Вскрытие (при помощи Sothink SWF Decompiler) показало, что флешка обфусцирована, причём настолько, что, просто страшно становится. Несколько примеров:
        var _loc_2:* = null % ((null | null + false)++ in null);
if (!(_loc_2 && _loc_1))
{
do
{
if (!_loc_2)
{
}
if (!_loc_2)
{
}while (true)

        static var `&:Array = [1, 0, 0, 0, 0, 0, 1, 0 ^ 0, 0, null, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0];
static var ;#:Number = 0.212671;
static var 64:Number = 0.71516;
static var [$:Number = 0.072169;

var _loc_1:* = null >> (null & null - (true >= false >= NaN));

Раньше я думал, что в ActionScript имена переменных не могут начинаться с цифр, в них не могу использоваться символы, операторы, ну как во всех нормальных языках программирования, а оказалось что всё совсем не так... Но да ладно, не останавливаться же из-за того то пустяка.

Прошёлся по флешке замечательной утилитой SWFDecrypt, код стал более похожим на код, нежели на набор бессмысленных конструкций, но имена переменных, классов и модулей остались прежними, что не позволяло экспортировать все скрипты из декомпилятора (в именах модулей попадались символы, запрещённые в именах файлах в NTFS), но это и не понадобилось.

При беглом осмотре кода был обнаружен алгоритм хеширования md5, а так же несколько массивов с числами и функция их декодирования, которая принимала на вход два числа и возвращала строку. А так как в коде открытых строк не было, а были только вставки с функцией декодирования, то решено было начать с неё.

Итак, папка "#, модуль %-, функция [2, имена замечательные. В функции использовались две константы: 2654435769 и 84941944608, и гугл дал понять, что обфускатор они писали не сами, а использовали готовый, а по одной ссылке удалось найти код, реализующий механизм декодирования, но написанный на JavaScript. Недолго думая, я заменил в коде массивы с числами на свои и попробовал декодировать одну из строк, но в результате получил фигню.

Сравнив код на AS и JS, я нашёл отличия - несколько небольших констант были другими; поменял на нужные и, о чудо, код работает.
decode(42, -570)
"config"
decode(90, -586)
"aid"
decode(113, -643)
"imgLoader_"


Вернувшись к основному коду (модуль @#), я начал искать места, где делаются сетевые запросы (по строке "URLRequest") и одно из таких мест меня заинтересовало
_loc_1.load(new URLRequest(this.2(this.loaderInfo.parameters[%-.[2(42, -570)])));

А заинтересовало оно потому, что %-.[2(42, -570) возвращает "config", а это значит, что строка, которую я передавал в самом начале ролику, передаётся функции this.2. Находим её и первая же декодируемая строка...
var _loc_2:* = %-.[2(241, -771);

...наводит на мысль...
 12.02.2012 02:44:18, DarkByte
decode(241, -771)
"RT6l31uqm8V8K72"
12.02.2012 02:44:28, DarkByte
соль)
12.02.2012 02:44:32, 2КиКиМоР
ням ням
12.02.2012 02:45:09, 2КиКиМоР
ООООООООО
СОШЛОСЛЬ
!!11111111111111
12.02.2012 02:45:14, 2КиКиМоР
[root@home ~]# md5 -s f1aeea5121bc3e693e05RT6l31uqm8V8K72
MD5 ("f1aeea5121bc3e693e05RT6l31uqm8V8K72") = d7d330148aa651975618f53e26286440

...что это Язь. Здоровенный!

Тут и сказочке конец, а кто слушал, тот наверняка сможет узнать адрес сайта, а так же скачать с него все видео :D