procedure TSnifferThread.ParcePacket(const PacketSize: Word);
var
IPHeader: TIPHeader;
ICMPHeader: TICMPHeader;
TCPHeader: TTCPHeader;
ci: Integer;
PacketType:String;
Addr:TInAddr;
begin
Inc(MainForm.TotalPacketCount);
// Кол-во пакетов
Move(Packet[0], IPHeader, IPHeaderSize);
// Определяем тип пакета
case IPHeader.iph_protocol of
IPPROTO_ICMP: // ICMP
begin
Move(Packet[IPHeaderSize], ICMPHeader, ICMPHeaderSize);
end;
IPPROTO_TCP: // TCP
begin
Move(Packet[IPHeaderSize], TCPHeader, TCPHeaderSize);
end;
else
PacketType := 'Unsupported (0x' + IntToHex(IPHeader.iph_protocol, 2) + ')';
end;
// Фильтр по IP
Addr.S_addr := IPHeader.iph_src;
if inet_ntoa(Addr)=MainForm.RemHost.Text then begin
HexData:='';
for ci:=1 to PacketSize do HexData:=HexData+' | '+IntToHex(Packet[ci], 2);
HexData:=HexData+#13+#10;
MainForm.HexMemo.Lines.Add(HexData);
IntData:='';
for ci:=1 to PacketSize do IntData:=IntData+' | '+IntToStr(Packet[ci]);
IntData:=IntData+#13+#10;
MainForm.IntMemo.Lines.Add(IntData);
Synchronize(ShowPacket);
end;
^^^^это все прием пакета
Вопрос в следущем: нужно как я понимаю пакет отправить на Дэкрипт по xor'у чтобы видеть реальную структуру пакета (если что попровляйте), по xor'у я знаю следущее: чтобы расшифровать нужен Ключ-длина пакета которая указывается в начале пакета, т.е. первые 2 байта типа A0 00(если что поправьте), также нужна некая константа шифрования, из исходников к l2phx из Newxor'a вижу следущее: константа для интерлюдии=15, для других хроник=7, нужна константа для Gracia Final для руоффа(это суть вопроса).
Попутные вопросы: на расшифровку надо отправлять пакет без первых 2 байт или полностью?
ЗЫ: Если константа шифрования=7 то сорри, я сейчас на работе и проверить немогу
ЗЗЫ: На поиск не отправлять, ибо я в сетевом програмировании, тем более АПИшном пробую себя впервые, так что даже если ответы есть на мои вопросы, то я их непонял скорее всего, или просто незаметил тему )
ЗЗЗЫ: Так же хотелось бы на основе данной темки сделать фак(когда я сам разберусь), как писать снифер+расшифровщик+простейший анализатор пакетов... для самого низкого уровня подготовки программиста
Жду ответов, коментов, и здоровой критики где можно сделать лучше, быстрее, менее ресурсотребовательным мой код, с указанием где именно исправить, или хотя бы какой функцией/алгоритмом заменить! :-)
Добавлено через 3 часа 53 минуты
Добавил дешифровку по XOR'у в модуль XORUnit.pas на основе Coding.pas из l2phx'а, проблемы с параметрами и возможно с инизализацией Объекта класса декодирования
из исходников к l2phx из Newxor'a вижу следущее: константа для интерлюдии=15, для других хроник=7
на самом деле до интерлюда 7, начиная с интерлюда 15, но это не константа а размер ключа шифрования минус один
Цитата:
Сообщение от Aieks777
Попутные вопросы: на расшифровку надо отправлять пакет без первых 2 байт или полностью?
размер не шифруется и при изменении ключа размер берётся только данных, без 2х байтов размера, то есть истинный размер минус два
Цитата:
Сообщение от Aieks777
ЗЗЗЫ: Так же хотелось бы на основе данной темки сделать фак(когда я сам разберусь), как писать снифер+расшифровщик+простейший анализатор пакетов... для самого низкого уровня подготовки программиста
нафига?, наплодить побольше нубопрогеров пишущих методом копипаста не понимая как это работает?)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Yegor, ну тока для исходящих, и вторая шифровка идёт уже поверх трафика и не по пакетам а целиком на поток, поэтому там пох размер/не размер...
xkor, как я понял, ключ шифрации(шифровки, О_о) для исходящих пакетов каждый раз разный, и высылается сервером, а ключ для входящих пакетов всегда константа, то есть для меня он равен 15(Грация) и таблица замены(как я понял токен), не меняется или вообще не используется?
Пожалуста дайте ктонить линк на статью с описанием работы ГС-К и ЛС-К, а то нашел только для С4 и как я понял для версии хроник выше Интерлюдии токен вообще поменял своё предназначение и используется несколько иначе, хотелось бы больше инфы по этому поводу, а то разбиратся в исходниках l2phx'а довольно мучительно, на мой взгляд все слишком сильно разбросано по разным местам )
CryptInit
Назначение: передает клиенту ключ шифрования(XOR)
Формат:
00
01 // неизветсно
XX XX XX XX ... // Массив длинной 16 байт - ключ XOR
01 00 00 00 // неизветсно
01 00 00 00 // неизветсно
Вот нашел, пакет который высылает XOR-ключ, который используется для последущей дешифровки пакетов от геймсервара, этот пакет из С4, для грации он тоже характерен? Если да, то чтобы расшифровать этот пакет, нужно его сначала разXOR'ить по ключу 15, который является статическим, а все последущие уже дешифровать с помощью ключа из пакета CryptInit?
Сразу говорю, интересует только прием пакетов
Так вроде разобрался чуток, вообщем Блоуфиш по сути надстройка на XOR'ом, как я понял идет разXOR'ивание по ключу 15, и замена по таблице замена(в википедии по Блоуфишу читал), эта таблица - GKeyR, которая является структурой, вот только где вы заполняете GKeyR я не нашел ибо комп лагает жутко когда я модули pas'овские открываю (на работе пень второй с 256 памяти) ><" приду домой разберусь, а сейчас просто знающие люди проследите ход логики, верно я мыслю или нет?
Последний раз редактировалось Aieks777, 15.07.2009 в 16:55.
убери обработку исходящего трафика, все остальное оставь как для грации. входящий трафик не шефруется почти даже снифер л2он работает на входящем трафике.
Вообщем вот дамп пакета "как есть", то есть не производились никакие действия кроме IntToHex... что дальше, а то вы меня совсем запутали! Дальше как я понимаю отрезаем первые 2 байта отвечающие за размер пакета, потом прозводим сортировку в обратном порядке и получаем пакет, так чтоли? Затем берем берем первый байт который отвечает за тип пакета(сказать, двигатся, сесть и т.д.) и производим анализ какие паметры хранятся в остальном теле пакета...
Итого что получается(беру средний дамп пакета между разделителями ============): отсекаем А0 00, пересортировываем с конца наперед, и получаем :
07 1Е 8B 7D 31 94 64 6D
XX XX XX XX XX XX XX XX
отсюда 07 - Revive:H(ObjectID) из l2phx, то есть нечто типа перерисовки положения объекта наверное... Но исходя из этого остается еще большая куча байтов, СЛИШКОМ большая для ID некоторого объекта, из чего следует что действия неправильны, и следавательно наибольшая вероятность что он зашифрован ))
Едем дальше:
Код:
constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
End;
Создаем Объект класса TXorCoding
Заполняем нулями массивы: GKeyR заполняем нулями SizeOf(GKeyR) раз, и GKeyS заполняем нулями SizeOf(GKeyS) раз
Устанавливаем длину(?) KeyLen в ноль
Код:
procedure TXorCoding.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[keyLen-7])^,size);
end;
Что у нас тут интересного:
Принимем в процедуре пакет Data в хексе, и ничего более, также принимаем число Size отвечающее за размер пакета
Расксориваем пакет, с байта Size-1, что посути является SizeOf(ВЕСЬ ПАКЕТ БЕЗ ОТСЕЧЕНИЯ ПЕРВЫХ 2УХ БАЙТ) - 3
В ходе Расксоривания также одновременно и сортировка в обратном порядке
Еще помимо этого в массиве GKeyR байт под номером KeyLen-7 увеличиваем на Size(зачем, и почему именно KeyLen-7, видимо для Грации это будет KeyLen-15??)
Как я понял для дешифровки ВХОДЯЩЕГО трафика мне ничего более использовать ненадо
ЗЫ: Народ, я сел за АПИ 3 дня назад, сжальтесь и пишите поподробнее, знающим людям тут на 1 минуту больше по клавишам стучать чтобы написать подробный ответ
ЗЗЫ: Повторюсь, указывайте на ошибки, не надо сразу причислять к нубам, на ошибках учатся
Последний раз редактировалось Aieks777, 16.07.2009 в 09:54.
Расксориваем пакет, с байта Size-1, что посути является SizeOf(ВЕСЬ ПАКЕТ БЕЗ ОТСЕЧЕНИЯ ПЕРВЫХ 2УХ БАЙТ) - 3
почему -3?, расксориваем с самого последнего байта пакета, первые два байта не трогаем, DecryptGP предполагает что в неё передаётся пакет без первых двух байт размера, поэтому и нужен второй параметр - размер...
Цитата:
Сообщение от Aieks777
Еще помимо этого в массиве GKeyR байт под номером KeyLen-7 увеличиваем на Size(зачем, и почему именно KeyLen-7, видимо для Грации это будет KeyLen-15??)
во первых не байт а 4хбайтовое число типа Cardinal (он же LongWord) находящееся по смещению размер_пакета - 7, во вторых KeyLen для того и введен чтобы KeyLen-7 всегда указывало на изменчивую часть ключа, то есть до интерлюда это были первые 4 байта, а после - 4 байта начиная с 8го (при нумерации с нуля естественно)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Вот сразу бы так! Уже все по-тихоньку проясняется... Думаю вечером уже будет программка расшифровывающая пакеты верно, спасибо!
UPD: Невытерпел.... ^^
Протестите ктонить на руоффе Скачать файл(IP сами введите, а то он у них динамика... вчера вечером кляпался к серву так уже на конце 111 было, Windows+R->cmd->netstat /b-> и ищите там l2.bin к какому IP кляпается)
Кстати заметил такой прикол, при выключеном касперском в списках адаптеров отображается его адаптер... Этот козел чтоли заменяет системный NDIS-драйвер, чтобы снифать пакеты на канальном уровне? )
Последний раз редактировалось Aieks777, 16.07.2009 в 14:53.
Причина: Невыдержал :-D