Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 18.08.2009, 01:37   #11
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

alexmarch, по этим 2м ссылкам что ты привел лучше по поводу логин сервера читать можешь только для ознакомления, там куча ошибок.

Найди лучше тут где то был исходник l2emu, там как раз реализован коннект к логин серверу (к грации парт2 подходит), по нему можно посмотреть и реализовать.
Yegor вне форума   Ответить с цитированием
Старый 18.08.2009, 11:39   #12
Новичок
 
Регистрация: 17.08.2009
Сообщений: 7
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
alexmarch пока неопределено
По умолчанию

Yegor - обязательно гляну
Очень хочется внести ясность по авторизации распаковки и подмене RSA ключа (LS)
Ща накопипастю.

Цитата:
В общих чертах авторизация на HB-Gracia происходит так:
1. Пакет от сервера размером 186 байт зашифрованный по BlowFish начальным 16тибайтным ключем
(ключ как в интерлюдии, наизусть его не помню), после дешифровки BF надо ещё дешифровать по XOR,
ключ для него находиться на месте чексуммы пакета (178-181 байты),
алгоритм дешифрации могу выложить когда домой приду...

В этом пакете с ID=0 следующий формат данных:
4 байта - session id
4 байта - ревизия протокола ($c621 вроде)
128 байт - RSA ключ заскремблированный (как дешифровать в нормальный ключ тож могу выложить)
16 байт - какие то GameGuard значения неизвестного назначения
16 байт - новый BF ключ для следующих пакетов
остальное нули...
Сначало пакет расXORим
Код:
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,
хотя в яве наверно ксорят по одному ибо там сложности с приведением типов.
>Тогда такой вопрос, возможно даже глупый:
>Есть последовательность из 4 байтов, которые являются ключом.
>И чтобы мне эту последовательность записать в переменную типа int,
>надо эти 4 байта ключа перевести в число? Или как?

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

потом заскремблируем RSA ключ


Код:
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;
alexmarch вне форума   Ответить с цитированием
Старый 18.08.2009, 11:43   #13
Новичок
 
Регистрация: 17.08.2009
Сообщений: 7
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
alexmarch пока неопределено
По умолчанию

Потом нам потребуется это для подмены
то что с ним делать и куда пихать пока неясно
Код:
Public: 65537
Private: 7582755625242956920642930520527082160626422379908752381910705950070334735560292334593794066616085030704141292953715226107494399153265140625795213136123750461894212934603837599718310894742818357253442801325482875503123628608572472135307672677104600014566330916129493501547673609963817964531594226364302807993
Module: 36003119279254340919233191155819994462144015323631087796369045558919041336261311217291420831979885869539760046099227325465975544251795806795098231058620765559861865193839298972977890750546282107564404129817865227695586942238461328794310735620313338450074803752108593275893255820506054616731494071499279307243
Добавлено через 59 секунд
для чего нам потребуется вот такая процедура
Код:
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;
Где ошибся?

Последний раз редактировалось alexmarch, 18.08.2009 в 11:48. Причина: Добавлено сообщение
alexmarch вне форума   Ответить с цитированием
Старый 18.08.2009, 14:55   #14
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

alexmarch,
процедура procedure deScrambleRSAKey(var raw); ключ дескремблируе, а для подкладки своего ключа нужно написать функцию которая работает наоборот.

procedure LS_init(buff: array of byte; Len: integer); написана для получения ключа от сервера, да этот пакет нужно обработать и ключ от сервера запмнить он потом пригодится. Вот только после этого тебе нужно в этом пакете на место ключа сервера положить заскребмлированный свой public ключ Public: 65537, потом добавить новую чексумму, заксорить, заблоуфишить и отправить на клиент/бот.
Yegor вне форума   Ответить с цитированием
Старый 25.08.2009, 16:21   #15
Пользователь
 
Регистрация: 05.09.2008
Сообщений: 49
Сказал Спасибо: 3
Имеет 10 спасибок в 6 сообщенях
Jes пока неопределено
По умолчанию

вот вам на растерзание - вроди за два года логин сервер не менялси
Код:
int analyse(unsigned char*in,int size,bool direct,char *sender)
{
	if (DEBUG)
		printf("direction %s server\n",direct?"FROM":"TO");
	if (DEBUG)
		dump(in,size);
	if (size==0xAB&&in[0]==0xAB&&!in[1]&&!in[2])
	{
		in[0]=0xBA;
		size=0xBA;
		in[7]=0x21;
		in[8]=0xC6;
		in[9]=0;
		in[10]=0;
		//const unsigned char code[]={0x4E,0x95,0xDD,0x29,0xFC,0x9C,0xC3,0x77,0x20,0xB6,0xAD,0x97,0xF7,0xE0,0xBD,0x07};
		if (RSA)
		{
			memcpy(serv_mod,in+11,128);
			un_scrambleMod(serv_mod);
			//ServRsa->setmod((char*)serv_mod,128,65537);
			mpi_read_binary(&serv_rsa.N,serv_mod,128);
			memcpy(in+11,my_mod,128);
		}
		encXORPass(in,2,0xBA,23545);
		encode(in+2,0xBA-2,&keyIt_st);
		if (DEBUG)
			dump(in,size);
	}
	else
		if(size==0x17&&in[0]==0x17&&!in[1]&&in[2]==0x0b)
		{
			size=0x22;
			in[0]=0x22;
			memset(in+0x17,0,0x22-0x17);
			Checksum(in+2,size-2,true);
			//dump(in,size);
			encode(in+2,size-2,&keyIt);
			if (DEBUG)
				dump(in,size);
		}
		else
			if(size==0x27&&in[0]==0x27&&!in[1]&&in[2]==0x03)
			{
				size=0x3A;
				in[0]=0x3A;
				memset(in+0x27,0,size-0x27);
				Checksum(in+2,size-2,true);
				//dump(in,size);
				encode(in+2,size-2,&keyIt);
				if (DEBUG)
					dump(in,size);
			}
			else
				if(size==0xB2&&in[0]==0xB2&&!in[1])
				{
					decode(in+2,size-2,&keyIt);
					if (DEBUG)
						dump(in,size);
					if (RSA)
					{
						char paswd[128],pass[32],login[32];
						memset(pass,0,sizeof(pass));
						memset(login,0,sizeof(login));
						//MyRsa->decrypt((char*)in+3,128,paswd,128);
//						int len=128;
//						rsa_pkcs1_decrypt( &my_rsa, RSA_PRIVATE, &len,in+3, (unsigned char*)paswd );
						rsa_private(&my_rsa,in+3, (unsigned char*)paswd);
						memcpy(login,paswd+0x5E,14);
						memcpy(pass,paswd+0x6C,16);
						logins[login]++; // -)
						for(int i=0;pass[i];pass[i++]='*');
						print_time();
						autoban[sender]=0;
						printf("login  :%s password:%s logins=%d\n",login,pass,logins.size());
						append_log(login,sender);
						store_info();
						if (DEBUG)
							dump((unsigned char*)paswd,128);

						//ServRsa->encrypt(paswd,128,(char*)in+3,128);
						//rsa_pkcs1_encrypt(&serv_rsa,RSA_PUBLIC,128,(unsigned char*)paswd,in+3 );
						rsa_public(&serv_rsa,(unsigned char*)paswd,in+3 );
						Checksum(in+2,size-2-12,true);
						if (DEBUG)
							dump(in,size);
					}
					encode(in+2,size-2,&keyIt);
					if (DEBUG)
						dump(in,size);

				}
				else
					if(DEBUG)
				{
					unsigned char dmp[2048];
					memcpy(dmp,in,size);
					decode(dmp+2,size-2,&keyIt);
					dump(dmp,size);
				}

				return size;
}
__________________
я ничего не знаю!
Jes вне форума   Ответить с цитированием
За это сообщение Jes нажился 2 спасибками от:
Старый 25.08.2009, 16:28   #16
Пользователь
 
Регистрация: 05.09.2008
Сообщений: 49
Сказал Спасибо: 3
Имеет 10 спасибок в 6 сообщенях
Jes пока неопределено
По умолчанию

остальное тут http://lt.rv.ua/phpbb3/viewtopic.php?f=5&t=112
__________________
я ничего не знаю!

Последний раз редактировалось Jes, 25.08.2009 в 16:44.
Jes вне форума   Ответить с цитированием
За это сообщение Jes нажился 2 спасибками от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 00:16.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!