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:
[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; |
3 | #define FlipBytes32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8) | (((uint32)(A) & 0x0000ff00) << 8) | (((uint32)(A) & 0x000000ff) << 24)) |
5 | static const unsigned char MungeTable2[] = {0x05, 0x61, 0x7A, 0xED, 0x1B, 0xCA, 0x0D, 0x9B, 0x4A, 0xF1, 0x64, 0xC7, 0xB5, 0x8E, 0xDF, 0xA0 }; |
7 | void Crypt(char *packet, int length, int z, bool unpack) |
9 | unsigned int * lbuff = (unsigned int *)packet; |
14 | if(length < 1) { return; } |
23 | ebpc = FlipBytes32(*lbuff ^ notz); |
26 | *((unsigned char *)(&ebpc) + i) ^= (((MungeTable2[(count + i) & 0x0F] | (i << i)) | i) | 0xA5); |
29 | *lbuff = FlipBytes32(ebpc) ^ notz; |
Юзаю так:
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:
2 | inline T DWordSwapC( T dw ) |
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); |
14 | #define DWordSwap DWordSwapC |
16 | static unsigned char mungify_table[ 16 ] = |
24 | void COM_Munge( unsigned char *data, int len, int seq ) |
38 | for ( i = 0; i < mungelen; i++ ) |
40 | pc = (int *)&data[ i * 4 ]; |
47 | p = ( unsigned char *)&c; |
48 | for ( j = 0 ; j < 4; j++ ) |
50 | *p++ ^= ( 0xa5 | ( j << j) | j | mungify_table[ ( i + j ) & 0x0f ] ); |
60 | void COM_UnMunge( unsigned char *data, int len, int seq ) |
74 | for ( i = 0; i < mungelen; i++ ) |
76 | pc = (int *)&data[ i * 4 ]; |
81 | p = ( unsigned char *)&c; |
82 | for ( j = 0 ; j < 4; j++ ) |
84 | *p++ ^= ( 0xa5 | ( j << j) | j | mungify_table[ ( i + j ) & 0x0f ] ); |
95 | bool SimpleData( char *pData ) |
97 | if( pData[0] == '\xFF' && pData[1] == '\xFF' && pData[2] == '\xFF' && pData[3] == '\xFF' ) |
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'