Просмотр полной версии : шифрование пакетов в 3.3.2
Народ, подскажите пожалуйста как шифруются заголовки для клиента 3.3.2, я смотрел исходники мангоса и тиавпс и понял что:
Создаются SHA1-HMAC хеши ключа сессии, которые используются для шифровки и расшифровки сообщений.
Ключи для HMAC зашиты в коде программы.
Далее эти хеши служат ключами для RC4, которое собственно расшифровывает.
Никаких начальных векторов я не заметил, хз..
Я попробовал расшифровать первый зашифрованный заголовок по этой схеме, но ничего путного не вышло, что не так?
Konctantin
04.10.2010, 21:16
первых 2 пакета не шифруется
84ivan
Почитай эту тему (http://www.ru-mangos.ru/showthread.php?t=419), там все разобрано по поводу как разбирать трафик вов.
Да я вижу что не шифруются, я про третий ворлдпакет).
Щас ещё раз почитаю)
ты про первое соединение ? или про второе ?
Самое первое, первые пакеты с ворлдсервера, два незашифрованных - 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 обёртка не подходит, она в обязательном порядке требует чтобы начальный вектор был, помимо ключа(
к сожалению по шарпу ничего не могу подсказать
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
Спасибо огромное) Попробую с этим)
Еее! Зарработало!!)) Корявую реализацию RC4 я нашёл тогда)
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot