constructor TXorCodingOut.Create;
begin
EncAccumulatorSize := 0;
DecAccumulatorSize := 0;
end;
procedure TXorCodingOut.DecryptGP(var Data; var Size: Word);
begin//EncryptGP, если он не реализован в YourEncryptFuncton.end;
procedure TXorCodingOut.EncryptGP(var Data; var Size: Word);
begin//EncryptGP, если он не реализован в YourDecryptFuncton.end;
procedure TXorCodingOut.InitKey(const XorKey; Interlude: Boolean);
begin//иниткей, стандартный если нуженend;
procedure TXorCodingOut.PreDecrypt(var Data; var Size: Word);
procedure YourDecryptFuncton(var Packet:TPacket);
begin//сюда поступает пакетик который необходимо декриптовать.//если ты захочешь сразу преобразовать его в декриптованный линейковский пакет//то decryptgp оставляй пустым //если же это поверхносный навесок на криптовку - рекомендую "раздельное питание"end;
var
L2Packet : TPacket; //обьявлен в шаредструктуре
OutBuffer : array[0..$ffff] ofbyte;
begin//client>>[PreDecrypt]>DecryptGP>(PH)>EncryptGP>PostEncrypt>>server//выходящий буффер - пуст.fillchar(OutBuffer, $ffff, 0);
//Суем в аккумулятор то что пришло.move(data,DecAccumulator,size);
inc(DecAccumulatorSize, Size);
Size := 0; //выход обнуляем не давая пакетхаку эту поцию обработать если на следующей проверке//мы вылетим с этой функции либо не попадем в цикл (это и есть склейка пакетов. когда длина линейковского пакета//меньше фактически полученных данных. мы будем ждать копя данные в аккумуляторе)if DecAccumulatorSize < 2thenexit; //в аккумуляторе нет даже длинны.//в акумуляторе есть чтото по длинне превышающей либо равной 2м байтам. читаем их как размер пакетаmove(DecAccumulator[0], L2Packet.Size, 2);
//!если криптуеться весь траффик включая ДЛИННУ пакетов - в этом месте декриптовать L2Packet.Size!while(L2Packet.Size <= DecAccumulatorSize)do//Резка пакетов в этом вайле//будем крутиться тут пока нам будет хватать фактических данных для обслуживания длинн линейковских пакетов.begin//подчистим дату пакета, дабы не мусор не смущал при отладке.fillchar(l2packet.data[0], $FFFD, 0);
//вытягиваем с акумулятора данные пакета.move(DecAccumulator[0], L2Packet.data[0], L2Packet.Size-2);
//сдвигаем батики в акумуляторе на эту же длинну, затирая считаный с аккумулятора пакетmove(DecAccumulator[L2Packet.Size], DecAccumulator[0], DecAccumulatorSize-L2Packet.Size);
//и умельшаем длинну акумулятораdec(DecAccumulatorSize, L2Packet.Size);
//Декриптуем
YourDecryptFuncton(L2Packet);
//декриптованный пакет суем в временный выходящий буффер (он нужен только потому что нельзя мовнуть в data[xxx])move(L2Packet, OutBuffer[Size], L2Packet.Size);
//и увеличиваем колво байт в выходящем буфереinc(Size, L2Packet.Size);
//Режем следующий пакетif DecAccumulatorSize >= 2thenbeginmove(DecAccumulator[0], L2Packet.Size, 2);
//декрипт длинны ?endelsebreak;
end;
//сливаем данные с временного буфера в выход буфферmove(OutBuffer[0], data, $ffff);
end;
procedure TXorCodingOut.PostEncrypt(var Data; var Size: Word);
//в общем точная копия декрипта, только екрипт. а так все на тех же местах.procedure YourEncryptFuncton(var Packet:TPacket);
begin//аналоично YourDeacryptFuncton но наоборот.end;
var
L2Packet : TPacket;
OutBuffer : array[0..$ffff] ofbyte;
beginfillchar(OutBuffer, $ffff, 0);
move(data,EncAccumulator,size);
inc(EncAccumulatorSize, Size);
Size := 0;
if EncAccumulatorSize < 2thenexit;
move(EncAccumulator[0], L2Packet.Size, 2);
while(L2Packet.Size <= EncAccumulatorSize)dobeginfillchar(l2packet.data[0], $FFFD, 0);
move(EncAccumulator[0], L2Packet.data[0], L2Packet.Size-2);
move(EncAccumulator[L2Packet.Size], EncAccumulator[0], EncAccumulatorSize-L2Packet.Size);
dec(EncAccumulatorSize, L2Packet.Size);
YourEncryptFuncton(L2Packet);
move(L2Packet, OutBuffer[Size], L2Packet.Size);
inc(Size, L2Packet.Size);
if EncAccumulatorSize >= 2thenbeginmove(EncAccumulator[0], L2Packet.Size, 2);
endelsebreak;
end;
move(OutBuffer[0], data, $ffff);
end;
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 07.10.2009 в 13:07.
За это сообщение alexteam нажился 3 спасибками от:
Ух ты, прикольно получилось. Долго бы я парился все это выдумывать. Спасибо! Надо будет затестить!
После теста это нужно будет выложить в отдельную тему, а то здесь оно потеряется
главное чтобы идею понял -) и понял куда ему чего прикручивать..
к стати.. ничего выдумывать не надо. Точно такое же в сокетном енджине крутиться.... ну практически -)
Добавлено через 8 минут
блин, глянул еще раз, разрезку пакетов забыл добавить. поправил.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 06.10.2009 в 23:50.
Причина: Добавлено сообщение
За это сообщение alexteam нажился 2 спасибками от:
блин, глянул еще раз, разрезку пакетов забыл добавить. поправил.
Вчера вечером тестил, вроде все работало, хз правильно или нет, но работало (брал самый первый вариант). Сегодняшний вариант вставил поверх вчерашнего, в надежде на лучшее... в общем, работать перестало, ошибка в логике. В первом же пакете ProtocolVersion, в начале пакета дублируется его длинна, а в конце 2-х байтов пакета не хватает. Пока еще не совсем разобрался с логикой работы, так что прошу помощи. Скринчег прикладываю.
пардон, исправил... к стати.. мог бы и сам...
я просто вчера чуть чуть подумал, и убрал необходимость декодировать длинну пакета повторно (если декодирование требуется) -))
проблемма была тут. -) в дату тпакета пихались данные начиная с длинны, а не начиная с данных.
щас подумываю над еще одним вариантом в котором это место будет только в цикле, без такого же куска перед циклом (необходимого сейчас для входа в онный)
Добавлено через 18 минут
кстати, возми на заметку.
если у тебя кодируються и первые 2 байта пакета, при чем от их декодирования зависит и ключ(чи по чем оно там криптоваться будет) то следует:
после вот такого
move(DecAccumulator[0], L2Packet.Size, 2);
декриптовать длинну лежащую в L2Packet.Size НО НЕ изменять ключ (если он меняеться)
при чем учти что только в PreDecrypt это требуеться. в постенкрипт поступающие от пх данные идут в фармате 2 первых байта = длинна.
такие вот места
move(ХХХAccumulator[2], L2Packet.data[0], L2Packet.Size-2);
заменить на
move(ХХХAccumulator[0], L2Packet, L2Packet.Size);
а в процедурах YourDecryptFuncton/YourEncryptFuncton
ПОВТОРНО декритовать/криптовать кусок данных вместе с L2Packet.Size при чем уже с изменением ключа.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 07.10.2009 в 16:19.
Причина: Добавлено сообщение
За это сообщение alexteam нажился 2 спасибками от:
Еще ошибка. При обработке пакетов от сервера. Доходит до определенного места и заклинивает, но только в одну сторону. От клиента все обрабатывается нормально. Дважды проверял, зависает при приходе UserInfo. Прикладываю log, rawlog пакетов и исходник newxor. Все тесты провожу на сервере mks.
Добавлено через 13 минут
move(data,ХХХAccumulator[ХХХAccumulatorSize],size);
было
move(data,ХХХAccumulator,size);
что равносильно
move(data,ХХХAccumulator[0],size);
глупый баг, склейка пакетов не работала. писало постоянно не в конец буфера а в начало, тем самым нарушало структуру пакета.
.....задолбало в слепую править, сбилдил, запустил и проверил, точно работает -))
Добавлено через 2 минуты
кстати, закомитил его на свн.
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 07.10.2009 в 18:23.
Причина: Добавлено сообщение
За это сообщение alexteam нажился 2 спасибками от:
nezabudkin,
там, эта, в енк/декГп
вот такое обявленнице
pck:array[0..$4FFF] of Byte absolute Data;
на воттакое
pck:array[0..$FFFD] of Byte absolute Data;
поменяй ?...
к стати, оно и в пх чего-то так было..
а я ищщо ругалси.. что в клиенте хтмлка больше 10кб у меня почемуто коряво показываеццо -(
__________________
L2Ext - project closed.
Последний раз редактировалось alexteam, 10.10.2009 в 16:02.