PDA

Просмотр полной версии : Отправить\принять пакет TCPClient


Amorality
16.08.2008, 14:20
Установила коннект с сервером через Indy(TCPClient) , расскажите пожалуйста , как принимать \ отправлять пакеты теперь? Пока без расшифровки :)

xkor
16.08.2008, 15:14
там должны быть какието функции типа ReadToBuffer и WriteToBuffer
подробнее сказать не могу, я с сокетами на АПИ тока работаю...

Amorality
16.08.2008, 15:21
Где бы только поподробнее об этом почитать? Весь яндекс и гугл уже перерыла , там только примерно все ..

А ты ведь тоже своего бота пишешь, как ты тогда добираешься до логин сервера и отправляешь\принимаешь пакеты ?)

xkor
16.08.2008, 15:26
написал свой класс реализующий нужные мне функции соединения и обмена пакетами через WinAPI функции...

Amorality
16.08.2008, 15:45
Не, это для меня пока сложновато :)
Вот нашла парочку процедур для Инди:
procedure ReadBuffer(var ABuffer; const AByteCount: Longint);
procedure WriteBuffer(const ABuffer; AByteCount: Longint; const AWriteNow: Boolean = False);

Кто-нибудь знает как их использовать?)

Добавлено через 16 минут
Вот , похоже уже что-то получилось, смогла сделать вывод текущего приходящего пакета в Memo , пришло правдо:
"п|(Zx"
(При простом коннекте к логин серверу) , нужно теперь научиться отправлять пакет, чтобы проверить, ответит ли мне логин сервер :)

Amorality
16.08.2008, 16:01
Вот состояние программы после 4ех коннектов

xkor
16.08.2008, 16:08
Amorality, на хрень не ответит)
принимать пакет думаю стоит так:
var
size: word;
pck: string;
begin
TCPClient.ReadBuffer(size, 2);
SetLength(pck, size-2);
TCPClient.ReadBuffer(pck[1], size-2);
// усё, пакет (не считая размера) в переменной pck
end;
для удобочитаемости пакета вот функция перевода его HEX:
function StringToHex(str1,Separator:String):String;
var
buf:String;
i:Integer;
begin
buf:='';
for i:=1 to Length(str1) do begin
buf:=buf+IntToHex(Byte(str1[i]),2)+Separator;
end;
Result:=buf;
end;
и обратно:function HexToString(Hex:String):String;
function SymbolEntersCount(s: string): string;
var
i: integer;
begin
Result := '';
for i := 1 to Length(s) do
if not(s[i] in [' ',#10,#13]) then
Result:=Result+s[i];
end;
var
buf:String;
bt:Byte;
i:Integer;
begin
buf:='';
Hex:=SymbolEntersCount(UpperCase(Hex));
for i:=0 to (Length(Hex) div 2)-1 do begin
bt:=0;
if (Byte(hex[i*2+1])>$2F)and(Byte(hex[i*2+1])<$3A)then bt:=Byte(hex[i*2+1])-$30
else if (Byte(hex[i*2+1])>$40)and(Byte(hex[i*2+1])<$47)then bt:=Byte(hex[i*2+1])-$37;
if (Byte(hex[i*2+2])>$2F)and(Byte(hex[i*2+2])<$3A)then bt:=bt*16+Byte(hex[i*2+2])-$30
else if (Byte(hex[i*2+2])>$40)and(Byte(hex[i*2+2])<$47)then bt:=bt*16+Byte(hex[i*2+2])-$37;
buf:=buf+char(bt);
end;
HexToString:=buf;
end;

Amorality
16.08.2008, 16:18
Спасибо, вот только есть некоторые трудности :)

Сначало пытаюсь разобраться с приемом пакета, в моем случае ( С выводом в Memo код будет таков?
try
IdTCPClient1.ReadBuffer(size, 2);
SetLength(pck, size-2);
IdTCPClient1.ReadBuffer(pck[1], size-2);
Memo1.Lines.Add(pck);
finally

Вот только зависает программа, когда нажимаю кнопку Connect :( Да так, что выключить ее можно только убив процесс, что делать ? :(

xkor
16.08.2008, 17:39
Amorality, я тебе для чего дал код функции StringToHex?
для того чтобы ты в memo выводил нормально...
try
IdTCPClient1.ReadBuffer(size, 2);
SetLength(pck, size-2);
IdTCPClient1.ReadBuffer(pck[1], size-2);
Memo1.Lines.Add(StringToHex(pck,' '));
finally

Добавлено через 1 минуту
Amorality, зависает кста в каком месте?, или ты трейсером пользоваться не умееш?

Добавлено через 2 минуты
зависает наверно из за того что ты читаеш данные до соединения с сервером а эти функции чтения будут стоять на месте пока не получат данные которые если соединение ещё не установлено или если все данные уже прочитаны взять неоткуда...

Amorality
16.08.2008, 17:52
xkor,
Так все равно зависает ..

На счет того, что я выполняю это до соединения с сервером, быть такого не может, тк все, что между try и finally выполняется после Connect; а Коннект удачный, это я проверяю выводом сообщения на экран.

Трейсером я пользоваться не умею и не знаю что это ..
Зависает сразу после нажатия кнопки Connect , пробовала оставить на кнопке Коннект только КОннект, а твою процедуру перенести на отдельную кнопку, но все равно зависает после нажатия этой отдельной кнопки!

xkor
16.08.2008, 18:10
Amorality, нажми F5 на первой выполняемой строке моего блока, запусти прогамму нажимай что надо и как тока программа дойдёт до этой строки она приостановиться и покажет дельфи, далее по F8 можеш двигаться вперёд и узнаеш на какой строке зависает...

Amorality
16.08.2008, 18:24
xkor,
:) Спасибо, что научил, вот на этой зависла:
SetLength(pck, size-2);

xkor
16.08.2008, 19:12
а может на предыдущей?, на этой зависнуть никак не может

Amorality
16.08.2008, 19:52
Нет На предыдущей ставит Галочку, переходит на эту и все пипец, зависает :(

NLObP
16.08.2008, 20:17
size-2

Может это не правильное значение принимает?

Amorality
16.08.2008, 21:52
ВозможНо , убрала строчку
SetLength(pck, size-2);
Сразу перестало зависать, только вот в "логах" ничего не появляется

xkor
16.08.2008, 23:25
Amorality, ээ, а pck точно string?
size чему равняется после выполнения IdTCPClient1.ReadBuffer(size, 2) ?
это можно посмотреть когда по F8 остановишся на строке следующей за IdTCPClient1.ReadBuffer(size, 2) и наведёш мышку на переменную size

Amorality
16.08.2008, 23:43
xkor,
pck стринг ..
size = 61194
Во вложениях исходники, хочешь - сам посмотри :)

NLObP
17.08.2008, 01:38
size = 61194
При таком ожидаемом размере пакета не мудрено, что подвисает - ждет когда всё прийдет. Что, то видать не так.

У меня случайно есть демки к Indy9. К сожалению большую часть пришлось выкинуть, не прицепляется к форуму.

Amorality
17.08.2008, 01:51
NLObP,
У меня есть эти демки в полном объеме..

А на счет кода кскора, там не подвисает, там наглухо зависает .. Час даже ждала :)

NLObP
17.08.2008, 01:53
Проблема в том, что пакета в 60 кб не бывает. Вот и подвисает. Ты ведь к серваку линаги подключаешься?

Amorality
17.08.2008, 02:07
NLObP,
Да к Lineage :) Подождем Xkora может он разъяснит ситуацию :)

xkor
17.08.2008, 16:09
Amorality, мм, странный у тя Indy 10, у моего для компонента IdTCPClient нету метода ReadBuffer... так что у меня даж не компилиться

Добавлено через 30 минут
такс, сделал с TcpClient компонентом со вкладки Internet...
вобщем у тя сервак с какойто странной защитой, при конекте к шокам всё ок, приходит пакет с норм размером, при конекте к твоему серву приходит какаято поебень.., ты уверен что порт правильный?

NLObP
17.08.2008, 16:28
странный у тя Indy 10, у моего для компонента IdTCPClient нету метода ReadBuffer... так что у меня даж не компилиться

В делфи 2007 я кстати тоже не смог скомпилить.

Amorality
17.08.2008, 17:14
у меня дельфи 7 .. :D и инди стандартные :( Качать из инета не могу этож куча трафика, а в локалке только 7 :( А я даже не знаю что это за серв просто нашла какой-то клиент , разковыряла л2 ини и вписала в дельфи :)

xkor
17.08.2008, 17:19
Amorality, ищи норм серв и с ним экперементируй)

Добавлено через 35 секунд
Amorality, и кста юзай всётаки лучше TCPClient а не IdTCPClient

Amorality
17.08.2008, 17:44
Amorality, ищи норм серв и с ним экперементируй)
ок :)


Amorality, и кста юзай всётаки лучше TCPClient а не IdTCPClient
А в чем разница ? :)

Добавлено через 12 минут
А, я поняла что это за серв.. Абис вроде как .. :( На абисе же пашет валкер, почему этот не хочет пахать?

Добавлено через 9 минут
Взяла рандомно ява серв, проверила, ответ есть:
5A B3 5D 3D 6A FD C7 1A 42 A7 F4 31 57 A6 0F 41 70 D4 BE 19 DD 39 46 ED F5 0C 6F B1 56 7D B9 5A 6E BD FD DB 14 3A 08 5A 05 2F 3F 47 52 3D B7 27 B8 40 6D 63 DF 45 05 26 7A A1 46 30 A7 E3 47 82 48 5A 1C B3 EA 43 86 2D 48 7A DA 76 3E AD F7 28 6E 92 5F B8 D2 3C C8 7B 2F EF DD 8C ED A0 3B EE B3 A3 2B 55 43 78 69 BB D8 A4 7A 90 EE B6 D0 28 90 B2 B8 C9 43 3E B0 B3 94 E7 F0 D6 0C B5 90 6F 6E 10 76 73 43 88 D1 45 E0 36 AC 67 F7 05 F6 8B 90 34 44 80 6B 1C 5F 46 1A AA 56 03 B3 B5 C7 DE FB 8A C1 BA AD 9F 45 16 37 E6 46 BF CC 47 C8 5A B3 C1 D4 DB 79 56 12 16
Это ведь Инит :) Как бы теперь отправить пакет , закодированный блоувишем

Amorality
17.08.2008, 18:56
Посылаю теперь через получившуюся прогу + пнх пакет на вход(акк+пасс) - ПНХ рвет соединение :(

xkor
17.08.2008, 18:56
Amorality, хех, чтоб сервак ответил на твой пакет надо его правильно составить а судя по полученному пакету у тя ревизия с РСА шифрацией логина и пароля а это ппц), кроме того BF ключ надо брать из этого первого пакета от серва рашшифровав его)

Amorality
17.08.2008, 19:23
кроме того BF ключ надо брать из этого первого пакета от серва рашшифровав его)
Как его расшифровать то? Слышала первый пакет(Инит) не шифруется, все остальные логин пакеты шифруются блоу вишем, мне бы хотя бы сейчас научиться доходить до создания чара, где бы про эту шифрацию почитать ? :)

xkor
17.08.2008, 21:30
тут http://fursoffers.narod.ru/Packets.htm

Amorality
17.08.2008, 21:57
Да вот только там не для дельфи исходники судя по всему, а для С++ , есть где-нить для дельфи?)

NLObP
17.08.2008, 22:07
Вот на паскале для делфи, вроде с оллчитса, уже не помню.

Amorality
18.08.2008, 00:09
NLObP,
Эти исходники тоже у меня не пашут (ни на абисе ни на яве) Зависает при отправке логина и пароля

Добавлено через 3 минуты
А нет. все ок работает , сейчас поковыряю :)

Jes
18.08.2008, 12:54
прикольная у вас тут дискуссия по изучению работы сокетов :)
я вот на делфи давно не писал но мне кажеться что с сокетами нужно примерно так работать:
function login;
var
login:TIdTCPClient;
buf:TIdBytes;
val:Byte;
begin
login.Port:=2106;
login.Host:="where.are.you";
login.Connect;
if login.Connected than
with login.Socket
begin
ReadBytes(buf,InputBuffer.Size);
val:=15;
Write(val);
....
end;
end;
тока не говорите что в коде много синтаксических ошибок :)

Amorality
18.08.2008, 13:04
тока не говорите что в коде много синтаксических ошибок
Грамматические тоже есть :)


ReadBytes(buf,InputBuffer.Size);
val:=15;
Write(val);
Это немного не поняла, куда ты читаешь и что есть val? куда ты его пишешь?

Jes
18.08.2008, 13:10
а так ?
login.Socket.ReadBytes(buf,login.Socket.InputBuffe r.Size);

Amorality
19.08.2008, 06:46
NLObP,
Твой исходник кстати не работает на абисе тоже... С явой работает , но конект только со второй попытки ...

Добавлено через 17 часов 26 минут
На этот раз стала делать через вкладку Internet , получилось так:
TCpclient1.ReceiveBuf и так далее(пакеты нормально принимаются в Мемо).
Посмотрела исходники Емулятора, там вообще не понятно как они отправляют .. нету TCPClient .. :( Как мне пакет теперь отправить то

PanAm
19.08.2008, 18:54
А еще наверно можно использовать TClientSocket, но его нет по умолчанию на панели internet (покраней мере в D7) но можно добавить - component->install packages add...
потом в папке bin найти файл dclsockets70.bpl жмем ок, ок
и на закладке internet появляются ClientSocket, ServerSocket

Amorality
19.08.2008, 20:46
PanAm,
У них вообще нет этих функций , нету ни Read ни Write , ни Send , ни Recieve , как с пакетами то работать? :(

Jes
20.08.2008, 12:32
PanAm,
У них вообще нет этих функций , нету ни Read ни Write , ни Send , ни Recieve , как с пакетами то работать? :(

наверное - если нету методов в классе - то могут быть в классе родителя
или они есть в проперти типо Socket, Buffer, stream etc.

а че мой пример не работает?
http://www.indyproject.org/docsite/html/!!MEMBEROVERVIEW_TIdTCPClient.html
пропертя Socket это:
http://www.indyproject.org/docsite/html/!!MEMBEROVERVIEW_TIdIOHandlerSocket.html
и тут имееться все нужное!!!!

ПС: как с вами сложно ) - сжальтесь - я же нече не рублю в этой библиотеке

PanAm
20.08.2008, 18:45
тоже долго втыкал чтож не так... а вот - размер пакета - это четко размер пакета без 2 байт самого размера, надо писать так
try
IdTCPClient1.ReadBuffer(size, 2);
SetLength(pck, size);
IdTCPClient1.ReadBuffer(pck[1], size);
Memo1.Lines.Add(StringToHex(pck,' '));
finally

Добавлено через 1 минуту
вот что у меня принимается
первый пакет от сервера
10 - EF 7C 28 5A 78 0A E8 F2 18 00

Добавлено через 4 минуты
Вот только зависает программа, когда нажимаю кнопку Connect Да так, что выключить ее можно только убив процесс, что делать ?полезно для отладки следить за OnError
коды ошибок можно посмотреть например тут
http://www.westbyte.com/ida/index.phtml?page=faq_ec

xkor
20.08.2008, 20:27
коды ошибок можно посмотреть например тут
http://www.westbyte.com/ida/index.phtml?page=faq_ecили в справке дельфи)

Amorality
20.08.2008, 23:10
xkor,
Слушай а можешь привести пример работы твоей Inject.dll? Перехват - Чтение \ Отправка .подключать я вроде знаю как, через LoadLibrary

xkor
20.08.2008, 23:55
посмотри исходники...

Amorality
21.08.2008, 00:13
xkor,
Они либо в д7 так криво выглядят, либо ты специально не все выложил, там 1 сплошной код, даже скомпилить и посмотреть нельзя :((


PanAm,
С приведенным тобой кодом зависает абсолютно на любом сервер, а с кодом Хкора, только на абисе, ну и еще на парочке :)

Добавлено через 4 минуты
ПС Трейсом проверила , Size в итоге получается 186, пакет какой-то кривой, такого вида #0#0#0#0#1 итп, но это я думаю верно ... Он же не перекодирован в Hex, а зависает непосредственно на
Memo1.Lines.Add(StringToHex(pck,''));

PanAm
21.08.2008, 01:09
:Dили в справке дельфи):D
на справку сложней ссылку дать
а в MSDN искать - вообще черт голову сломит :D

Amorality
21.08.2008, 02:05
PanAm,
Лучшеб сказал почему твой код не работает

PanAm
21.08.2008, 18:06
Мой? да вроде работает... :D
Может не коректно, но это другой вопрос.
http://panam.jino.ru/files/LS-001.RAR

Добавлено через 28 минут
вообщем, я не гуру в протоколах, темболее Логин-сервера, но вот через мой пример соединяясь с 217.13.197.170:2106 получаю пакет - EF 7C 28 5A 78 0A 20 49 18 00 - 10 байт, всегда одно и тоже, черте что, вот другой сервер (С4) дал - 00 B3 7F 66 1D 5A 78 00 00 00 00 - нормальный init для ревизии 785A.

Добавлено через 7 минут
а Может там порт поменяли, а на 2106-ом оставили ловушку для лошадей?

Добавлено через 56 минут
Тут говорили про абисс, но у него вроде LS - 85.112.114.102:2593

Добавлено через 1 час 10 минут
Вообщем тоже застопорился на отправке (хотя дело просто во времени) а потом как получить ответ от сервера? как узнать в TCPClient что пакет получен?

alexteam
21.03.2009, 14:27
Старый добрый TclientSocket - и большинство вопросов подымаемых тут просто бы не задавалось.
У них вообще нет этих функций , нету ни Read ни Write , ни Send , ни Recieve , как с пакетами то работать?
хы.
ClientSocket1.Socket.SendBuf(blabla, blablabla); = отправка
в эвентах прием. а именно. в OnRead
чтото вроде
Socket.ReceiveBuf(blablabla, Socket.ReceiveLength);

вот к примеру. по самой компоненте (http://docs.luksian.com/programming/delphi/prsokdelph/)
кстати. один из самопальных трюков, возможно пригодится -)

procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;
зы.

IdTCPClient1.ReadBuffer(size, 2);
SetLength(pck, size-2);
IdTCPClient1.ReadBuffer(pck[1], size-2);//ты уже 2 байта в сайз считал.. куда тебя понесло полный пакет тянуть ?!
Memo1.Lines.Add(StringToHex(pck,' '));

не забудь склеить сайз и само тело пакета.

зы2
в идеале чтото вроде

var
Buff: array [0..65535] of AnsiChar;
len : Word;
begin
//читаем длину пакета 2 байта поэтому это Word, 0..65535
IdTCPClient1.ReadBuffer(@len, 2);
//впихиваем это дело в буффер
CopyMemory(@Buff[0], @len, 2);
//читаем остаток пакета запихивая в буфер начиная с 3го байта
IdTCPClient1.ReadBuffer(@Buff[2], len - 2);
//готово. в массиве Buff у нас наш полученный пакет.
Memo1.Lines.Add(Format('получен пакет длинной %d, hex:'#10#13' %s', [len, ByteToHexStr(@Buff[0], len)]);

end;
на правильность синтаксиса и работоспособность кода не претендую. ибо не проверял.

зы3. я использую следующий байттохекс
function ByteToHexStr(Data: Pointer; Len: Integer): String;
var
I, Octets, PartOctets: Integer;
DumpData: String;
begin
if Len = 0 then Exit;
I := 0;
Octets := 0;
PartOctets := 0;
Result := '';
while I < Len do
begin
case PartOctets of
0: Result := Result + Format('%.4d: ', [Octets]);
9:
begin
Inc(Octets, 10);
PartOctets := -1;
Result := Result + ' ' + DumpData + sLineBreak;
DumpData := '';
end;
else
begin
Result := Result + Format('%s ', , 2)]);
if TByteArray(Data^)[I] in [$19..$FF] then
DumpData := DumpData + Chr(TByteArray(Data^)[I])
else
DumpData := DumpData + '.';
Inc(I);
end;
end;
Inc(PartOctets);
end;
if PartOctets <> 0 then
begin
PartOctets := (8 - Length(DumpData)) * 3;
Inc(PartOctets, 4);
Result := Result + StringOfChar(' ', PartOctets) +
DumpData
end;
end;

зы4.
прием оформляйте в нитях, не забывайте что читать вы должны с сокета ровно столько сколько там есть. в противном случае висяки обеспечены

[I]Добавлено через 26 минут
2 Amorality. по поводу инжект длл. если реь идет про используемый в пакетхаке то код там мудренный но ничего "специальносделаного чтобы остальные непоняли или не скомпилили" там нет.
так же инжект просто перенавравляет соединение требуемого приложения на локальный сервер. тобишь на заранее открытый твоей программой серверный сокет. никакого чтения и отправки данных касаемо траффика там нет. все в самом пакетхаке.

Maxno
26.05.2009, 10:14
Люди никто не знает как работает авторизация на HB-Gracia, http://fursoffers.narod.ru/Packets.htm тут описано под Interlude, но щас это уже не актуально...:unknw: Может кто как поможет? ну хотя бы алгоритм типо что куда шифрует в какой последовательности...


Кодинг на Delphi.

alexteam
26.05.2009, 12:26
исходный код пх на свн.
там есть класс отвечающий за дешифровку протокола гс <> клиент.

xkor
26.05.2009, 14:56
alexteam, вообщето авторизация происходит на логин сервере...

В общих чертах авторизация на HB-Gracia происходит так:
1. Пакет от сервера размером 186 байт зашифрованный по BlowFish начальным 16тибайтным ключем (ключ как в интерлюдии, наизусть его не помню), после дешифровки BF надо ещё дешифровать по XOR, ключ для него находиться на месте чексуммы пакета (178-181 байты), алгоритм дешифрации могу выложить когда домой приду...
В этом пакете с ID=0 следующий формат данных:
4 байта - session id
4 байта - ревизия протокола ($c621 вроде)
128 байт - RSA ключ заскремблированный (как дешифровать в нормальный ключ тож могу выложить)
16 байт - какие то GameGuard значения неизвестного назначения
16 байт - новый BF ключ для следующих пакетов
остальное нули...
Это пакет Init из той статьи что ты привёл, ну а дальше собсно всё как в статье)

Maxno
26.05.2009, 22:04
ООо, большой сенк всем,
xkor, буду благодарен если дашь как норм дешифровать RSA ключ.:) и про XOR ключ если выложишь - только на пользу пойдёт :)


BF ключ я нашёл только такой - 6B60CB5B82CE90B1CC2B6C556C6C6C6C
написано под интерлюд... есть еще такой, но он вроде под С4, 5F3B352E5D39342D33313D3D2D257854215E5B24

xkor
26.05.2009, 22:54
6B60CB5B82CE90B1CC2B6C556C6C6C6C - эт верно
procedure deScrambleRSAKey(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
end;

PFixPck = ^TFixPck;
TFixPck = packed record case Integer of
0:(ch: array[Word] of Char);
1:(bt: array[Word] of Byte);
2:(size: Word;
id: Byte;
dbt: array[0..65532] of Byte);
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;

Maxno
29.05.2009, 01:57
Просто хочу сделать качественный информер о состоянии серверов, но блин я не дружу с делфи так хорошо... может кто то посоветует книжки.... ну там не как формы создавать, а например полное описание работы с сокетами, или по кодингу что нить... на чём сами учились и вам реально помогло. :rolleyes:


ЗЫ: Думаю полезно будет не только мне одному :)

xkor
29.05.2009, 03:17
Maxno, я почти всему в гугле учился), ну точнее там куда он посылал)

Yegor
21.06.2009, 20:57
Maxno, для написания своего бота (информера) вся работа с сокетами сводится к нескольким простым функциям. Тебе нужно создать сокет, подключиться к серверу по определенному адресу на определенный порт, и использовать потом 2 функции чтения и записи данных с этого сокета и все в минимальном варианте. А остальное это уже прикладное программирование и тут нужно учиться самому хотя бы на примерах. Если нужен пример работы с сокетами могу выложить с подробнейшим описанием что и зачем, или напиши куда и я тебе пришлю книгу по делфи где все подробно описано.

Добавлено через 6 часов 1 минуту
xkor, Это пакет Init из той статьи что ты привёл, ну а дальше собсно всё как в статье) - что то совсем все не так дальше как в той статье, даже длины пакетов не совпадают совсем. Чем зашифрованы последующие пакеты, ну хотябы RequestAuthLogin (http://www.la2kings.ru/la2bot/packets.html#RequestAuthLogin_LS) от клиента? Как непробовал дешифровать не удаеться. Пробовал использовать BlowFish с ключем, который приходит с пакетом Init - не подходит. (Дешифровать пробую пакеты перехваченные в процессе логина обычного клиента на Шок ЛС).

xkor
21.06.2009, 22:52
Yegor, значит неверно дешифруешь или ключ берешь неверно...
ЗЫ или дешифруешь пакеты одной сессии ключем от другой сессии, ключ то при каждом подключении разный)

Yegor
21.06.2009, 23:40
xkor, нет беру с текущей сесии. Байты для ключа я беру из декодированого пакета init начиная со 153 байта (если считать что нулевой байт это id пакета). Первый пакет (init) расшифровал правилно, все сходится с твоим описанием. Ключ брать в прямом или обратном порядке?


Так задача усложнилась оказывается после пакета init ещё должен идти AuthGG, а в пакете с логином и паролем они закодированы RSA ключом.

Пробовал использовать процедуру RSAEncrypt из примера la2_client_emu, с тем же RSA ключом и тем же логином и паролем строка получается совсем не такая как у клиента Л2. Поделитесь кто нибудь функцией RSA кодирования.

xkor
22.06.2009, 10:46
Yegor, а ты что по RSA шифруешь? логин(14 символов) + пароль(16 символов) + 4 нулевых байта?
RSA ключ дескремблируешь?

dmitry501
22.06.2009, 18:10
Yegor, а ты что по RSA шифруешь? логин(14 символов) + пароль(16 символов) + 4 нулевых байта?
RSA ключ дескремблируешь?

Ты бы вместо страшных слов дал ссылку на то что они значат :)

xkor
22.06.2009, 18:42
dmitry501, да блин, как дескремблировать RSA ключ тока на этом форуме написано минимум в 2х темах, одна из которых то ли прямо под этой то ли через одну...

Yegor
22.06.2009, 23:49
xkor, да я все эти темы перерыл все нашел. Дескремблирую ключ твоей функцией, скремблирую функцией из примера la2_client_emu. Вот как там пакет строится :

procedure RequestAuthLogin(login,password: string);
var
data: array[0..175] of byte;
crypt_text: string;
begin
FillChar(data,Length(data),0);
crypt_text:=RSAEncrypt(login,password,RepairKey(rs aKey2));
Move(crypt_text[1],data[1],128);
Move(GGAuthResponse,data[129],4);
data[149]:=8;
AddCheckSumm(Data,160);

SendPkt(Data,176);
end;

один нюанс в описании пакетов http://www.la2kings.ru/la2bot/packets.html в этом пакета видно что перед логином идут не все нули а есть один символ $20, может это не опечатка?

RequestAuthLogin (RSA)


Формат:
AA 00 // Длина
00 // Тип
[начало зашифрованного блока]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20
00 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
[конец зашифрованного блока]
XX XX XX XX // GGAuthResponse из GGAuth (http://www.la2kings.ru/la2bot/packets.html#GGAuth)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
08 00 00 00 00 00 00 00 00
XX XX XX XX // чексумма
00 00 00 00

xkor
23.06.2009, 01:21
Yegor, не опечатка, правда для чего нужен этот байтик непонятно...
ЗЫ кстати думаю уже можно сказать что именно в этом байтике заключалась защита шоков на интерлюдии, тока значение там было другое)

Yegor
23.06.2009, 01:24
xkor, дак а сейчас что ставить? это же RSA на 1 бит будет отличаться этот массив и совем другой будет сразу вид пакетов


Ураааааааааааа!!!!!!!!!!!!! Я зделал это, ну конечно благодаря вашей помощи.


Авторизация на Логин-сервере прошла успешно
RS disconnected


function RSAEncrypt(a,p,rsakey:string):string;
var
zSt: string;
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
//это то что добавил без этого никак
SetLength(zSt, 98);
FillChar(zSt[1], Length(zSt), 0);
zSt[95]:= #$20;


if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=zSt+a+p+#0#0#0#0;// ну и сюда вначале добавляю свою строку
sM:=rsakey;
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;

xkor
23.06.2009, 03:13
Yegor, гы, по началу возникло странное чувство откуда код такой похожий на тот что у меня, потом вспомнил что я его сам когда то где то списал)
ЗЫ счас то я не FGInt использую а GMP, пашет в 20 раз быстрее и не глючит (FGInt изредка бывает ошибается вроде)
вот как у меня было кста:
function RSAEncrypt(a, p: string; var rsakey): string;
var
sD,sR,sM:string;
m,e,d,r: TFGInt;
begin
RSAkeyDecode(rsakey);
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=#$20#0#0+a+p+#0#0#0#0;
SetLength(sM,128);
Move(rsakey,sM[1],128);
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;
ЗЫ нули перед тем неизвестным байтиком бессмысленны ибо это всё равно что написать 000000340, что будет равно 340

Yegor
23.06.2009, 03:25
да действительно до байта с $20 нули необязательно ставить, результат один и тот же. По алгоритму это просто одно большое 128 байтное число.
И что такое GMP? :confused:

Это просто другая библиотека для работы с этими числами? Я на их сайте http://gmplib.org/ нашел только исходники под С.

xkor
23.06.2009, 20:20
Yegor, угу, тока на С она, но нам нужны не сорцы а libgmp-3.dll
воть импорт всех функций которые для РСА могут потребоваться:
mpz_t = record
mp_alloc,
mp_size: Integer;
mp_d: Pointer;
end;

const
gmpdll = 'libgmp-3.dll';

procedure mpz_init(var Dest: mpz_t); cdecl;
external gmpdll name '__gmpz_init';
procedure mpz_init_set_ui(var Dest: mpz_t; Src: Cardinal); cdecl;
external gmpdll name '__gmpz_init_set_ui';
procedure mpz_clear(var Dest: mpz_t); cdecl;
external gmpdll name '__gmpz_clear';
procedure mpz_powm(var Dest: mpz_t; const Base, Exponent, Modulus: mpz_t); cdecl;
external gmpdll name '__gmpz_powm';
procedure mpz_powm_ui(var Dest: mpz_t; var Base: mpz_t; Exponent: Cardinal;
const Modulus: mpz_t); cdecl;
external gmpdll name '__gmpz_powm_ui';
function mpz_probab_prime_p(var Src: mpz_t; Repetitions: Integer): Integer; cdecl;
external gmpdll name '__gmpz_probab_prime_p';
procedure mpz_add_ui(var Dest: mpz_t; var Src1: mpz_t; Src2: Cardinal); cdecl;
external gmpdll name '__gmpz_add_ui';
procedure mpz_random(var Dest: mpz_t; MaxSize: Integer); cdecl;
external gmpdll name '__gmpz_random';
procedure mpz_nextprime(var Dest: mpz_t; var Src: mpz_t); cdecl;
external gmpdll name '__gmpz_nextprime';
procedure mpz_mul(var Dest: mpz_t; var Src1, Src2: mpz_t); cdecl;
external gmpdll name '__gmpz_mul';
procedure mpz_sub_ui(var Dest: mpz_t; var Src1: mpz_t; Src2: Cardinal); cdecl;
external gmpdll name '__gmpz_sub_ui';
function mpz_invert(var Dest: mpz_t; var Src, Modulus: mpz_t): Integer; cdecl;
external gmpdll name '__gmpz_invert';
function mpz_get_str(Dest: PAnsiChar; Base: Integer; var Src: mpz_t): PAnsiChar; cdecl;
external gmpdll name '__gmpz_get_str';
procedure mpz_mul_ui(var Dest: mpz_t; var Src1: mpz_t; Src2: Cardinal); cdecl;
external gmpdll name '__gmpz_mul_ui';
procedure mpz_mul_si(var Dest: mpz_t; var Src1: mpz_t; Src2: Integer); cdecl;
external gmpdll name '__gmpz_mul_si';
procedure mpz_mod(var Dest: mpz_t; var Src1,Src2: mpz_t); cdecl;
external gmpdll name '__gmpz_mod';
function mpz_cmp_si(var Src1: mpz_t; Src2: Integer): Integer; cdecl;
external gmpdll name '__gmpz_cmp_si';
procedure mpz_cdiv_q(var Dest: mpz_t; var Src1, Src2: mpz_t); cdecl;
external gmpdll name '__gmpz_cdiv_q';
function mpz_size(var Src1: mpz_t): Integer; cdecl;
external gmpdll name '__gmpz_size';

procedure mpz_import(var rop: mpz_t; count, order, size, endian,
nails: Cardinal; const op); cdecl;
external gmpdll name '__gmpz_import';
procedure mpz_export(var rop, count; order, size, endian,
nails: Cardinal; const op: mpz_t); cdecl;
external gmpdll name '__gmpz_export';

реализации функций шифрования/дешифрования и генерации ключей пока публиковать не буду...

Добавлено через 1 час 8 минут
libgmp-3.dll кстати можно взять из l2encdec, он тоже на ней работает

Yegor
24.06.2009, 12:01
xkor,ну для того чтобы реализовать алгоритм RSA нужно его знать, а так жедля использования библиотеки GMP нужно значть что делает ккждая ее функция. Я как понял она сделана в певую очередь для математичесских операций над большими числами. Сейчас я изучаю алгоритм RSA.

Добавлено через 9 часов 17 минут
Чисто из интереса решил проверить этот алгоритм сами знаете на каком сервере - логин сервер проходит успешно. Там наверно в отличие от шока сильно перекручена шифрация на гейм сервере.

Все полностью доделал процесс входа в мир. Вставил все в своего мини бота. Карта с игроками загружаеться через 0,5 секунды после нажатия кнопки "логин". Непойму почему стандартный волкер так долго чухаеться, хотя может специально ждет дабы не вызывать лишних подозрений.

Наконецто на шоке устранили проблемму зависания вылетевшего персонажав игре на неопределенное время. Как и раньше теперь при повторной попытке зайти игрока выбрасывает из игры.


Что за тишина на форуме, люди вы где? Я наверно создам у себя на машине текстовый файл и буду там сам с собой переписываться, разницы не будет никакой :D

guplen
09.07.2009, 01:59
Создавать новую тему не хочется, задам вопрос в этой.
После коннекта на логин сервер шока, мне приходит пакет Init.
Каждый раз при коннекте приходят разные пакеты, но у всех одинаковая длина, 186 байт.
Теперь вопрос: как мне понять, что я правильно снял блоуфиш и ксор шифрации?
Такой вопрос возник из-за того, что я только учусь программированию, и мог где-то ошибиться.
------
Вопрос временно снимается, у меня 3 байт не равен 00, а постоянно меняется... гдето закралась ошибка, скорей всего при ксоре где-то.

xkor
09.07.2009, 02:39
guplen, ксор до первого байта не доходит, первые 4 байта без xor)

guplen
09.07.2009, 03:10
эм... то есть как? Получается что после снятия блоуфиша ID уже должно быть равно 00?

Yegor
09.07.2009, 03:28
эм... то есть как? Получается что после снятия блоуфиша ID уже должно быть равно 00?

xor с 0 будет 0, аналогично с помощью ксора нельзя сделать 0 из другого числа. А раз так значит ошибка при использовании blowfish, возможно неверный начальный ключ.

xkor
09.07.2009, 03:57
xor с 0 будет 0, аналогично с помощью ксора нельзя сделать 0 из другого числа.че за бред
a xor 0 = a
0 xor a = a
a xor a = 0

PS но ошибка в blowfish ибо первые 4 байта в пакете просто не шифруются ксором)

Добавлено через 2 минуты
а ну марш все повторять булеву алгебру)

guplen
09.07.2009, 04:01
Так, все дело было в начальном ключе, я его неправильно переводил из строки в массив char.
Остается разобраться с XOR. Как понять что я его правильно применил?
Это пакет, вместе с размером, с которого снят блоуфиш. Он хотя бы правильный? Его размер 186 байт.

BA 00 //размер пакета 186 байт
00 //ИД пакета 00, все как надо
CD 98 03 D1 //ИД сессии
4E 69 2F D1 //ревизия протокола
F7 50 50 53 4C 35 1E EE 99 DD E6 79 D1 BA 00 60 !
C5 E4 0A FC C9 DC 21 B7 D5 59 ED 46 A8 5D B0 7F !
D0 AE AC AE 4C 14 9E 72 AD 0E B0 F0 EC 9A B6 D8 !
8A 50 DC E2 B9 B2 AB 75 84 D3 84 37 D5 C3 11 F2 !----->Это RSA ключ заскремблированный,
EA DC 8A D3 69 93 7C 1B C0 DA 5C 33 1F AD C5 45 !-----> который надо еще дешифровать
D2 57 FF 0A 97 68 E5 8A 2A AE 9F ED E3 51 B8 95 !
78 B3 FB 91 13 B5 DB C9 02 37 67 B2 F2 E1 FB 0D !
22 D0 BA 73 C5 DA CA 9D 74 D0 2C 3A 55 DA 51 67 !
4E E6 DE 2D 01 93 04 0C 3D 70 D9 85 E2 47 8F 1E //какие то GameGuard значения неизвестного назначения
2B 69 75 6B 90 2C 22 F6 C7 39 E2 ED D2 99 60 D7 //новый BF ключ для следующих пакетов
36 DC 37 1A 36 DC 37 1A 36 DC 37 00 00 00 00


Да, и забыл сказать - и Blowfish, и Xor-шифрация шифруют пакет начиная с третего байта! (т.е. первые два байта, означающие размер пакета - НЕ ШИФРУЮТСЯ НИКОГДА!!!)

Цитата отсюда: http://www.la2kings.ru/la2bot/packets.html
И как все таки снимать ксор с пакета?

xkor
09.07.2009, 04:42
И как все таки снимать ксор с пакета?функцией LoginXORDecrypt из поста 55 этой темы)
ей в качестве параметра надо весь пакет передавать включая размер в виде массива байт...

guplen
09.07.2009, 04:48
Единственная проблема в том, что я на с++ пишу все это. Щас попробую переписать на с++ ее.

Yegor
09.07.2009, 05:01
xkor, да что то я завтыкал с этим исключающим или :confused:.



guplen, вот вариант павета на шоке после декодирования блоуфишем и после xor, ревизия тут должна получиться 21 С6 00 00, что то разсксорил не так.

0000: BA 00 00 5F CA 03 00 21 є.._К..!
0008: C6 00 00 11 47 93 42 00 Ж...G“B.
0016: 98 7F B3 7D 2F 1D FE 8A ˜і}/юЉ
0024: 50 F3 A4 2A ED BD 79 8D Pу¤*нЅyЌ
0032: 92 F7 52 10 BA C1 DC 57 ’чR.єБЬW
0040: 23 B5 F5 56 DC 74 C2 56 #µхVЬtВV
0048: 09 73 1E 3A 08 AA DA F8 .s:.ЄЪш
0056: 1C C0 DB 7B DE 04 9C 24 АЫ{Ю.њ$
0064: 7C DB 32 A8 EB 5A 72 F7 |Ы2ЁлZrч
0072: 22 55 9D 13 CC 25 47 68 "Uќ.М%Gh
0080: CE 3B 2D 49 F3 4D A9 90 О;-IуM©ђ
0088: 8A F7 F6 3F 48 D8 FF BB Љчц?HШя»
0096: 7A 03 07 D7 14 52 35 11 z..Ч.R5.
0104: 28 06 9F D1 4C B1 41 91 (.џСL±A‘
0112: 8E 7E 04 47 59 2E 57 41 Ћ~.GY.WA
0120: C6 7D 3B 73 4A D4 BC 26 Ж};sJФј&
0128: 14 53 7C 65 53 7D 83 E5 .S|eS}ѓе
0136: 8F C3 E6 4E 95 DD 29 FC ЏГжN•Э)ь
0144: 9C C3 77 20 B6 AD 97 F7 њГw ¶*—ч
0152: E0 BD 07 F2 8B DC 90 B5 аЅ.т‹Ьђµ
0160: 56 0E 0F 13 EE 3F 7B 9F V...о?{џ
0168: 93 15 F3 00 00 00 00 00 “.у.....
0176: 00 00 00 00 00 00 00 00 ........
0184: 00 00 ..

guplen
09.07.2009, 15:06
[QUOTE=Yegor;33536]xkor, да что то я завтыкал с этим исключающим или :confused:.



guplen, вот вариант павета на шоке после декодирования блоуфишем и после xor, ревизия тут должна получиться 21 С6 00 00, что то разсксорил не так.

Тот пакет что я привел, он еще не проксорен. В данный момент пытаюсь понять как происходит ксор, чтобы написать функцию на с++.

----------

Что-то не могу понять как работает ксор шифрация. Может кто на "пальцах" объснить как проходит ксор пакета размером 186 байт ключом 4 байта. Смотрю примеры функций на разных языках, и везде по разному происходит это.

Я понимаю ксор так: первый байт пакета ксорится с первым байтом ключа, второй байт пакета - со вторым байтом ключа, 3-3, 4-4, 5-1, 6-2 и т.д.
Правильно ли это?

Добавлено через 10 часов 2 минуты
Поглядел несколько алгоритмов, вроде бы так и есть... или у протокола линейки он несколько изменен?

xkor
09.07.2009, 15:41
guplen, ты описал ксор шифрацию гейм сервера, на логин сервере первый пакет ксором дешифруется так:
procedure LoginXORDecrypt(var xpck: TFixPck);
var
i,k: Integer;
begin
i:=xpck.size-8; // узнаем номер первого байта ключа (186-8=178)
k:=PInteger(@xpck.ch[i])^; // записываем ключ в 4хбайтовую переменную
while i>=6 do begin // пока позиция больше или равна 6
PInteger(@xpck.ch[i])^:=PInteger(@xpck.ch[i])^ xor k; // ксорим очередные 4 байта на ключ
k:=k-PInteger(@xpck.ch[i])^; // вычитаем из ключа то что получилось
i:=i-4; // перемещаемся к предыдущим 4м байтам
end;
end; // усё
короче тут не по одному байту ксорим а по 4, хотя в яве наверно ксорят по одному ибо там сложности с приведением типов...

guplen
09.07.2009, 16:14
Тогда такой вопрос, возможно даже глупый:
Есть последовательность из 4 байтов, которые являются ключом. И чтобы мне эту последовательность записать в переменную типа int, надо эти 4 байта ключа перевести в число? Или как?

xkor
09.07.2009, 16:40
guplen, бля переменная int это и есть 4 байта, тупо их туда пишеш и всё, ты что с памятью работать не умеешь?

guplen
09.07.2009, 19:31
Про размеры знаю... лана, пашел книжки читать

Добавлено через 2 часа 43 минуты
Все получилось, всем спасибо... буду разбираться дальше.

Yegor
09.07.2009, 19:38
guplen, а дальше тебя ждет злой алгоритм RSA :D.

guplen
09.07.2009, 19:44
Для него вроде бы есть конкретные реализации на языке с++... а его, я так понимаю, никак не проверишь на правильность после дешифровки

Yegor
09.07.2009, 21:26
guplen, для его дешифрации нужен секретная часть ключа которую сервер не присылает. Я когда это делал то брал сохраненный лог пакетов между клиентом и сервером и зная логин и пароль пытался добиться такого же пакета.

Maxno
13.07.2009, 08:07
procedure LS_init(buff: array of byte; Len: integer);
begin
ToLog('********* LS_init ************');
ToLog('');
if Len<8 then exit;
Move(buff[3],SessionID,4);
if Len>=155 then begin
SetLength(RSA_key,128);
Move(buff[11],RSA_key[1],128);
ToLog('RSA Key changed');
end;
if Len>=171 then begin
SetLength(bf_key,16);
Move(buff[155],bf_key[1],16);
bf.Init(bf_key);
ToLog('BlowFish key changed');
end;
//sending AuthGG packet
AuthGameGuard;
end;

и еще, Yegor, ты на каком серве прошёл авторизацию? не подкинешь свои сорцы?:drinks: буду благодарен ;)

Yegor
13.07.2009, 13:47
Maxno, сорцы на паскале, библиотека использована общедоступная, пиши в личку аську я тебе пришлю пример.

Maxno
16.07.2009, 09:51
Народ а передача между GameServer и Client - шифруется как то?

xkor
16.07.2009, 13:49
Maxno, угадай с 3х раз...

Maxno
16.07.2009, 16:43
Да, но первый ведь не шифруется :)

xkor
16.07.2009, 17:33
Maxno, ну первый пакет от клиента - проверка версии, второй пакет от сервера - инициализация ключа шифрования, а дальше всё зашифровано)

Maxno
16.07.2009, 20:32
ну вот ето мне и нада было знать :)

Добавлено через 1 час 40 минут
Люди, скажите чему должно быть равно значение - xpck: TFixPck в процедуре -procedure LoginXORDecrypt(var xpck: TFixPck);? я запарился уже... сокеты -сила, но блин сначала трудно :(....


кстати ниукого нету jcl и vjcl для Delphi 2007 CodeGear?

xkor
17.07.2009, 01:05
кстати ниукого нету jcl и vjcl для Delphi 2007 CodeGear?на их офф сайте есть)

Добавлено через 12 минут
PFixPck = ^TFixPck;
TFixPck = packed record case Integer of
0: (ch: array[Word] of Char);
1: (bt: array[Word] of Byte);
2: (size: Word;
id: Byte;
dbt: array[0..65532] of Byte);
end;

Maxno
17.07.2009, 11:47
на их офф сайте есть) ага :) просто их сайт вчера так лагал, что я даж зарегатцо не смогг :tease:

xkor
18.07.2009, 00:52
Maxno, ээ, зарегаца где?, там качать всё можно без всяких регистраций, я собсно хз где там вообще регистрация и есть ли она)

Be3geBJIa3
23.07.2009, 15:47
Может и мне поможете,
Нужно логин С4 переделать для бота Walker 10.9.3
C сервера приходит Init - 0B 00 00 84 13 E4 2E 5A 78 00 00
Нужно переделать на 186 init пакет для бота.
Подскажите где брать эту пару RSA (публичный,секретный) и как его правильно привести к нужному значению?

В RSA используется p,q,n,e,d. Есть какое-то число B=1024, Е=65537, N передается в пакете init, так понимаю выбирается произвольно длиной 128 байт, вот как получить секретную часть ключа d и как это применить?

Yegor
23.07.2009, 20:14
Be3geBJIa3, секретную часть ключа знает только сервер, получить никак (на то она и секретная). Если логин будет идти через твой патчер скорми волкеру свои ключи (у тебя будет и секретный и публичный ключ, то есть сможешь вытащить логин и пароль в последующих пакетах и сформировать свой пакет серверу).

Be3geBJIa3
23.07.2009, 21:49
Yegor, я об этом и спрашиваю, логин сервер с4, никакого там рса нет, а бот требует, если кто не знает то 10.9.3 вобще не реагирует на с4. Поэтому мне нужно сделать все самому и при всем еще с сервером общаться.
В википедия я прочел про RSA, но для меня это пока темный лес, хотелось бы хотябы направление в каком копать, тока не исходники ява сервера, это еще темнее.

xkor
23.07.2009, 22:06
Be3geBJIa3, вообще странно, у меня 10.9.1 прекрасно по старому логин протоколу логиниться через мой корректор, единственное из за неполного кряка он ожидает все пакеты от логина закодированные под BFом еще и LoginXORом, и сам XORом шифрует
может у тябя так же?)

Be3geBJIa3
24.07.2009, 10:27
xkor, может я немного не правильно выражаю мысли, меня не на одном форуме не могут понять что мне нужно.
Мне нужно реализовать подключение к логин серверу С4 (без RAS) волкера 10.9.3 (не 10.9.1), так сказать, все операции сделать на делфи в своей длл без стороних програм. Запустил лоадер, загрузился волкер и все. Все это для автоматизащии запуска. Много програм приходится контролировать, а так запустил програму автостарта 1-100 ботов и все. Многим же не нужны расширенные скрипты, хватает функционала волкера, а как это сделать и где взять эти ключи RSA я никак не могу понять, просто никогда не занимался криптографией.

Тут la2_client_emu, есть пример, да и на форуме тоже, как получив от сервера пакет init, разобрать его, но мне нужно еще и самому создать этот замыслованый init (186) пакет и потом еще расшифровать чтобы получить логин и пароль.

Не хочется придумывать своего бота, хватает и волкера, просто сервер _BsFG.ru (абисс) и там постояно что-то меняется, а так своя програма, сразу, что нужно исправил и все.

Yegor
24.07.2009, 13:23
Be3geBJIa3, ты пароль хочешь именно расшифровать из отправленного тебе волкером пакета? Это не так просто. Я бы эти данные просто взял напрямую из бота. ТОгда бы не пришлось мудрит с секретным ключом, который ещё надо правильно составить. Шлешь ворлкеру первыйпакет Init, где вместо RSA ключа что угодно, все равно расшифровывать не будем.

dmitry501
24.07.2009, 13:27
Краткая инструкция и пояснения, почему это невозможно, хотя и возможно с извращениями
1. Нужно расшифровать пакет от IL бота RequestAuthLogin
Выглядит он так

LA2: "RequestAuthLogin" size: 178 prot: undefined
Addr: Size: Type: Description: Value:
0000 2 word psize 178 | $00B2
0002 1 byte ID 0 | $00
0003 14 AsciiString Login "h1a{?Áùû-Š.´,"
0011 16 AsciiString Password "œâ¢Õ?¸ÆFÖÅ.Œ’iý"
0021 1 byte c 5 | $05
0022 4 integer d -48383817 | $FD1DB8B7
0026 4 integer d 627490541 | $2566BEED
002A 4 integer chkSum1 -702488345 | $D620E0E7
002E 4 integer chkSum2 1265086685 | $4B67B0DD
2. Послать его на сервер уже в С4 формате

LA2: "RequestAuthLogin" size: 50 prot: 30810 $785A
Addr: Size: Type: Description: Value:
0000 2 word psize 50 | $0032
0002 1 byte ID 0 | $00
0003 14 AsciiString Login "login"
0011 16 AsciiString Password "pass"
0021 1 byte c 56 | $38 '8'
0022 4 integer d 154 | $0000009A
0026 4 integer d 0 | $00000000
002A 4 integer chkSum1 1615025842 | $604356B2
002E 4 integer chkSum2 0 | $00000000

Теперь о том, почему это невозможно.
Чтобы расшифровать логин и пароль нужно знать закрытый ключ RSA, который знает только сервер. Не зная его нормальный логи и пароль можно получить лишь перебором, используя открытый ключ из walker-а

Хотя я вполне допускаю, что этот закрытый ключ сервера не знаю только я, и его можно добыть например из исходников java-сервера.
Мне он неизвестен, поэтому и я пишу "невозможно". Если кто-нибудь знает его или другую информацию о том, как получить логин и пароль из зашифрованного RSA пакета бота - пишите, тогда dll - перекодировщик создать несложно.

dmitry501
24.07.2009, 13:27
И тут мы как - раз подходим к методу с "извратом".
Мы ведь знаем и логин и пароль! Это ведь наш бот!
Т.е. можно не получать логин и пароль из пакета бота, а например из внешнего .ini файла. Тогда достаточно заранее наколотить в него все логины и пароли наших ботов и мы получим работоспособный, хотя и не совсем безопасный (пароли все в открытом виде) способ.

Остальный вопросы преобразования тривиальны и не интересны.

Yegor
24.07.2009, 13:35
dmitry501, на самом деле секретный ключ на сервере генерируется для каждого подключения отдельно, поэтому мы знать его не можем. А для волкера мы как бы и есть сервер, тоесть мы сами генерируем секретный ключ, отправляем в первом пакете Init обычный, а потом получив от волкера пакет RequestAuthLogin расшифровываем и пересылаем дальше уже в формате ц4. Проблемма лишь в том что это сделать не просто. Хотя думаю есть библиотеки которые позволяют сделать это без особых утруждений.

xkor
24.07.2009, 16:04
секретный ключ на сервере генерируется для каждого подключения отдельногенерация ключа довольно ресурсоёмкий процесс так что сервак генерит несколько ключей при его запуске а при подключении уже просто выбиает один из них и с ним работает)
Мне нужно реализовать подключение к логин серверу С4 (без RAS) волкера 10.9.3 (не 10.9.1)ну я про 10.9.1 рассказывал к тому что он скорее всего по авторизации ничем от 10.9.3 не отличается, у тебя этот 10.9.3 верифицируется как?, официально или какимнить видом кряка?, если кряком то 99,9% что тебе подходит метод которым я работаю с 10.9.1 (и с 10.8.6 кстати так же было)

Be3geBJIa3
24.07.2009, 16:35
Да мне всегото нужна рабочая пара RSA ключей для ла2, 2 функции (скрамбле, дескрамбле), и 2 функции:
Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String);
Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String);
из пакета FGInt.

Только где взять ключи, 1 проблема,
deScrambleRSAKey есть, где взять ScrambleRSAKey если такая есть,
какие аргументы используют RSAEncrypt, RSADecrypt.
Вродебы все.

xkor, с кряком, конечно подойдет, только как это реализовать? просто у меня вылетел тот период когда все мучали 10.8.6, я использую 10.7.4, но щас переходят на СТ2.2 и слишком много пакетов переделывать для гейм сервера, ведь проще приучить 10.9.3 к логину С4, тем более если многие уже это сделали с 10.8.6.

Если подойти с другой стороны.

Задача такая написать на делфи простейший логин-сервер для тестирования бота, типа walker 10.9.3 (верификация отломана), т.е. для СТ2.2.
Какие для этого нужны функции и порядок для создания init пакета. Пару RSA ключей взять постояную и заведомо известную.

xkor
24.07.2009, 21:43
Procedure RSAEncrypt(P : String; Var exp, modb : TFGInt; Var E : String);
Procedure RSADecrypt(E : String; Var exp, modb, d_p, d_q, p, q : TFGInt; Var D : String);
из пакета FGInt.готовые RSAEncrypt и RSADecrypt из пакета FGInt работают не так как надо для линейки, но гдет на этом форуме постилась RSAEncrypt на основе FGInt работающая правильно, а поскольку в RSA и зашифровка и дешифрока это вобщем то один и тот же алгоритм (если не рассматривать их оптимизированные версии) то и в качестве RSADecrypt её юзать можно, надо только вместо открытого ключа подставлять закрытый)
deScrambleRSAKey есть, где взять ScrambleRSAKey если такая естьхех, ScrambleRSAKey это deScrambleRSAKey в обратном порядке, если не можешь переписать deScrambleRSAKey в ScrambleRSAKey то дальше тебе идти не стоит)
Задача такая написать на делфи простейший логин-сервер для тестирования бота, типа walker 10.9.3 (верификация отломана), т.е. для СТ2.2.
Какие для этого нужны функции и порядок для создания init пакета. Пару RSA ключей взять постояную и заведомо известную.голин сервер (для СТ1-СТ2.3 ибо авторизация у них одинаковая) на дельфи у меня написан (правда пока до стадии когда он должен выдать список серверов, но авторизация по RSA полностью готова) так что помочь советом могу, правда у меня RSA построено на библиотеке libgmp-3.dll (ибо в 20 раз быстрее FGInt) и ключи у меня не постоянные а при старте генерятся 10 новых как и положено.

