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.
alexteam, затестил последние изменения. Стало лучше, но всеравно, где-то косяк. Попробуй на нагруженном сервере с ньюксором включенным, по городам попрыгать, рано или поздно зависнет. Причем, что характерно, после зависания, пакетхак ошибок не выдает, коннект не рвет (с клиентом). При попытке закрыть, окно закрывается без ошибок, но процесс висит в памяти, приходится через диспетчер задачь убивать.