Показать сообщение отдельно
Старый 17.09.2009, 23:42   #5
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 60
Сказал Спасибо: 3
Имеет 107 спасибок в 21 сообщенях
GoldFinch пока неопределено
Сообщение

чтоб не пропадало, скину сюда инфу по xor-шифрованию в клиенте
Код:
[rce][aion] результаты реверсирования алгоритмов xor-шифрования клиента 1.5.*

Пакет S_KEY (id=0x48), приходящий клиенту от сервера,
содержит 32-разрядное значение для формирования начального ключа
  DWORD keySeed;
Из данных этого пакета формируются начальные ключи для шифрования и дешифровки пакетов.

Алгоритм формирования начального 64-разрядного ключа (синтаксис С):
  /* in: DWORD keySeed - 32-разрядное значение из пакета S_KEY
     out: __int64 key - 64-разрядное значение начального ключа для приема и отправки пакетов
  */
  __int64 key = ((keySeed - 0x3FF2CC87) ^ 0xCD92E451) + (0x87546CA1<<32);

Для шифрования пакета также используется дополнительный фиксированный ключ длиной 0x40 байт,
строка: nKO/WctQ0AVLbpzfBkS6NevDYT8ourG5CRlmdjyJ72aswx4EPq1UgZhFMXH?3iI9
дамп:
00:  6E 4B 4F 2F 57 63 74 51  30 41 56 4C 62 70 7A 66  nKO/WctQ0AVLbpzf
10:  42 6B 53 36 4E 65 76 44  59 54 38 6F 75 72 47 35  BkS6NevDYT8ourG5
20:  43 52 6C 6D 64 6A 79 4A  37 32 61 73 77 78 34 45  CRlmdjyJ72aswx4E
30:  50 71 31 55 67 5A 68 46  4D 58 48 3F 33 69 49 39  Pq1UgZhFMXH?3iI9

Алгоритм шифрования буфера отправляемых пакетов (синтаксис С)

    /* in: BYTE buf[] - буфер для шифрования,
           size_t len - длина буфера,
           BYTE key[8] - текущий ключ,
           BYTE auxKey[0x40] - вспомогательный ключ.
       out: зашифрованный буфер,
            новый текущий ключ
    */
    buf[0] ^= key[0];
    for ( int i = 1; i < len; ++i )
        buf[i] ^= buf[i - 1] ^ key[i & 7] ^ auxKey[i & 0x3F];
    *(__int64*)key += len;

Алгоритм расшифровки буфера принятых пакетов (синтаксис С)

    /* in: BYTE buf[] - буфер для расшифровки,
           size_t len - длина буфера,
           BYTE key[8] - текущий ключ,
           BYTE auxKey[0x40] - вспомогательный ключ.
       out: расшифрованный буфер,
            новый текущий ключ
    */
    for( int i = len; --i; )
        buf[i] ^= buf[i - 1] ^ key[i & 7] ^ auxKey[i & 0x3F];
    buf[0] ^= key[0];
    *(__int64*)key += len;
Клиент аиона нормально работает под олькой, достаточно легко дампится.
Незначительная часть функций зачем-то накрыта ВМ фемиды.

Клиент содержит большое количество текстовых строк, в том числе отладочной информации и вывода в лог.
В отличие от клиента ла2 не содержит кучи экспортируемых функций, так что имена функций надо придумывать самому.
Код xor-шифрования пакета при отправке встроен в код формирования каждого пакета (inline однако).
Код xor-дешифровки пакета при приеме засунут в одну функцию.
GoldFinch вне форума   Ответить с цитированием
За это сообщение GoldFinch нажился 7 спасибками от: