eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Glotkov, Adler (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Крэки, обсуждения —› DoSWF Анпак.
Посл.ответ Сообщение

Ранг: 5.6 (гость)
Статус: Участник

Создано: 27 марта 2018 04:07 · Поправил: Fenrisus New!
Цитата · Личное сообщение · #1

Доброго времени суток. Столкнулся тут с такой вот штукой на флеше, называется DoSWF...
Суть проблемы в кратце: Есть Encrypted SWF файл, который не открывается ни одним из дизасемблеров SWF/ActionScript. Нужно как то его декриптнуть, что бы читался.

Пробовал его анпакнуть ипользуя этот код (взято с гитхаба):

Code:
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.nio.ByteBuffer;
  8. import java.nio.ByteOrder;
  9. import java.util.zip.DataFormatException;
  10. import java.util.zip.Inflater;
  11.  
  12. /**
  13.  * Unpack DoSWF encrypted Flash - Useful for hacking dovogame ;-)
  14.  * 
  15.  * @author instcode
  16.  */
  17. public class DoSWFUnpacker {
  18.          /**
  19.           * @param args
  20.           */
  21.          public static void main(String[] args) {
  22.                  DoSWFUnpacker decrypter = new DoSWFUnpacker();
  23.                  try {
  24.                         File inputFile = new File(args[0]);
  25.                         InputStream inputStream = new FileInputStream(inputFile);
  26.                         ByteBuffer buffer = ByteBuffer.allocate((int) inputFile.length());
  27.                         inputStream.read(buffer.array());
  28.                         decrypter.handle(buffer, new File("./output.swf"));
  29.                  } catch (IOException e) {
  30.                         e.printStackTrace();
  31.                  }
  32.          }
  33.  
  34.          /**
  35.           * Decompress CWS to FWS
  36.           * 
  37.           * CWS (compressed SWF)
  38.           * FWS (uncompressed SWF)
  39.           * 
  40.           * @param data
  41.           */
  42.          public static void decompress(byte[] data, File outputFile) {
  43.                  byte[] output = new byte[data.length * 10];
  44.                  int size = 0;
  45.                  try {
  46.  
  47.                         Inflater decompresser = new Inflater();
  48.                         String signature = new String(data, 0, 3);
  49.                         if (signature.equals("CWS")) {
  50.                               decompresser.setInput(data, 8, data.length - 8);
  51.                               size = decompresser.inflate(output);
  52.                               decompresser.end();
  53.  
  54.                               OutputStream out = new FileOutputStream(outputFile);
  55.                               out.write(new byte[] { 'F', 'W', 'S' });
  56.                               out.write(data, 3, 5);
  57.                               out.write(output, 0, size);
  58.                               out.close();
  59.                         }
  60.                  } catch (DataFormatException e) {
  61.                         e.printStackTrace();
  62.                  } catch (IOException e) {
  63.                         e.printStackTrace();
  64.                  }
  65.          }
  66.  
  67.          public void unpack(ByteBuffer buffer, File outputFile) {
  68.                  ByteBuffer plain = decrypt(buffer);
  69.                  handle(plain, outputFile);
  70.          }
  71.  
  72.          private void handle(ByteBuffer buffer, File outputFile) {
  73.                  byte nonce = buffer.get();
  74.                  if (nonce > 0) {
  75.                         removeNonce(buffer);
  76.                  }
  77.  
  78.                  byte bool = buffer.get();
  79.                  int size = buffer.getInt();
  80.  
  81.                  byte[] head = new byte[size];
  82.                  buffer.get(head, 0, size);
  83.  
  84.                  byte[] tail = new byte[buffer.remaining()];
  85.                  buffer.get(tail);
  86.  
  87.                  byte[] data = bool > 0 ? head : tail;
  88.                  decompress(data, outputFile);
  89.          }
  90.  
  91.          private ByteBuffer removeNonce(ByteBuffer buffer) {
  92.                  int max = buffer.getInt();
  93.                  int mark = buffer.getInt();
  94.                  int length = buffer.getInt();
  95.  
  96.                  ByteBuffer data = ByteBuffer.allocate(length);
  97.                  data.order(ByteOrder.LITTLE_ENDIAN);
  98.                  buffer.get(data.array(), 0, length);
  99.  
  100.                  ByteBuffer output = ByteBuffer.allocate(max * 2);
  101.                  while (output.position() < max) {
  102.                         data.position(4);
  103.                         data.putInt((int) (mark * 3 / 4 + Math.random() * mark / 2));
  104.                         output.put(data.array());
  105.                  }
  106.                  return output;
  107.          }
  108.  
  109.          private ByteBuffer decrypt(ByteBuffer buffer) {
  110.                  byte block_size = (byte) (buffer.get() - 1);
  111.                  byte key = (byte) (buffer.get() - 3);
  112.  
  113.                  int offset = buffer.getInt();
  114.                  int length = buffer.getInt() - 2;
  115.  
  116.                  byte[] data = new byte[length];
  117.                  buffer.position(buffer.limit() - length);
  118.                  buffer.get(data);
  119.                  for (int count = 0; count < length;) {
  120.                         for (int i = 0; i < block_size; i += 4) {
  121.                               data[count] = (byte) (data[count] ^ key);
  122.                               ++count;
  123.                               if (count >= length) {
  124.                                    break;
  125.                               }
  126.                         }
  127.                         count = count + offset;
  128.                  }
  129.  
  130.                  ByteBuffer output = ByteBuffer.allocate(data.length * 5);
  131.                  try {
  132.                         Inflater decompresser = new Inflater();
  133.                         decompresser.setInput(data, 0, data.length);
  134.                         int size = decompresser.inflate(output.array());
  135.                         output.limit(size);
  136.                         output.position(0);
  137.                         decompresser.end();
  138.                  } catch (DataFormatException e) {
  139.                         e.printStackTrace();
  140.                  }
  141.                  return output;
  142.          }
  143. }

Раньше работало, сейчас уже нет...

Суть проблемы более подробно:
Все эти скрипты (а их всего то было две штуки) 2009 года... Пробовал RABCDAsm'ом, в лоб... Может не умею готовить, но это же бинарная шляпа... даже нет дизасм кода.... -_-'' Да в принципе и не будет. DoSWF работает как то так: запихивает одно в другое, и делает бинарной шляпой. Другой SWF аки лоадер имеет закриптованную функцию (а учитывая то что это китайский криптор, поди разбери...) которая собстно в памяти и собирает уже нормальный swf из бинарной шляпы. Ну или как то похоже. Как это работает сейчас - без понятия. Ибо самому свежему мануалю как оно работает уже 6 лет...


Это лоадер
Сам Файлик который нужно разобрать.
Еще файл 0.о Да так и называется, загружается вместе с GL.swf (подсмотренно через консоль лисы)

По идее, GL.swf цепляет этот 0.0 файл и с помощью него анпакает 30005.swf(программу)... Но вот как оно это делает я увы не понял. Тыкал JPEX'ом GL.swf но так и не понял как мне анпакнуть 30005.swf что бы он открывался JPEX'ом или любой другой подобной утилитой. (а так - они не открываются, там ни хедера ничего нет, просто бинарная шляпа внутри и все).

Покажите и научите если не сложно. Я бы и сам, как говорится методом тыка, проб и ошибок... да только нигде нет информации, примеров, мануалов о том как анпакать DoSWF, а та что была - уже сильно устарела... Мне бы на примере этого файла (30005.swf) кто показал, как чего к чему... понимаю что прошу много, время - штука ценная. Я был бы благодарен за любую помощь - Скрипт-пример анпака с комментами, псевдокод с описанием алгоритма анпака, а может быть небольшой туториал/пример как это сделать через RABCDAsm? Главное, это что бы этот encrypted файл можно было читать JPEX и другими утилитами для декомпиляции SWF файлов (Windows).

UPD:
GL.SWF декомпиль
Из этого кода ясно что это именно DoSWF (@doswf__u) Но вот как анпакнуть зашифрованные файлы...


PS. Знаю что возможно эта темка должна быть в обсуждениях протекторов... Но DoSWF (может я и ошибаюсь) это не протектор а encrypt tool. Вообщем у него различий с любыми пакер-протекторами больше чем сходств (насколько вообще применимо понятие протектора для Flash'а), потому и написал сюда. Просьба не винить если если это не так.

Ранг: 94.1 (постоянный)
Статус: Участник

Создано: 27 марта 2018 04:21 · Поправил: Rio New!
Цитата · Личное сообщение · #2

пробовали?:
--> Link <--

Ранг: 5.6 (гость)
Статус: Участник

Создано: 27 марта 2018 04:25 · Поправил: Fenrisus New!
Цитата · Личное сообщение · #3

Rio пишет:
пробовали?:
--> Link <--

Абсолютно ВСЕ из перечисленного. Ничего не работает. Самое новое (а скорее всего это просто репосты старой информации) 2012 года...

Скрипт с гитхаба - выше. Я его и пробовал. Ошибки буфферов.
Скрипт который на С++ invalid header. Тоже не работает.
Swf Reader (был такой), скачан с sourceforge - он его даже не может загрузить.
JPEX - не имеет анпакеров каких либо вообще.
Softonic - Не может загрузить.
Еще пара старых утилит (от которых нет исходников) - либо не могут загрузить этот файл в принципе, либо сыплются с exeption'ами.


Ранг: 1120.2 (!!!!)
Статус: Участник

Создано: 27 марта 2018 08:44 New!
Цитата · Личное сообщение · #4

https://exelab.ru/f/index.php?action=vthread&forum=1&topic=18041&page=9

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



Ранг: 748.2 (! !)
Статус: Участник
bytecode!

Создано: 27 марта 2018 10:31 New!
Цитата · Личное сообщение · #5

Ещё это почитайте:
http://blog.codestage.ru/ru/2013/05/06/decrypting-doswf/

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


Ранг: 5.6 (гость)
Статус: Участник

Создано: 27 марта 2018 18:17 · Поправил: Fenrisus New!
Цитата · Личное сообщение · #6

Почитал, посмотрел. По ссылке на exelab, такой вот небольшой отчет для примера:

SWF iD - малоюзабельно, а то что это doSWF - и так понятно.
Action Script Viewer (ASV) - На оффсайте doSWF есть anti-hack proof, для версии 5.5, программа крашится.

Читал еще вот это на форуме
Но увы, метод энкрипта у них поменялся явно.

проблема собственно говоря вот в чем. :

Это лоадер(ы). А вот файлы, которые и являются собственно самим приложением (они не грузятся в плагине и являют собой просто бинарную дрянь):

лежат как бы отдельно. И они не зашиты в лоадер (как в предыдущих версиях doSWF).
Лоадеров тут аж 3 штуки(???)
И каждый со своим кодом:



Собственно:
GL_back.swf декомпиль
GL_back1.swf декомпиль

На данный момент, я использую простой код, и дампаю SWF через PID процесса, а именно указав плагин контейнер огнелисы. Как говорится "в ручную"
Код можно посмотреть--> Вот тут <--

Файлы весьма себе читабельные, и что удивительно не шибко и обфусцированные (на уровне обычного декомпиля с _loc_ и прочими param43).

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

и потом рученьками пересобрать целый проект в идее, попутно фикся декомпиль? Ну такое себе...

Я вот пытаюсь как то так - найти способ анпакнуть эти файлы не тыря их из памяти (с оригинальными именами)
через RABCdasm я отломаю doSWF лодыри хукнув туда обычный лоадер, что бы работали обычные swf, а не бинарная шляпа с лоадером.

Есть идеи как распаковать их не тыря их из памяти (в обход лоадера)?


Ранг: 748.2 (! !)
Статус: Участник
bytecode!

Создано: 28 марта 2018 23:07 · Поправил: 4kusNick New!
Цитата · Личное сообщение · #7

Fenrisus пишет:
Action Script Viewer (ASV) - На оффсайте doSWF есть anti-hack proof, для версии 5.5, программа крашится.

Версия 5.5 - древний мамонт, удивительно что он у вас вообще запустился.
Да и не нужен он там особо.

Что нужно:
дамп двух swf, на которые doSWF делит исходную SWF, затем собрать их вместе, выкинув мусор от doSWF который он вписывает для инициализации.

В статье по ссылочке что я кидал описан этот метод.

Проблема у вас в идентификации валидных SWF в памяти. doSWF гадит фальшивками что вы уже заметили.
Для их отсеивания используйте на выбор:
- SWF Revealer Ultimate (платный, хз есть ли в паблике ломанный)
- SWF Revealer который идет плагинчиком к свежим ASV
- дампер памяти из замечательной тулзы SWF iD которую вы недооценили. В дампере есть механизмы отсеивания мусорных swf, чувствительность можно настроить слайдером, поизучайте

В итоге получите 2 swfки - в одной данные (ассеты графики шрифты и проч) в другой код.
И склеивайте их по инструкции из статейки.

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

 eXeL@B —› Крэки, обсуждения —› DoSWF Анпак.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS