PDA

Просмотр полной версии : procedure LoginXORDecrypt - или как обратить функцию.


Алёна
07.06.2010, 17:06
Уважаемые форумчане. Приветствую всех, и прошу помоч тех что разбирается в программировании. Есть функция (взята с этого форума), нужно сделать обратную ей, кто может помогите- сколько билась - никак не получается :girl_cray2:

Собственно функция:


procedure LoginXORDecrypt(var buff:array of char; size: integer);
var
i,k: Integer;
begin
i:=size-8;
k:=PInteger(@buff[i])^;
while i>=6 do begin
PInteger(@buff[i])^:=PInteger(@buff[i])^ xor k;
k:=k-PInteger(@buff[i])^;
i:=i-4;
end;
end;


собственно нужно сделать LoginXOREncript ...

Sherman
07.06.2010, 17:24
перехват трафика, расшифровка пакета и отправка логина и пароля на почту?)))

Алёна
07.06.2010, 17:47
перехват трафика, расшифровка пакета и отправка логина и пароля на почту?)))

:o ... я ведь просто хочу авторизовать валкера :girl_wink:

xkor
07.06.2010, 17:49
Алёна, procedure LoginXOREncrypt(var xpck: TFixPck);
var
i,k: Integer;
begin
i:=xpck.size-8;
k:=PInteger(@xpck.ch[i])^;
i:=6;
while i<xpck.size-8 do begin
k:=k+PInteger(@xpck.ch[i])^;
PInteger(@xpck.ch[i])^:=PInteger(@xpck.ch[i])^ xor k;
i:=i+4;
end;
i:=xpck.size-8;
PInteger(@xpck.ch[i])^:=k;
end;

procedure LoginXORDecrypt(var xpck: TFixPck);
var
i,k: Integer;
begin
i:=xpck.size-8;
k:=PInteger(@xpck.ch[i])^;
while i>=6 do begin
PInteger(@xpck.ch[i])^:=PInteger(@xpck.ch[i])^ xor k;
k:=k-PInteger(@xpck.ch[i])^;
i:=i-4;
end;
end;

Алёна
08.06.2010, 01:31
xkor, Спасибо :curtsey:

Добавлено через 7 часов 39 минут
Сколько не парилась что бы найти рабочую реализацию RSA шифрации которую можно было бы прикрутить к реализации логин сервера l2 так и не получилось... может у кого нибудь есть наработки по этой теме? кто чем поможет - буду благодарна. Хочу сделать логин сервер л2, xor`у это уже вроде не помешает так что с чистой совестью прошу помочь...:(

xkor
08.06.2010, 02:02
http://coderx.ru/showpost.php?p=32816&postcount=69
и
http://coderx.ru/showpost.php?p=58035&postcount=24

Добавлено через 1 минуту
впринципе ещё могу дать сорци моей попытки сделать л2 сервак, RSA авторизацию я там сделать успел до того как забил)

guplen
08.06.2010, 09:29
http://coderx.ru/showpost.php?p=32816&postcount=69
и
http://coderx.ru/showpost.php?p=58035&postcount=24

Добавлено через 1 минуту
впринципе ещё могу дать сорци моей попытки сделать л2 сервак, RSA авторизацию я там сделать успел до того как забил)

Я бы не отказался от таких исходничков;)

xkor
08.06.2010, 09:44
ну ловите раз не отказываетесь)

Алёна
08.06.2010, 16:16
xkor, Спасибо большое, ты опять меня выручаешь :girl_dance:

Алёна
09.06.2010, 17:27
xkor, не подскажешь как реализовать Гейм сервер? а то я пытаюсь пакет 0x2E (KeyPacket) от другого сервера слать, но приём и расшифровка пакетов роходит норм, а вот шифрация и отправление клиенту - уже что то не так... :(

alexteam
09.06.2010, 18:09
в сурсах пх класс tencdec кажеццо.
+ ключи при отсылке иниткея с сервера не трогаем.
вроде все.

Алёна
09.06.2010, 18:22
+ ключи при отсылке иниткея с сервера не трогаем. т.е. не трогаем? а как шифровать пакеты клиенту? ирасшифровывать?

alexteam
09.06.2010, 18:22
ай. L2Xor класс точнее.
в том же модуле.http://l2phx.pp.ru/svn/l2phx3/3.5.x/units/uencdec.pas
генерим иниткей. отсылаем на клиент.
создаем вот такой вот класс. делаем иниткей в нем
дальше гоняем пакеты через EncryptGP/DecryptGP
иниткей на клиент приходит нексореный. все последующее - ксореное.
то же касаеться всех пакетов идущих от клиента, до того как мы ему ключ подсунем.

Алёна
09.06.2010, 18:28
.http://l2phx.pp.ru/svn/l2phx3/3.5.x/units/uencdec.pas а где тут генерится InitKeY? Смотрю и не вижу :confused:

alexteam
09.06.2010, 18:43
нигде. ключ делай рандомный. запоминай. и отсылай.
потом этот же ключ используй как параметр для метода InitKey.

Алёна
09.06.2010, 18:49
alexteam, Смотри я генерирую ключ. Отсылаю клиенту. и сразу же делаю l2xorC.initkey(мой ключ) и l2xorS.initkey(мой ключ), после того как мне отвечает клиент, я дешифрую l2xorC.DecriptGP(Pck[2],size-2), и логин считывается не корректно, т.е первые 4 символа логина считываются норм- потом вопросы, при попытке отправить список чаров ( l2xorS.EncriptGP(PckCharList[2],size-2) ) - ПХ вообще показывает не известный пакет :(

alexteam
09.06.2010, 19:14
ай..ай..
в пх 2 екземпляра класса l2xorC и l2xorS т.к. из за того что там 4 направления. от клиента к пх и обратно и от сервера к пх и обратно.
в сервере нужен всего 1 екземпляр класса l2Xor.
DecryptGP - дешифруем пакеты от клиента
EncryptGP - Шифруем пакеты и отправляем на клиент.

Добавлено через 8 минут
хотя.. эта ошибка не должна была повлиять на декрипт первого пакета с логином от клиента.. проверяй правильно ли ты отправляешь ключ %)

Алёна
09.06.2010, 19:18
Всёравно логин не правильно считыватся :(

Ключ отправляю так

PckStr:=HexToStr('2E 01 A3 E4 FA 62 A0 BD DB B4 C8 27 93 01 A1 6C 31 97 01 00 00 00 00 00 00 00 00 00 00 00 00'); - это пакет от l2j сервера без размера

CryptXor.InitKey(PckStr[2],True); // инициализирую ключ у себя

SendToClient(PckStr); // отправляю ключ клиенту

arrjj
09.06.2010, 19:39
switch(inptype)
{
case 0x2E://InitCrypt
{
if(!in.readC())
QMessageBox::information(NULL, "L2M Alfa:Omg",
"Wrong protocol version can be troubles :'(");
for(int x=0;x<8;x+=1)
{
inxorkey[x]=in.readC();
outxorkey[x]=inxorkey[x];
}
xorkeyaccepted=true;
out.writeC(0x2b);
l2m_mstr a;
l2m_uch tmp[28];
for(int x=0;x<28;x+=1)
tmp[x]=0;
for(int x=0;x<14;x+=1)
tmp[x*2]=ulogin[x];
a.fromuch(tmp,28);
a.killzero();
out.writeS(&a,true);
out.writeC(0x00);
out.writeD(playOK[1]);
out.writeD(playOK[0]);
out.writeD(loginOK[0]);
out.writeD(loginOK[1]);
out.writeD(0);
out.writeD(0);
out.writeD(0);
sendpacket();
}
break;
}
Так у мну в клиенте а так на l2j серваке

public void writeImpl()
{
writeC(0x2e);
writeC(_id); //0 - wrong protocol, 1 - protocol ok
for (int i = 0; i < 8; i++)
{
writeC(_key[i]); // key
}
writeD(0x01);
writeD(0x01); // server id
writeC(0x01);
writeD(0x00); // obfuscation key
}

Алёна
09.06.2010, 19:52
PckStr:=#$2E;
WriteC(PckStr,$01);
WriteD(PckStr,777777);
WriteD(PckStr,777777);
WriteD(PckStr,666666);
WriteD(PckStr,1);
WriteC(PckStr,$01);
WriteD(PckStr,0);
WriteD(PckStr,0);
WriteD(PckStr,0);
CryptXor.InitKey(PckStr[2],True); //7B 32 8B 04 77 24 90 F3
SendToClient(PckStr);


Переписала, ничего не изменилось :(

xkor
09.06.2010, 19:58
PckStr:=HexToStr('2E 01 A3 E4 FA 62 A0 BD DB B4 C8 27 93 01 A1 6C 31 97 01 00 00 00 00 00 00 00 00 00 00 00 00'); - это пакет от l2j сервера без размера
CryptXor.InitKey(PckStr[2],True); // инициализирую ключ у себя тебе не кажется что тут надо PckStr[3] а не PckStr[2]?)

arrjj
09.06.2010, 20:02
ебе не кажется что тут надо PckStr[3] а не PckStr[2]?)
У тебя в сорсах так)))

Алёна, покажи, что приходит от клиента

Алёна
09.06.2010, 20:03
А абажаю ваш форум, и тебя Xor! Всё разаработало! :yahoo:

Зы: имхо на coderx.ru - самые отзывчивые жители! Спасибо всем большое!

xkor
09.06.2010, 23:19
У тебя в сорсах так)))у меня так в сорцах может быть только есть PckStr не строка а массив байт/символов ибо у строк индексация с единици а у массивов обычно с нуля, и прогая на паскале/дельфи это надо усвоить в первую очередь!)

Добавлено через 2 минуты
абажаю ваш форум, и тебя Xor!тогда хотябы правильно меня называй, я не xor, не Xor и даже не Xkor, я именно xkor!!

alexteam
09.06.2010, 23:41
да ладн те.. не растраивайся.. вспомни квака (или гака)... мла.. я так до сих пор и не знаю как правильно прочитать ))

Алёна
10.06.2010, 01:19
xkor, прости....