Сейчас на форуме: tyns777, zombi-vadim, zds (+5 невидимых)

 eXeL@B —› Программирование —› Можно ли вообще что-то сделать в данном случае
Посл.ответ Сообщение

Ранг: 11.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 мая 2013 17:47
· Личное сообщение · #1

Приветствую!
Опять, после долгих раздумий, я решил спросить...
Я уже несколько месяцев назад спрашивал, помогли... Но сейчас ситуация изменилась...
Попробую описать все по порядку.

Имеется онлайн игра
Написана она на AS3 с применением обфускатора.
Протокол дважды зашифрован: пакет = salsa20(arc4(data, key), key, iv).

Нужно внедриться в траффик (изменять)!

На уровне salsa20 проблем нет, там подгружается часть swf кода, объединяется с заголовком и подписью и внедряется как swf объект, несущий функции шифрования.
key и iv передаются там-же, по ходу дела генерятся рандомно на лету или из набора нагенеренных заранее. Тут проблем нет. С горем пополам, имея Delphi\C#\AS3 исходники - переписал на Delphi.

Вот с arc4 проблема.
Точнее с key.

Как все происходило ранее:
Предварительно имелось две BigInteger константы - Base и Prime.
Далее, схематично...

1) Генерировался публичный ключ одной стороны (клиента)
а) приватный_ключ_клиента = случайные 256 hex символов (128 байт)
б) публичный_ключ_клиента = Base.modPow(приватный_ключ_клиента, Prime)
2) Этот публичный ключ отправлялся на другую сторону (сервер)

3) На сервере происходило нечто
опишу ниже

4) С другой стороны приходил публичный ключ
а) пусть это будет "публичный_ключ_сервера"
б) рабочий_ключ = публичный_ключ_сервера.modPow(приватный_ключ_клиента, Prime)
в) key = 16 байт от (рабочий_ключ)

5) Этот самый key и являлся ключем шифрования ARC4. Дальше все уже просто и понятно.

В тот момент (это примерно февраль 2013), была проблема внедриться в траффик.
Ведь приватный_ключ_клиента я получить не мог, а соответственно и сгенерировать ключ шифрования ARC4.

Как оказалось далее, можно!
И просто!

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

Я реализовал так называемый EncryptionFacade, который создавался в двух экземплярах. Для сервера (работал с клиентом игры) и для клиента (работал с сервером игры).
И было всего навсего две функции
procedure TEncryptionFacade.SetPublicKeyHex(Key: AnsiString);
function TEncryptionFacade.GetPublicKeyHex: AnsiString;

Работало так:
1) От клиента приходил пакет с его публичным ключиком. Я его сохранял в переменную, а сам от клиентского фасада получал его публичный ключик и отправлял на сервер.
2) От сервера приходил его публичный ключ. Я генерировал с серверного фасада публичный ключик и отправлял на клиент. Одновременно применял соответствующие публичные ключи у клиентского и серверного фасада.

Все работало как часы, месяц я примерно потратил на всю эту свистопляску с шифрованием. Сперва использовал swf код рипнутый из клиента, функции шифрования, по средствам ActiveX. Потом все переписал на Delphi.

И в один прекрасный момент, появилось вот что:

ActionScript3
Code:
  1. var _local2:RSAKey = new RSAKey(new BigInteger("84c16e0a5860d56409207e6b542f168de24e434198e68b363dec817b77a594a17f968f177e871bfd626d139099cb3af0070cf2a03b46d1404503dc95d5a72f7c61e36b61967be50bd6bdf8d3376171b00fce65c521bc3267cdf7e6b0c3d725c9"), 65537);
  2. _local3 = new ByteArray();
  3. _local2.verify(_arg1._SafeStr8366, _local3, _arg1._SafeStr8366.length); //_arg1._SafeStr8366 = ByteArray с данными от сервера
  4. _local4 = new BigInteger(_local3);
  5. _local5 = _SafeStr1959._SafeStr1801();
  6. _local6 = _local5._SafeStr2194();//В этих двух строчках получается сперва класс ConnectionManager, затем privateKey
  7. _local7 = _local4.modPow(_local6, _SafeStr130._SafeStr2041); //_SafeStr130._SafeStr2041 = Prime
  8. _local8 = new ByteArray();
  9. _local7.toByteArray().readBytes(_local8, 0, 16);
  10. _local5._SafeStr2195(_local8); //тут применяется ключ ARC4


Возможно-ли сейчас что-то сделать?



Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 21 мая 2013 18:07
· Личное сообщение · #2

512 бит - такое брутили. все в твоих руках, в общем

-----
SaNX




Ранг: 11.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 мая 2013 20:06
· Личное сообщение · #3

SaNX пишет:
512 бит - такое брутили. все в твоих руках, в общем

Ключ меняется каждое обновление клиента, как минимум раз в неделю




Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 21 мая 2013 20:30 · Поправил: DimitarSerg
· Личное сообщение · #4

virus_forever пишет:
Возможно-ли сейчас что-то сделать?



SaNX пишет:
512 бит


virus_forever пишет:
Ключ меняется каждое обновление клиента, как минимум раз в неделю


Ответ очевиден

-----
ds




Ранг: 11.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 мая 2013 20:47
· Личное сообщение · #5

Кроме перебора, нет ли каких то других вариантов?
2 из 3 программ для игры, внедряющиеся между клиентом и сервером - заработали недавно, сперва одна, потом другая.

Мне сказали (правда большего не удалось узнать), что есть как минимум 2 дыры. Только вот где они...



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 21 мая 2013 20:56 · Поправил: VodoleY
· Личное сообщение · #6

virus_forever первая сомнительная дыры это экспонента. изза малого количества бит. но ее нагибать тоже проблема. и помойму слабы модулус если я не ошибаюсь на глазок.. не за компом. сори
З.Ы. пива вчера было все таки много... зато ее патчить класно 1 бит )

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 456.3 (мудрец), 340thx
Активность: 0.280.02
Статус: Участник
Android Reverser

Создано: 22 мая 2013 09:31 · Поправил: SaNX
· Личное сообщение · #7

VodoleY
мочишь. 0х10001 - слабая экспонента. бггг
я тут недавно писал: https://ssl.exelab.ru/f/action=vthread&forum=2&topic=21734&page=1#6
там экспонента 17, дык и то Archer сказал хуй чо выйдет

-----
SaNX


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

Ранг: 11.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 23 мая 2013 20:00 · Поправил: virus_forever
· Личное сообщение · #8

Если все так сложно, то как тогда работают 2 из 3 программ-инструментов? Ну если считать мою, то 2 из 4.

Может быть все таки можно что сделать?




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 24 мая 2013 08:40
· Личное сообщение · #9

virus_forever взять и отреверсить те инструменты не судьба?)

-----
[nice coder and reverser]




Ранг: 11.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 25 мая 2013 10:57
· Личное сообщение · #10

Hellspawn пишет:
взять и отреверсить те инструменты не судьба?)

Говоря на чистоту, я в реверсинге - 0.


 eXeL@B —› Программирование —› Можно ли вообще что-то сделать в данном случае
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати