В целях подтянуть программщину а заодно облегчить себе жизнь в л2 решил написать что-то типа сигнализации о приближении врага.
Пакетики от ГС принимаю успешно, но никак не могу разобратся как их расшифровывать.
Скачал модули (l2cript.zip) с вашего сайта, я так понимаю оттуда мне нужен только CryptXOR.pas
Вот только всеравно затрудняюсь понять что нужно делать.
Просмотрел несколько форумов и видел что подобные темы поднимались, но нигде четкого ответа не увидел :(
Сам уже неделю ломаю голову, но методом тыка не охота работать, а понять алгоритм расшифровки не могу.
Мог бы кто-то по доброте душевной показать на примере что нужно накодить(было бы замечательно если с коментами)?
Насколько я понял из прочтения форумов/статей, пакеты от и к ГС шифруются отдельно, т.е. исходящие мне можно не ловить.
Скажем от сервера я получаю пакеты (приведу первых 4):
Код:
10 00 00 01 F2 37 00 00 01 00 00 00 05 00 00 00
1-й пакет от ГС, в нем передается ключ шифрования.
Код:
44 01 E1 D7 D7 D7 76 57 03 C5 37 4B 4B 12 B3 92 C6 77 85 F3 F3 F3 52 1B D0 54 A6 F5 F5 8C 2D 23 77 94 66 34 34 46 E7 EE BA 4B B9 E1 E1 E1 40 80 AE 2F DD EA EA EA 4B 27 73 F4 06 31 31 31 90 FE AA 2D DF F7 F7 F7 56 3B 6F E8 1A 1C 37 37 96 3F 2A AD 5F B8 55 AA F4 9C 9E 17 C8 4D 38 53 B2 02 AF 56 CE 45 D1 87 66 2E 7E F9 0B 9C F8 F8 59 3D 69 EE 1C 2B 2B 2B 8A E6 B2 35 C7 F0 F0 F0 51 3D 69 EE 1C 2B 2B 2B 8A E6 B2 35 C7 F0 F0 F0 51 3D 69 EE 1C 2B 2B 2B 8A E6 B2 35 C7 F0 F0 F0 51 3D 69 EE 1C 2B 2B 2B 8A E6 B2 35 C7 FF C4 0E AE C2 96 11 E3 02 38 F2 52 B0 F3 B1 42 7F 66 A3 03 85 EB A6 55 F2 E5 20 80 7D 3E 7C 8F B8 B8 B8 19 75 21 A6 54 63 63 63 C2 AE FA 7D 8F B8 B8 B8 19 75 21 A6 54 63 63 63 C2 AE FA 7D 8F CC CC CC 6D 01 55 D2 20 3E 3E 3E 9F B2 EF 68 9A BF BF BF 1E 42 16 91 63 2E 2A 2A 8B 9C CC 4B B9 8E 8E 8E 2F 43 17 90 62 55 55 55 F4 98 CC 4B B9 8D 8D 8D 2C 41 15 92 60 56 56 56 F7 98 9A 13 CC 49 3C 57 B6 06 AB 52 CA 41 D5 83 62 0E 5A DD 2F 07 07 07 A6 CB 9F 18 EA DD
2-й пакет, тут насколько я понял юзая l2phx, инфа о выбраном по умолчанию чару.
Код:
05 00 CC F7 F6
3-й пакет, SSQInfo, каким цветом небо с луной красить
Код:
19 01 22 56 56 17 B6 91 C5 1B 2C 58 58 6E CF E2 B6 31 06 1A 85 86 27 4B 1F 34 79 46 46 46 E7 8B DF 58 6F 56 56 56 F7 9B CF 4A 7D 44 44 5B FA 96 C2 44 73 4A 4A 7B F1 9D C9 8B FD C4 C4 14 58 CB 60 E3 82 B5 98 2A FE F9 ED B6 78 3F 55 E9 DC E6 F2 51 62 5B 5B FB 3E 52 06 89 BE 87 87 87 26 4A 1E 99 AE 97 97 BE 1F 73 27 82 B5 8C 8C AC 0D 61 35 AB 9C A5 A5 A9 08 64 30 AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 A3 02 6E 3A BD 8A B3 B3 B3 12 7E 2A AD 9A A3 A3 52 F6 9A CE 49 7E 47 47 58 F9 95 C1 46 71 48 48 48 E9 85 D1 56 61 58 58 58 F9 95 C1
4-й пакет, выбраный чар, им дальше будем входить в мир
Ну и дальше все шифруется по тому же принципу.
Пакеты эти у меня хранятся в TStringList (мб их не в строках как-то хранить нужно)?
Хотелось бы увидеть функцию которая получает пакет в вышеприведенном виде и отдает расшифрованый пакет (с использованием CryptXOR.pas или без. "без" будет мне понятней, "с" будет вам быстрее).
блин ну посмотри как пакетхаке расшифровываются...
ЗЫ да и что CryptXOR.pas непонятно?, юзаем Init и передаёш в качестве параметра ключ (если ключ в пакете pck в виде строки то пишем pck[4] в параметр, но это если строка обычная (тоесть массив байт) а не как у тя в виде хекса...)
далее для каждого приходящего пакета юзаем DecryptGP(pck[2],Length(pck)-2) если pck это весь пакет включая размер и тоже в виде обычной строки (String типа имеется в виду...)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Возможно, что все действительно просто, но прошу сделать скидку на то, что я "программист" самоучка, так что возможно некоторые элементарные вещи мне кажутся сложными.
Посмотрите, пожалуйста, на прикрепленную тестовую программку, что там не так?
P.S. Функции StringToHex и HexToString нагло выдраны из исходников l2phx'a :twisted: , не судите строго O:-)
На первый взгляд:
надо поправить вот в этой строчке
l2.DecryptGP(pck[3],length(pck)-2);
т.к у string нету 0-го символа, они начинаются с 1
Да, похоже, что именно в этом и была загвоздка. Плюс я еще немного неправильно пакеты ловил изначально (в первом посте, поправил, чтоб не вводить в заблуждение тех кто, возможно, столкнется с такой же проблемой). Вот такой код работает:
if ListBox1.ItemIndex = 0 then
l2.InitKey(pck[5])
else
l2.DecryptGP(pck[3],length(pck)-2);
Извините что я опять пристаю с скорей всего глупым вопросом.
Небольшое предисловие:
Как я уже писал я вообщем то не программист, так для души, для себя балуюсь.
Так вот, все мое «программирование» - это сдирание кусков кода из различных источников и объединение их в одно целое с добавлением своих алгоритмов. Дешифрацию пакетов я взял у xkor'а.
Собственно теперь о моей очередной проблеме:
Ловлю пакеты я куском кода, содранным из прикрепленной программы (главный модуль monmain.pas ну и все необзодимые ему подключаемые), вообщем то там все модули готовы и особых проблем с этим нет, кроме одной. При логине в игру на определенном этапе (в самом начале, 8-й или9-й пакет от сервера) должен прийти пакет с id F3 и размером 23 байта, но дело в том что мне этот пакет приходит с правильным id но размером 1452 байт (и в дальнейшем я получаю еще пакеты такого размера, более длинного пакета не получил ни разу, причем не только от л2 но и от любой программы, закачка, аудио-вещание, видео и т.п.). Так вот, первые 23 байта соответствуют тому, что ловится в l2phx, но дальше что-то не понятное. Более того, если верить l2phx(а я верю) я должен получить таких пакетов (F3) несколько подряд, чего у меня не происходит, т.е. l2phx ловит больше пакетов, чем моя программа. В итоге все дальнейшие пакеты у меня расшифровываются неправильно и я, честно говоря, даже не уверен, что они правильно ловятся.
И еще, я опробовал несколько снифферов все они выдавали мне тот же результат, так что я вообще не понял почему клиент л2 ловит пакеты не так как они приходят на сетевую карту.
У меня проскакивала идея, что несколько пакетов подряд склеиваются в один, но если так, то я не понял как их разделить.
Очень прошу помочь разобраться с этой непосильной для меня задачей, я конечно понимаю что я скорей всего полез в довольно трудную область без необходимых знаний, но отступать как то уже не хочется.
Возможно, немного сумбурно, но голова уже кипит от всего этого, если что-то не понятно – просто спросите, постараюсь объяснить более подробно.
У меня проскакивала идея, что несколько пакетов подряд склеиваются в один
собсно так и есть, причём ты ловиш TCP пакет, и в нем может быть как целое число пакетов линейки так и не целое, тоесть игровой пакет может начинаться в одном TCP пакете а заканчиваться в другом
вобщем логика твоих действий должна быть примерно такой:
при поступлении пакета ты добавляеш его в буфер, а затем начинаеш из буфера вытаскивать игровые пакеты читая первые два байта в которых указана длинна пакета, а затем оставшиеся байты согласно размеру который тока что узнал (за вычетом уже прочитанных 2х байт), далее удаляеш из буфера прочитанный пакет, обрабатываеш его и если в буфере ещё есть данные опять читаеш два байта в которых указан размер следующего пакета и если в буфере есть ещё стока байт то опять читаеш оставшиеся, а если в буфере осталось меньше данных чем указано, значит остаток пакета ещё не пришёл поэтому надо ждать нового TCP пакета чтоб добавить его данные в конец буфера ну а дальше всё по старому)
Добавлено спустя 1 минуту 25 секунд:
кстати некоторые сниферы могут один и тот же TCP пакет выдавать дважды подряд иногда, при этом естественно тоже всё собьётся так что если будет наблюдаться такое явление то придётся ещё фильтр повторов сделать...
__________________
Я здесь практически не появляюсь!, Skype - ikskor