Уважаемый xkor, прошу у тебя помощи!
Недавно, на моем самом любимом игровом серве сделали обновление до С6 и поставили шифрование трафика. Сервер, видимо, в основе своей остался PTS С4, но с самописными добавками. Причем за последние 2 недели, админы дважды меняли алгоритм шифрования!!! Сначало вообще пакетхак все нормально дешифровывал. После первого обновления защиты пакетхак стал частично дешифровывать входящий трафик, и полную чепуху писать в исходящем. Но что интересно, метод дешифрации трафика от клиента совпал с Вороновским, его скриптик, выложенный в этом топике помог дешифровывать трафик от клиента, причем даже менять ничего в скрипте не понадобилось!!! Но после второго обновления защиты все стало гораздо хуже. Пакетхак может работать только в срытом режиме!!!, иначе клиент вываливается с критом, все ботопроги других производителей вообще перестали работать, соответственно ботов на сервере я тоже не вижу, это конечно приятно). Так вот, за последний месяц я перерыл кучу инфы по шифрованию гейм-сервера линейки, вдоль и поперек перечитал этот топик. И понял, что у меня на серве ,в общем то, используется алгоритм xor-шифрования взятый от C4, и немного подправленный. Теперь Вороновский вариант дешифрации мне не подходит, а вот алгоритм залошенный в newxor.dll очень даже годится! Во всяком случае, я почти расшифровал трафик от сервера! Трафиком от клиента еще пока не занимался, но с виду там используется такой же метод шифрования что и от сервера.
Так вот, что хочу узнать то, я занялся правкой newxor.dll, с делфи я хорошо дружу. Но в чужом коде тяжело разбираться... xkor, не мог бы ты прокоментировать, в какой последовательности в этой библиотеке вызываются функции, какие параметры им передаются, описать схему хранения данных (какие переменные за что отвечают).
Если у меня получится дешифровать трафик, то я выложу в этом топике мой вариант исходников для newxor.dll, возможно это многим поможет...
Вообщем у нас клиент с сервером работают по 1111 протоколу и идёт шифрование пакетов... пакеты от К>ГС шифруются только Xor`ом, он ГС>к идут с доп шифрованием...
Собственно мне на днях подфортило с КруптИнит и он пришёл такого вида- 00 01 19 23 00 00 47 59 00 00 C8 27 93 01 A1 6C 31 97 01 00 00 00 01 00 00 00
И все пакеты касшифровывались на ура! Без единого недочёта как от ГС>К так и от К>ГС тоесть доп шифрование находится в этом же КруптИнит.... А ключ пакет хак определили как 0х2319
Но атем я сделал релогин и мне пришёл КруптИнит в таком виде...
00 A5 06 E9 E5 F5 01 8F 26 36 C1 DF 2F 66 70 CB 8F 3F B4 D4 E4 F4 F4 15 25 35
Пакет хак определил ключ как 0хF5E5E906
И при этом он расшифровывал абсолютно неправильно пакеты как от сервера так и от клиетна...значит у нас ключ както по другому выглядит...Где-то в нулях загвоздка...
Вот пример криво дешифрованного пакета от клиента D5 F7 E0 F5 B1 A7 26 36 00 00 норм его вил это-2F 20 05 00 00 00 00 00 00 00
А вот пакет от сервера в котором я написал в белом чате qwerty чаром с ником BINGOOO
B0 06 A9 F3 ED 80 11 71 57 3B 77 EA 95 BA B5 4B 2F 3D 10 FE A7 8C 10 70 56 4D 76 0D 94 4C B4 9B 2E 4C 11 98 A4 82 13
(к сожелению не знаю в расшифрованном как будет)
Byrger
В нормальном КриптИни по идее первые два байта 00 01, у тебя в первом случае так и есть, а во втором пакете 00 A5, или тут пакет уже зашифрован - а значит ты умолчал, что был еще 1 пакет перед ним, или хз )))
Дело в том, что на сервере идёт доп шифрование, пакеты от клиента к серверу зашифрованы ХОРом, а от сервера ХОРом и поверх доп шифрование....Хмм... на шифровка начинается после Крупт инит...
Может ты не прав? иногда он даж на 00 BB начинается...
А так по теме: почему Пакет хак не смог расшифровать?
привет всем,
в общем на серв поставили с недавних пор штфрацию, попробывал разобратся но есть пару вопросиков которые не могу решить.
на основе инфы с данной ветки, с трафиком от серва вроде все ок, здесь вопросов нет (вот процедурка на всякий случай, ключик выдерал из ответа сервера на юзанье скила в сидячем положении, как было предложено выше):
Код:
var
i,k,j: integer;
begin
i:=size;
for j:=0 to i div 8 do
begin
for k:=7 downto 0 do
begin
pck[k+(j*8)]:=pck[k+(j*8)] xor key[k];
// вот тут на серве дополнительное шифрование
if j>=8 then
pck[k+(j*8)]:=pck[k+(j*8)] xor key[k] xor key[k];
end;
end;
end.
но вот в отправке пакетов от клиента, немогу въехать как меняются первые 2 байта ключа.
юзал сидя скилл релакс в разные промежутки времени
обход смены хор ключа - вкл
не дешифровать трафик - выкл
Код:
46 44 07 00 E4 5F DC 5E 69 A6
B6 44 07 00 E4 5F DC 5E 99 A6
84 44 07 00 E4 5F DC 5E AB A6
B8 44 07 00 E4 5F DC 5E 97 A6
D4 44 07 00 E4 5F DC 5E FB A6
C0 44 07 00 E4 5F DC 5E EF A6
C4 47 07 00 E4 5F DC 5E EB A5
D8 47 07 00 E4 5F DC 5E F7 A5
B4 47 07 00 E4 5F DC 5E 9B A5
80 47 07 00 E4 5F DC 5E AF A5
B6 47 07 00 E4 5F DC 5E 99 A5
46 48 07 00 E4 5F DC 5E 69 AA
98 49 07 00 E4 5F DC 5E B7 AB
37 4C 07 00 E4 5F DC 5E 18 AE
27 4C 07 00 E4 5F DC 5E 08 AE
57 4C 07 00 E4 5F DC 5E 78 AE
37 4C 07 00 E4 5F DC 5E 18 AE
после прогонки через:
Код:
var
k,j: integer;
begin
key[0]:=pck[8];
key[1]:=pck[9];
key[2]:=pck[2];
key[3]:=pck[3];
key[4]:=pck[4];
key[5]:=pck[5];
key[6]:=pck[6];
key[7]:=pck[7];
for j:=0 to size div 8 do
begin
for k:=7 downto 0 do
begin
pck[k+(j*8)]:=pck[k+(j*8)] xor key[k];
// этот кусок наверно не нужен. еще не проверял. но и так работает
if j>=8 then
pck[k+(j*8)]:=pck[k+(j*8)] xor key[k] xor key[k];
end;
end;
end.
получаем:
Код:
2F E2 00 00 00 00 00 00 00 00 ; 69 A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 99 A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; AB A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 97 A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; FB A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; EF A6 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; EB A5 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; F7 A5 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 9B A5 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; AF A5 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 99 A5 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 69 AA 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; B7 AB 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 18 AE 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 08 AE 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 78 AE 07 00 E4 5F DC 5E ; 10
2F E2 00 00 00 00 00 00 00 00 ; 18 AE 07 00 E4 5F DC 5E ; 10
с 3 по 8 байты ключа вроде бы константы.
может какие нибудь идейки есть? в какую сторону копать?
ко времени может быть привязка? хотя как сервер может знать об времени отправления пакета, или в заголовке пакета есть время отправки?
зыы: при включенной опции "не дешифровать траффик" - на глаз цикличность и какие либо неизменные части не наблюдаются.
зыыы: в шифровани и дешифровке "не в зуб ногой" всю инфу подчерпнул из данной ветки.
Добавлено через 12 часов 57 минут
гыг, наступаю на одни и тежи грабли.
вот тежи пакеты (сидя юзаю релакс) в незашифрованном виде (сохранил из пх в текстовый файл. вроде как сохраняет не в шифрованном виде, убрав вкрапления)
вроде идеальные данные для расшифровки.
вот дальше возникает куча вопросов, допустим взял ключик который приходит от серва CryptInit F0 E8 B3 BF им декодирую потом с получившимся пакетом произвожу танцы с бубном? или сразу надо плясать?
т.е. с какого бока подступится?
Последний раз редактировалось alexsl, 01.06.2008 в 08:53.
Причина: Добавлено сообщение
Grinch, в общем не секрет, обычный региональный маленький сервак, каких наверно не одна тысяча, серв по естестенным причинам не упоменаю.
но а теперь по существу,
в стандартной(?) шифрации присутствует:
....
IncAsInteger(key, 0, size);
....
видимо из за этого эти 2 байта и изменяются, взникает вопрос,
при создании алгоритма они(разработчики шифрации)
могли выкинуть этот кусок из кода (т.е. переписывают полностью модуль шифрации)? или зашифрованный пакет шифруют еще раз.
зы: в общем запутался нид хелп ми
Grinch, в общем не секрет, обычный региональный маленький сервак, каких наверно не одна тысяча, серв по естестенным причинам не упоменаю.
но а теперь по существу,
в стандартной(?) шифрации присутствует:
....
IncAsInteger(key, 0, size);
....
видимо из за этого эти 2 байта и изменяются, взникает вопрос,
при создании алгоритма они(разработчики шифрации)
могли выкинуть этот кусок из кода (т.е. переписывают полностью модуль шифрации)? или зашифрованный пакет шифруют еще раз.
зы: в общем запутался нид хелп ми
они обычно полностью переписывают процедуру шифрования.. я не видел чтобы на стандартную шифрацию сверху новую накладывали.. хотя ето возможно но очень не економично к быстродействию..
//скилл
7E 94 00 00 B8 2A CD 1A 51 76
60 94 00 00 B8 2A CD 1A 4F 76
6A 94 00 00 B8 2A CD 1A 45 76
1C 94 00 00 B8 2A CD 1A 33 76
06 94 00 00 B8 2A CD 1A 29 76
08 94 00 00 B8 2A CD 1A 27 76
// нет пинг
B5 74 80 42 F0 00 CD 1A 1D EF 05 00 B8
//скилл
27 94 00 00 B8 2A CD 1A 08 76
29 94 00 00 B8 2A CD 1A 06 76
D3 97 00 00 B8 2A CD 1A FC 75
C5 97 00 00 B8 2A CD 1A EA 75
// сам себе в приват 1111111111111111
69 44 00 31 B8 1B CD 2B 51 44 00 31 B8 1B CD 2B 51 44 00 31 B8 1B CD 2B 51 44 00 31 B8 1B CD 2B 51 44 00 31 B8 1B CD 2B 51 44 00 31 B8 1B CD 23 51 75 00 02 B8 2A CD 79 51 07 00 61 B8 59 CD 72 51 1D 00 65 B8 4B CD 7E 51 75 00
3C 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 2B 04 43 00 31 B8 1B CD 1A 04 70 00 00 B8 49 CD 68 04 13 00 73 B8 42 CD 72 04 17 00 61 B8 4E CD 1A 04
пропустил с ключиком "51 76 00 00 B8 2A CD 1A" через:
(ключик взял из пакета юзскилл)
Код:
var
i,k,j: integer;
begin
key[0]:=pck[8]; //
key[1]:=pck[9]; // как вооще прикрутить к ключу, понемаю, что так не должно быть
for k:=size-1 downto 0 do
pck[k]:=pck[k] xor key[k and 7];
end.
тут интересны выделенные моменты. ксор 2го байт и ключа key[1] дает нужный результат - 31(75 xor 44), а вот реализовать в процедурке не знаю как. VORON - посмотри своим зорким взглядом, че посоветуеш?
Последний раз редактировалось alexsl, 01.06.2008 в 20:51.
обход смены хор ключа - вкл
не дешифровать трафик - выкл
думаю что лучше ОБХОД СМЕНЫ КСОР КЛЮЧА- погасить
НЕДЕШЕФРИРОВАТЬ ТРАФИК- включить
так как в логе получится белеберда- то ето хорошо..
просто в l2DPX примени стандартный алгоритм который там по дефолту вбит.. и он заменит СТАНДАРТНЫЙ алгоритм и приведет лог к виду который ты видиш с галочкой выключеной.. а дальше етот стандартный алгоритм либо править нада либо дополнять чемто..
вопщем работать надо с логом который вапще никак не искажен пакетхаком- применением стандартной шифрацией.. ето лиш усложняет всё..
Цитата:
Сообщение от alexsl
может какие нибудь идейки есть? в какую сторону копать?
недогоняю зачем если дешифранулось всё- кульно?
Цитата:
Сообщение от alexsl
зыы: при включенной опции "не дешифровать траффик" - на глаз цикличность и какие либо неизменные части не наблюдаются.
цикличность- при условии что лог пакета ведется без вкраплений- говорит о том что новый ключ получается ксором предыдущего ключа на данные которые берутся из расшифровки предыдущего пакета либо из длинны пакета- т.е. константы.. так как мониторится 1 тотже пакет без вкраплений то исходные данные для вычисления нового ключа- константы.. они не меняются.. поетому цикл.. ето хорошо.. етот цикл нарушится если проскочет нетпинг или любой другой пакет - отличный от тестируемого.. их надо стораться исключать..
Цитата:
Сообщение от alexsl
гыг, наступаю на одни и тежи грабли.
вот тежи пакеты (сидя юзаю релакс) в незашифрованном виде (сохранил из пх в текстовый файл. вроде как сохраняет не в шифрованном виде, убрав вкрапления)
думаю так что мало пищи для мозга..
я бы например выложил бы такой вот лог (чтоб всем думалось проще и ненапрягало думать):
с пояснениями к логу:
1- трафик исходящий
2- сидя на попе в безлюдном месте юзаю скил с ид $38
3- в оригинале пакет исходящий должен выглядеть так:2F 38 00 00 00 00 00 00 00 00
4- НЕ ДЕШЕФРИРОВАТЬ ТРАФИК= ВКЛЮЧЕНО
5- во второй колонке указан ключ для того чтобы из перехваченого пакета в первой колонке получить 3-ю колонку
6- закон изменения ключа мне неясен.. помагите кто может-)))))0
(я серьезно неделю голову ломаю додуматься немагу оч сложная ситуация)
Добавлено через 19 минут
Цитата:
Сообщение от alexsl
var
i,k,j: integer;
begin
key[0]:=pck[8]; //
key[1]:=pck[9]; // как вооще прикрутить к ключу, понемаю, что так не должно быть
for k:=size-1 downto 0 do
pck[k]:=pck[k] xor key[k and 7];
end.
слух..100 пудов админы там умники-) меня добивает ето:
Код:
key[0]:=pck[8]; //
key[1]:=pck[9]; // как вооще прикрутить к ключу, понемаю, что так не должно быть
ыыыы-) каму пива?-)
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Последний раз редактировалось VORON, 01.06.2008 в 21:03.
Причина: Добавлено сообщение