HLFX.Ru Forum
Показать все 14 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- [HELP] packet decoding (https://hlfx.ru/forum/showthread.php?threadid=4274)


Отправлено Stolen 02-02-2014 в 13:11:

Post [HELP] packet decoding

Всем привет. Понадобилась функция которая бы расшифровывала пакеты cs После прогулки по гуглу наткнулся на функции COM_UnMunge2 и COM_Munge2, погуляв ещё немного узнал что именно они (де)шифруют пакеты.

Нашёл osHLDS, выдрал оттуда эти функции, отловил пакеты cs. Получилось следующее:
http://f6.s.qip.ru/oHGou2qO.png

В принципе, все пакеты до №8 читабельны, а вот с него уже идут в шифрованном виде.

Ну вообщем пробую расшифровать пакет №8, вроде получилось:
http://f6.s.qip.ru/oHGou2qP.png

Так же получилось расшифровать и другой пакет(dropclient)

Но вот другие пакеты функции не хотят расшифровывать никак :\

Сама функция:

C++ Source Code:
1
typedef unsigned long int uint32;
2
 
3
#define FlipBytes32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8)  | (((uint32)(A) & 0x0000ff00) << 8)  | (((uint32)(A) & 0x000000ff) << 24))
4
 
5
static const unsigned char MungeTable2[] = {0x05, 0x61, 0x7A, 0xED, 0x1B, 0xCA, 0x0D, 0x9B, 0x4A, 0xF1, 0x64, 0xC7, 0xB5, 0x8E, 0xDF, 0xA0 };
6
 
7
void Crypt(char *packet, int length, int z, bool unpack)
8
{
9
  unsigned int * lbuff = (unsigned int *)packet;
10
  unsigned int ebpc;
11
  int i, count = 0;
12
  int notz = ~z;
13
 
14
  if(length < 1) { return; }
15
 
16
  length = length >> 2;
17
 
18
  while(length--)
19
  {
20
    if(unpack)
21
      ebpc = *lbuff ^ z;
22
    else
23
      ebpc = FlipBytes32(*lbuff ^ notz);
24
 
25
    for(i=0;i<4;i++)
26
      *((unsigned char *)(&ebpc) + i) ^= (((MungeTable2[(count + i) & 0x0F] | (i << i)) | i) | 0xA5);
27
 
28
    if(unpack)
29
      *lbuff = FlipBytes32(ebpc) ^ notz;
30
    else
31
      *lbuff = ebpc ^ z;
32
 
33
    lbuff++;
34
    count++;
35
  }
36
}


Юзаю так:
Crypt(packet, 8, 1, true);
packet - сам пакет(первые 8 байт отрезаются)
8 - размер пакета(уже без первых 8)
1 - номер пакета true - true == unpack, false == pack

Вообщем то такой вопрос, что не так?
Почему не хотят расшифровываться другие пакеты?


Отправлено marikcool 02-02-2014 в 13:16:

Как ты определяешь что пакет правильно расшифрован? По стринг значениям?

__________________
vk.com/skullcapstudios


Отправлено Дядя Миша 02-02-2014 в 13:16:

Munge в переводе - запутывать. Т.е. они нарочно это делают.
Но, насколько я знаю, есть еще Munge1 и Munge3.
Изучи OSHLDS повнимательнее, там есть полная картина общения клиент-сервер.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено Stolen 02-02-2014 в 13:22:

marikcool,
Ну да
После выполнения функции с пакетом номер 8, я получаю "new", после других получаю что-то типа [NULL], [SOH][SOH][SOH][SOH][SOH][SOH] и тд


Отправлено fire64 02-02-2014 в 14:45:

Stolen, ну и?

О_о
Ты что, думаешь, что там все данные в строчном формате?

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Stolen 02-02-2014 в 15:08:

fire64
Не все конечно, но как я понимаю команды от сервера типа fullserverinfo "\*gamedir\cstrike", echo "* Права доступа предоставлены!", bind bla bla
Должны быть строками


Отправлено marikcool 03-02-2014 в 04:00:

Цитата:
Stolen писал:

Ну эт обычно броадкаст пакеты, они не шифрованы. Нужно на том пакете пробывать где info и данные других игроков в виде ников пролетают.

__________________
vk.com/skullcapstudios


Отправлено fire64 03-02-2014 в 06:34:

Первые 8 байтов, это данные синхронизации,
Данные идут позже, вот правильный код:

C++ Source Code:
1
template <typename T>
2
inline T DWordSwapC( T dw )
3
{
4
  unsigned int temp;
5
 
6
  temp  =   *((unsigned int *)&dw) 				>> 24;
7
  temp |= ((*((unsigned int *)&dw) & 0x00FF0000) >> 8);
8
  temp |= ((*((unsigned int *)&dw) & 0x0000FF00) << 8);
9
  temp |= ((*((unsigned int *)&dw) & 0x000000FF) << 24);
10
 
11
  return *((T*)&temp);
12
}
13
 
14
#define DWordSwap DWordSwapC
15
 
16
static unsigned char mungify_table[ 16 ] =
17
{
18
  5, 97, 122, 237,
19
  27, 202, 13, 155,
20
  74, 241, 100, 199,
21
  181, 142, 223, 160,
22
};
23
 
24
void COM_Munge( unsigned char *data, int len, int seq )
25
{
26
  int i;
27
  int mungelen;
28
 
29
  int c;
30
  int *pc;
31
  unsigned char *p;
32
 
33
  int j;
34
 
35
  mungelen = len & ~3;
36
  mungelen /= 4;
37
 
38
  for ( i = 0; i < mungelen; i++ )
39
  {
40
    pc = (int *)&data[ i * 4 ];
41
    c = *pc;
42
 
43
    c ^= ~seq;
44
 
45
    c = DWordSwap( c );
46
 
47
    p = ( unsigned char *)&c;
48
    for ( j = 0 ; j < 4; j++ )
49
    {
50
      *p++ ^= ( 0xa5 | ( j << j) | j | mungify_table[ ( i + j ) & 0x0f ] );
51
    }
52
 
53
    c ^= seq;
54
 
55
    *pc = c;
56
  }
57
}
58
 
59
 
60
void COM_UnMunge( unsigned char *data, int len, int seq )
61
{
62
  int i;
63
  int mungelen;
64
 
65
  int c;
66
  int *pc;
67
  unsigned char *p;
68
 
69
  int j;
70
 
71
  mungelen = len & ~3;
72
  mungelen /= 4;
73
 
74
  for ( i = 0; i < mungelen; i++ )
75
  {
76
    pc = (int *)&data[ i * 4 ];
77
    c = *pc;
78
 
79
    c ^= seq;
80
 
81
    p = ( unsigned char *)&c;
82
    for ( j = 0 ; j < 4; j++ )
83
    {
84
      *p++ ^= ( 0xa5 | ( j << j) | j | mungify_table[ ( i + j ) & 0x0f ] );
85
    }
86
 
87
    c = DWordSwap( c );
88
 
89
    c ^= ~seq;
90
 
91
    *pc = c;
92
  }
93
}
94
 
95
bool SimpleData( char *pData )
96
{
97
  if( pData[0] == '\xFF' && pData[1] == '\xFF' && pData[2] == '\xFF' && pData[3] == '\xFF' )
98
  {
99
    return true;
100
  }
101
 
102
  return false;
103
}


COM_Munge - шифровка данных
COM_UnMunge - дешифровка
SimpleData - провка на базовые информационные пакеты

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Ghoul [BB] 03-02-2014 в 07:50:

О нет, опять сладкий хлеб Counter-Strike...
Браток, ты погляди, тут уже 2 темы про декриптовку подняли.. но так и слились авторы. Fail, однако...

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo


Отправлено Chuvi 03-02-2014 в 08:00:

fire64 Помимо 0xFFFFFFFF есть же ещё 0xFFFFFFFE

Добавлено 03-02-2014 в 12:00:

Ghoul [BB], если ты про мою тему, которую я когда-то поднимал, то я понял, что ждать от вас помощи бесполезно и пошёл копаться сам.
VoiceCodecFix, который я уже забросил, кстати, писался уже с использованием результатов этого копания.


Отправлено fire64 03-02-2014 в 09:08:

Цитата:
Chuvi писал:
0xFFFFFFFE

А это для чего такой заголовок применяется?
Как-то не сталкивался.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Stolen 03-02-2014 в 09:26:

Цитата:
Chuvi писал:
0xFFFFFFFE

Я только 0xFEFFFFFF встречал


Отправлено Chuvi 03-02-2014 в 09:35:

fire64, он применяется, когда пакет не влезает в допустимые пределы и его нужно разбить на части.
Например, в таком виде приходит A2S_RULES.
А, да, я действительно порядок байт перепутал.
0xFEFFFFFF, а не то, что я написал.


Отправлено Дядя Миша 03-02-2014 в 16:15:

fire64 там же incoming_sequence юзается в качестве третьего аргумента? Я просто подзабыл уже. Если не знать этой секвенции, то на выходе получим такой же мусор, что и на входе.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Временная зона GMT. Текущее время 19:55.
Показать все 14 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024