Be3geBJIa3
25.07.2009, 12:39
xkor, вот ты пишешь что у тебя по 10 ключей генерится каждый раз, а я уже какой день прошу всего 1-ну рабочую пару RSA ключей. В инете можно найти готовые или генератор, но мне нужны для ла2, небольшая но есть разница.
xkor, если тебя не затруднит, дай пожалуйста в пм всего 1 рабочую пару для ла2.

xkor
25.07.2009, 17:51
Be3geBJIa3, зачем же в ПМ, чего в этом секретного, вот лови:
Public: 65537
Private: 75827556252429569206429305205270821606264223799087 52381910705950070334735560292334593794066616085030 70414129295371522610749439915326514062579521313612 37504618942129346038375997183108947428183572534428 01325482875503123628608572472135307672677104600014 56633091612949350154767360996381796453159422636430 2807993
Module: 36003119279254340919233191155819994462144015323631 08779636904555891904133626131121729142083197988586 95397600460992273254659755442517958067950982310586 20765559861865193839298972977890750546282107564404 12981786522769558694223846132879431073562031333845 00748037521085932758932558205060546167314940714992 79307243
ЗЫ это в десятичной системе счисления, у FGInt есть функции для преобразования строки в такой системе во внутренний формат чисел...
ЗЗЫ на всякий случай уточню что от сервера приходит заскрембленый Module, а Public всегда равен 65537

ErgoZ
12.02.2012, 08:15
Доброго времени суток. На яве пытаюсь подрубится к интерлюду. Получаю такой пакет:

02-12 03:08:53.001: I/System.out(1100): BA00EA7497F83ABA831B54950774A27B2D4275EEC85548D6A8 7FEFF436E6177FC581B98398CCB2CC66CBA777691E7139F87E 7763F60B5A29014479921B11944BC9DB0D7D4ED7C9756991AF 8C46C2DC67DDEB6362BD501274F330FB843891CE06FD7B3F32 C758758C061D3844DE5FD233199C2C96709565C01919269E1F BC82DFFE8FF18A9ECDA3673FEF8607F88820922284636C0A3B 51B203DD583AF745954350DB96836EBF7D32606B1346F9CE60 C1F47119FA5D8D87852E77


После этого, я так понимаю, пытаюсь делать декод по блоуфишу от интерлюда (6B60CB5B82CE90B1CC2B6C556C6C6C6C) (кстати норм декодера на яву не нашёл, и не уверен что фц-ия правильно работает, поэтому сюда и пишу). В результате я получаю в декоде примерно такой пакет:

02-12 03:08:53.072: I/System.out(1100): 2EB993A28A2CD0CA39CFA3D31931AC502A424CC5173B6DFCC9 DAF0A76DA01B1794F32287AD99AC7D1D0856E95BE4245C72B9 612A078FEA4D9D6F2C2BAB3251641C379D9863D1D2111F8EA0 8B0F30C6CF983A38ED12D777681E565ADFCFFE805041FEECD2 089222EF1C8392174A250C35FCF17AB4C68A368934F724763D 7FCB9A2D4EA981A6BC1779438687412277FFB49FD893B6E6B2 F665B2040BCE8ED38F51B04996EB5CFA13274D62C62F4CA347 DEB1D1AF407B2428BFF662

Какие мои дальнейшие действия? Ксорить? а то я уже запутался :) да и на яву от делфей сильно отличается) на делфях проще, но нужда заставляет на яве писать)

И я так понимаю что по блоуфишу я допустил ошибку, что включил в декод сюда ba00?

Shadrincev
24.04.2012, 22:06
Приветствую всех, ребят помогите разобраться.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;

type
TForm1 = class(TForm)
log: TMemo;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Client: TClientSocket;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TByteArray = array of byte;

var
Form1: TForm1;

implementation

{$R *.dfm}

function ByteArrayToHexString(const InArr: array of Byte): string;
var
tmpStrList: TStringList;
i: Integer;
begin
tmpStrList := TStringList.Create;
try
for I := Low(InArr) to High(InArr) do
begin
tmpStrList.Append(IntToHex(InArr[i], 2));
end;
tmpStrList.Delimiter := ' ';
Result := tmpStrList.DelimitedText;
finally
tmpStrList.Free;
end;
end;

procedure ToLog(log: string);
begin
form1.log.Lines.Add(log);
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
{Если соединение уже установлено - прерываем его.}
if Client.Active then
begin
Client.Active:=False;
Exit; {...и выходим из обработчика}
end;
{Присваиваем свойствам Address нужные значения}
Client.Address:=Edit1.Text;
{Пытаемся открыть сокет и установить соединение}
Client.Active:=True;
end;

procedure TForm1.Button2Click(Sender : TObject);
begin
Client.Active:=False;
end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
len : integer;
Buffer : TByteArray;
begin
ToLog('~~~ Подключились ~~~~~~~~~~~~~~~~');
ToLog('размер пакета ' + IntToStr(Socket.ReceiveLength)+' bytes');
setLength(Buffer, Socket.ReceiveLength);
len := Socket.ReceiveBuf(Buffer[0], Socket.ReceiveLength);
ToLog('Прочитано в буфере: ' + IntToStr(len) + ' bytes');
ToLog('Ответ сервера: ' + ByteArrayToHexString(Buffer));

end;

end.
:confused: Собственно, соединение устанавливаю, ответ получаю, но не могу понять, что делать дальше, и как из полученного первого пакета получить ключ (не пинать я самоучка). Прошу разжуйте пожалуйста, книги читаю гугл и яндекс мучаю, но немогу разобраться...:cray:

guplen
25.04.2012, 00:22
Читай статью с самого начала))

Shadrincev
25.04.2012, 15:42
Читай статью с самого начала))

Читал на раза 4-е.:p
Собственно, загвоздка в том, что пакеты постоянно преобразовывать через function ByteArrayToHexString? и на основе преобразованного пакета уже if else? или же напрямую через Buffer? :confused: :sorry:

Yegor
25.04.2012, 18:39
ByteArrayToHexString - это нужно только для вывода на экран/лог, для работы с пакетом это преобразование делать не нужно, работай на прямую с буфером.

Silent
26.04.2012, 10:46
Shadrincev, посмотри готовые примеры la2_client_emu и тут http://coderx.ru/showthread.php?t=9575

Shadrincev
30.04.2012, 08:19
Shadrincev, посмотри готовые примеры la2_client_emu и тут http://coderx.ru/showthread.php?t=9575

смотрел, в la2_client_emu я не увидел прием первого пакета, там ключ уже прописан вроде как. А xBot2010 не смог собрать знаний нехватает...


ByteArrayToHexString - это нужно только для вывода на экран/лог, для работы с пакетом это преобразование делать не нужно, работай на прямую с буфером.
:unknw: не могу понять как на прямую....

supernewbie
30.04.2012, 12:01
Shadrincev, Buffer[index] епт

Demion
30.04.2012, 12:30
Shadrincev, может быть это не мое дело, но не советую писать эмулятор клиента, если вы не имеете представления о массиве байтов и как с ним работать (основы основ)

Yegor
01.05.2012, 10:22
Demion, ничего это хороший повод изучить и закрепить изученное. Я сам так делаю обычно. Ставлю цель и начинаю изучать материал для достижения цели. Написание бота очень хорошая практика для начинающего программиста.