Сейчас на форуме: Kybyx, user99 (+2 невидимых)

 eXeL@B —› Оффтоп —› Разбор флешки
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 17 сентября 2011 22:36 · Поправил: Isaev
· Личное сообщение · #1

Цель сего бреда достать базу русских существительных из флеш-приложения (ссылка в след. посте)
В нём есть снизу справа ссылка "Слова", нажав на которую показывается вся база
А значит она грузится, а значит её можно стянуть
Ценность базы в том, что она тщательно формируется автором приложения уже в течении более 3х лет (за что почёт ему и уважуха), почитав темы в группе игры невольно приходишь в ужас от проделанной работы. Я сам долгое время собирал похожую базу, но у меня она меньше раз в 10.
Пробовал просто спросить, но похоже его действительно достали и к таким вопросам он очень неадекватно относится.
Флешка чистая без деобфускаторов и т.д. но откуда оно читает слова при запуске, так и не нашёл (убил вчера вечер, но никаких идей... (GET и POST для этого явно не используется)
Может кто глянуть на досуге? Покажите хотя бы где это во флешке, дальше я сам поковыряю

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 18 сентября 2011 02:11
· Личное сообщение · #2

Выложи чтоль саму флешку, неохото регаться.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 18 сентября 2011 03:04 · Поправил: Isaev
· Личное сообщение · #3

Vovan666 пишет:
Выложи чтоль саму флешку, неохото регаться.

да, не подумал
--> Link <--

зы: он их даже в offline показывает... видимо я вообще слепой
буду искать в ней

зы2:
В Res есть MakeSlovar(0), там создаётся словарь
Code:
  1. public static var SlovarEmbed:Class = Res_SlovarEmbed;
  2. ...
  3. var _loc_12:ByteArrayAsset = null;
  4. ...
  5. _loc_12 = new SlovarEmbed();

ниже читается побайтно с помощью _loc_12.readUnsignedByte(), расшифровывается и заполняет массив SLOVAR_ARR. Но где источник данных?
По идее это должно быть где-то в Embed прописано (но я не нашёл).
Из описания ByteArrayAsset я понял, что это может быть сам swf, только не понял это по умолчинию так или всё же где-то прописывается?
Если берётся весь SWF, то с какого смещения?
Из следующего кода получается, что с самого начала до самого конца ища пробелы, как разделители слов... но это же бред! пробел в бинарнике может быть где угодно.
Code:
  1. ...
  2. var _loc_11:uint = 0;
  3. while (_loc_11 < _loc_12.length)
  4. {
  5.      _loc_12.position = _loc_11;
  6.      _loc_2 = _loc_12.readUnsignedByte();
  7.           if (_loc_2 == 32){
  8.              //начало нового блока слов с кол-вом букв _loc_5
  9.           }
  10.            else
  11.           {
  12.              //иначе считывание и расшифровка текущего блока
  13.           }
  14. }

И сигнатура там CWS, это же с компрессией. А используя файл как источник данных он его берёт в оригинале или уже расжатый?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 18 сентября 2011 05:27
· Личное сообщение · #4

Isaev пишет:
Но где источник данных?

В Sothink SWF decompiler плохо видно, но если посмотреть в Flash Decompiler Trillix, то видно что в разделе Binary, есть ресурсы похожие на что-то зашифрованное.

| Сообщение посчитали полезным: Isaev


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 18 сентября 2011 06:03 · Поправил: Isaev
· Личное сообщение · #5

Vovan666 пишет:
если посмотреть в Flash Decompiler Trillix, то видно что в разделе Binary, есть ресурсы похожие на что-то зашифрованное.

у меня на семёрке все версии, что нашёл падают

вот, твоя версия с руборда заработала

да, похоже... по объёму Binary32 похож, только разделителей таких не видно...
Как задаётся что это Binary, если в доке стоит, что "Встраивание байтов определенного ресурса из файла SWF недопустимо, но возможно встраивание всего файла SWF."?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 19 сентября 2011 04:07 · Поправил: 4kusNick
· Личное сообщение · #6

Вот сам эмбед Res_SlovarEmbed:
http://rghost.ru/22161251

Создаётся меременная с этими бинарными данными тут:
http://pastebin.com/XgcggA54
79 строка:
Code:
  1. _local12 = new SlovarEmbed();


Далее там же заполняется массив SLOVAR_ARR в цикле чтения данных из этого бинаря - если встречается UnsignedByte 32, то в SLOVAR_ARR добавляют пустой массив:
Code:
  1. SLOVAR_ARR[_local5] = _local7;

если не встречается - то заполняется уже добавленный в SLOVAR_ARR массив -_local7 :
Code:
  1. _local7.push(_local4);


В _local7 похоже уже готовые слова пишут. Думаю за пару-тройку часов можно восставноить и переписать алго, либо прямо так и рипнуть не парясь.

Как используется SLOVAR_ARR можно посмотреть тут:
http://pastebin.com/drB6stfW
в методе MakeSlovar.

Удачи!

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 19 сентября 2011 04:14 · Поправил: Isaev
· Личное сообщение · #7

4kusNick пишет:
Вот сам эмбед Res_SlovarEmbed

Самое интересное: как нашёл? и где в AS к нему прописано обращение?

А, ну это и есть Binary 32. Я его уже достал....
Каким образом в скрипте указывается, что данные должны оттуда читаться?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 19 сентября 2011 05:28 · Поправил: 4kusNick
· Личное сообщение · #8

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

Итак, часто во флэшку эмбедят (читай встраивают, вкомпиливают) какие-нибудь двоичные данные - будь то "зашифрованный" словарь, как в данном случае, или "зашифрованная" другая флэшка или что угодно ещё бинарное.

Так вот, в случае, когда эмбедят что-то двоичное, для этих данных обязательно создаётся обычный пустой класс с названием, которое указал разработчик рядом с флексовым тэгом [Embed] и который наследуется от класса ByteArrayAsset.

Выглядит в декомпиляторах такой класс примерно так:

Code:
  1. package 
  2. {
  3.     import mx.core.ByteArrayAsset;
  4.  
  5.     public class Res_SlovarEmbed extends ByteArrayAsset 
  6.     {
  7.  
  8.  
  9.     }
  10. }


Теперь о том, как и где искать то, что находится непосредственно в этом заэмбеденном "ресурсе".
Помимо вышеприведённого класса, также во флэшку включаются сами двоичные данные в чистом виде и кладутся в тэг DefineBinaryData.

Также добавляется запись, связывающая название класса с тэгом DefineBinaryData в другой тэг - в SymbolClass, в поле symbols.

Выглядит такая запись там примерно так:
Code:
  1. 18: SymbolClassRecord({characterId: int(32), className: "Res_SlovarEmbed"}),

или так:
Code:
  1. <Symbol Tag="32" Name="Res_SlovarEmbed" />

В зависимости от программы, в которой Вы ковыряете флэшку.
Вот тут важно - 32 и "Res_SlovarEmbed".

Далее достаточно просто просмотреть все тэги DefineBinaryData и найти тот, у которого characterId = 32 в нашем случае.

Для наигации по флэшке, поиска тэгов и т.д. рекомендую использовать бесплатные утилитки типа SWFWire Inspector или Swix.

Надеюсь, это поможет лучше понять как встраиваются двоичные данные во флэшки и где они находятся.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.


| Сообщение посчитали полезным: Isaev


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 19 сентября 2011 22:27 · Поправил: Isaev
· Личное сообщение · #9

Vovan666 пишет:
В Sothink SWF decompiler плохо видно, но если посмотреть в Flash Decompiler Trillix...

Вообще раньше пользовал Sothink, теперь похоже буду Trillix
Sothink мало того, что не всё показывает, ещё и не правильно декомпилит... Часто путается, особенно в арифметике. В данном случае, при рипе алго с него, расшифровка не пашет! При рипе из Trillix всё отлично работает.

1. Какой op-code у команды nop во флеше?
2. Есть нормальные дебагеры? чтобы можно было отследить значение переменных...
пробовал SWFWire Debugger, ничего им увидеть не получилось

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 48.2 (посетитель), 49thx
Активность: 0.040
Статус: Участник

Создано: 20 сентября 2011 14:03 · Поправил: LIZARD
· Личное сообщение · #10

4kusNick, я массив с данными <DefineBinaryData CharacterId="32"> тоже нашел, но чем он закодирован? На SHA256 не очень похоже...
И еще из сотника:
Code:
  1. _loc_12.position = _loc_11;
  2. _loc_2 = _loc_12.readUnsignedByte();


Тут к _loc_12.position присваивается позиция первого символа первого слова и далее идет чтение, а какая это позиция?



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 20 сентября 2011 15:11
· Личное сообщение · #11

Isaev пишет:
1. Какой op-code у команды nop во флеше?

0x02
https://bitbucket.org/vinilios/swftools/src/3e9edb6b8241/lib/as3/opcodes.h

| Сообщение посчитали полезным: Isaev


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 20 сентября 2011 17:44 · Поправил: Isaev
· Личное сообщение · #12

LIZARD пишет:
я массив с данными <DefineBinaryData CharacterId="32"> тоже нашел, но чем он закодирован? На SHA256 не очень похоже...

Он не закодирован вообще, открытым текстом всё лежит
Code:
  1. Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
  2. 001B71D0      00 20 00 52 65 73 5F  53 6C 6F 76 61 72 45 6D    . .Res_SlovarEm
  3. 001B71E0   62 65 64 00                                        bed.

перед именем CharacterId в word: 20 00

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 48.2 (посетитель), 49thx
Активность: 0.040
Статус: Участник

Создано: 20 сентября 2011 17:56
· Личное сообщение · #13

Isaev, об одном и том же мы говорим? Я имею ввиду, чем сам словарь закриптован




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 20 сентября 2011 21:56
· Личное сообщение · #14

LIZARD о разном
словарь криптуется просто
Code:
  1.             while (loc10 < loc11.length) 
  2.             {
  3.                 loc11.position = loc10;
  4.                 loc1 = loc11.readUnsignedByte();
  5.                 if (loc1 != 32) 
  6.                 {
  7.                     if ((loc7 = loc7 + 1) - loc8 * (9939 - loc8 - loc9) == 9939) 
  8.                     {
  9.                         ++loc8;
  10.                         loc9 = 1 - loc9;
  11.                         loc7 = 0;
  12.                     }
  13.                     if (loc8 == 0) 
  14.                     {
  15.                         if (loc7 < 1000) 
  16.                         {
  17.                             if (++loc9 == 100) 
  18.                             {
  19.                                 loc9 = 0;
  20.                             }
  21.                         }
  22.                         else if (loc7 == 1000) 
  23.                         {
  24.                             loc9 = 0;
  25.                         }
  26.                     }
  27.                     loc1 = loc1 + 1040 - 192 + 115 - loc9;
  28.                     loc2 = String.fromCharCode(loc1);
  29.                     loc3 = loc3 + loc2;
  30.                     if (++loc5 == loc4) 
  31.                     {
  32.                         loc6.push(loc3);
  33.                         loc3 = "";
  34.                         loc5 = 0;
  35.                     }
  36.                 }


-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh


| Сообщение посчитали полезным: LIZARD

Ранг: 48.2 (посетитель), 49thx
Активность: 0.040
Статус: Участник

Создано: 23 сентября 2011 15:12
· Личное сообщение · #15

Точно, что то я протупил




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 28 сентября 2011 19:36
· Личное сообщение · #16

Isaev
Для анализа кода очень рекомендую использовать что-нибудь Burak'овское. Наприер AS3 Sorcerer, последнюю версию которого на борде запостили не так давно.

Сотники, трилликсы и т.д. на защищённых файлах показывают себя не с лучшей стороны.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.


| Сообщение посчитали полезным: Isaev
 eXeL@B —› Оффтоп —› Разбор флешки

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати