PDA

Просмотр полной версии : шифрование пакетов в 3.3.2


84ivan
04.10.2010, 21:13
Народ, подскажите пожалуйста как шифруются заголовки для клиента 3.3.2, я смотрел исходники мангоса и тиавпс и понял что:
Создаются SHA1-HMAC хеши ключа сессии, которые используются для шифровки и расшифровки сообщений.
Ключи для HMAC зашиты в коде программы.
Далее эти хеши служат ключами для RC4, которое собственно расшифровывает.
Никаких начальных векторов я не заметил, хз..

Я попробовал расшифровать первый зашифрованный заголовок по этой схеме, но ничего путного не вышло, что не так?

Konctantin
04.10.2010, 21:16
первых 2 пакета не шифруется

Йоха
05.10.2010, 10:04
84ivan
Почитай эту тему (http://www.ru-mangos.ru/showthread.php?t=419), там все разобрано по поводу как разбирать трафик вов.

84ivan
05.10.2010, 10:35
Да я вижу что не шифруются, я про третий ворлдпакет).
Щас ещё раз почитаю)

Йоха
05.10.2010, 11:19
ты про первое соединение ? или про второе ?

84ivan
05.10.2010, 12:04
Самое первое, первые пакеты с ворлдсервера, два незашифрованных - SMSG_AUTH_CHALLENGE и CMSG_AUTH_SESSION я получил и отправил, и мне пришёл зашифрованный какой-то пакет, который мне надо расшифровать(
он выглядит вот так:
0000 4b 39 63 0b 0c 00 00 00 00 00 00 00 00 00 02 8b
0010 a6 fb 09 00 00 00 00 22 41 b0 2d 02 02 00 00 9e
0020 63 7e 1e ff ff ff ff ff ff ff ff ff ff ff ff ff
0030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0040 ff ff ff
Это пакет от мангоса 3.3.2, SMSG_AUTH_RESPONSE и SMSG_ADDON_INFO в одной кучке) теоретически) но заголовки почему-то не расшифровываются у меня)

Мб у меня RC4 какой-то не такой? я пишу на C#, а в .NET убрали RC4 из сборки как устаревший, и я в инете нашёл демку, какой-то итальянец писал) немного переделал её и пользуюсь. Так она вроде работает, я пробовал на своих данных.
Подскажите какую-нибудь нормальную реализацию RC4 для .NET OpenSSL обёртка не подходит, она в обязательном порядке требует чтобы начальный вектор был, помимо ключа(

Йоха
05.10.2010, 14:51
к сожалению по шарпу ничего не могу подсказать

TOM_RUS
05.10.2010, 17:20
RC4 для C#

using System;
using System.Collections.Generic;

namespace Wlp
{
public class Arc4
{
private readonly byte[] state;
private byte x, y;

public byte[] RC4Data
{
get
{
var data = new byte[0x102];
state.CopyTo(data, 0);
data[100] = x;
data[101] = y;
return data;
}
set
{
Array.Copy(value, state, 0x100);
x = value[0x100];
y = value[0x101];
}
}

public Arc4(byte[] key)
{
state = new byte[256];
x = y = 0;
KeySetup(key);
}

public void Process(IList<byte> buffer, int start, int count)
{
InternalTransformBlock(buffer, start, count, buffer, start);
}

private void KeySetup(byte[] key)
{
byte index1 = 0;
byte index2 = 0;

for (var counter = 0; counter < 256; counter++)
{
state[counter] = (byte)counter;
}
x = 0;
y = 0;
for (var counter = 0; counter < 256; counter++)
{
index2 = (byte)(key[index1] + state[counter] + index2);
// swap byte
var tmp = state[counter];
state[counter] = state[index2];
state[index2] = tmp;
index1 = (byte)((index1 + 1) % key.Length);
}
}

private void InternalTransformBlock(IList<byte> inputBuffer, int inputOffset, int inputCount, IList<byte> outputBuffer, int outputOffset)
{
for (var counter = 0; counter < inputCount; counter++)
{
x = (byte)(x + 1);
y = (byte)(state[x] + y);
// swap byte
var tmp = state[x];
state[x] = state[y];
state[y] = tmp;

var xorIndex = (byte)(state[x] + state[y]);
outputBuffer[outputOffset + counter] = (byte)(inputBuffer[inputOffset + counter] ^ state[xorIndex]);
}
}
}
}

оригинал взят из Mono: http://www.koders.com/csharp/fidE5B16F18084CF262EC946FFE668F06265DE035D2.aspx

84ivan
05.10.2010, 19:10
Спасибо огромное) Попробую с этим)

Еее! Зарработало!!)) Корявую реализацию RC4 я нашёл тогда)