Понадобилась функция которая бы расшифровывала пакеты cs
После прогулки по гуглу наткнулся на функции COM_UnMunge2 и COM_Munge2, погуляв ещё немного узнал что именно они (де)шифруют пакеты.
Нашёл osHLDS, выдрал оттуда эти функции, отловил пакеты cs. Получилось следующее:
Вы должны зарегистрироваться, чтобы видеть ссылки.
В принципе, все пакеты до №8 читабельны, а вот с него уже идут в шифрованном виде.
Ну вообщем пробую расшифровать пакет №8, вроде получилось:
Вы должны зарегистрироваться, чтобы видеть ссылки.
Так же получилось расшифровать и другой пакет(dropclient)
Но вот другие пакеты функции не хотят расшифровывать никак :\
Сама функция:
- Код: Выделить всё
typedef unsigned long int uint32;
#define FlipBytes32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8) | (((uint32)(A) & 0x0000ff00) << 8) | (((uint32)(A) & 0x000000ff) << 24))
static const unsigned char MungeTable2[] = {0x05, 0x61, 0x7A, 0xED, 0x1B, 0xCA, 0x0D, 0x9B, 0x4A, 0xF1, 0x64, 0xC7, 0xB5, 0x8E, 0xDF, 0xA0 };
void Crypt(char *packet, int length, int z, bool unpack)
{
unsigned int * lbuff = (unsigned int *)packet;
unsigned int ebpc;
int i, count = 0;
int notz = ~z;
if(length < 1) { return; }
length = length >> 2;
while(length--)
{
if(unpack)
ebpc = *lbuff ^ z;
else
ebpc = FlipBytes32(*lbuff ^ notz);
for(i=0;i<4;i++)
*((unsigned char *)(&ebpc) + i) ^= (((MungeTable2[(count + i) & 0x0F] | (i << i)) | i) | 0xA5);
if(unpack)
*lbuff = FlipBytes32(ebpc) ^ notz;
else
*lbuff = ebpc ^ z;
lbuff++;
count++;
}
}
Юзаю так:
Crypt(packet, 8, 1, true);
packet - сам пакет(первые 8 байт отрезаются)
8 - размер пакета(уже без первых 8)
1 - номер пакета
true - true == unpack, false == pack
Вообщем то такой вопрос, что не так? Почему не хотят расшифровываться другие пакеты?