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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 16.06.2009, 09:27   #1
Новичок
 
Регистрация: 06.06.2009
Сообщений: 28
Сказал Спасибо: 8
Имеет 5 спасибок в 5 сообщенях
Asmoday пока неопределено
По умолчанию Шифрование по алгоритму XOR

Доброго всем времени суток!
Начал было писать программку эмулирующую вход на сервер, но столкнулся с проблемой. Авторизацию на логин сервере прохожу вполне успежно, получаю ключи СессионИД и т.д. Загвозка заключается вот, в чем, не могу пройти логин на гейм сервере.
Часть кода взял из л2пакетхака. Пробую следующие:

PHP код:
const
  
Login='testtest';

var
  
XorOutXorInTCodingClass;
  
Data:string;

....
  
XorIn:=L2Xor.Create;
  
XorOut:=L2Xor.Create;
  
XorIn.InitKey(Key,True);
  
XorOut.InitKey(Key,True);
....
  
Data:='08'// RequestAuthLogin
  
Data:=Data+StringToHex(Login,'00')+'0000'//Добавляем имя акка
  
Data:=Data+IntToHex(SessionKey2_2,8); //SessionKey2_2
  
Data:=Data+IntToHex(SessionKey2_1,8); //SessionKey2_1
  
Data:=Data+IntToHex(SessionKey1_2,8); //SessionKey1_2
  
Data:=Data+IntToHex(SessionKey1_1,8); //SessionKey1_1
  
Data:=Data+'01000000'// Хм, что не знаю, но в пакете не изменно.
  
Data:=HexToStr(Data);

  
XorOut.EncryptGP(Data[1],Length(Data)); 
Сервер (и ява и птс) пишут что неверный сессион ид.
Подскажите где трабла, в чем ошибка?

И еще, я так понял, что при приеме/отправке любого пакета, ключ шифрования меняется, соответсвенно 2 вопроса:
а) Как меняется (+ или - к ключу от длинны пакета, учитываются ли те 2 байта что указывают на длунну самого пакета)
б) Учитывается ли 1 исходящий пакет ProtocolVervion и 1 входящий KeyInit при установке ключа.

Если можно немного коментов про смену ключа во время работы. Заранее благодарю.

Последний раз редактировалось Asmoday, 16.06.2009 в 09:41. Причина: Поэксперементировал, помогло :)
Asmoday вне форума   Ответить с цитированием
Старый 16.06.2009, 11:53   #2
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

все пакеты вплоть(включая) до пакета иниткей идущего от гс не шифруются.
иниткей как раз и задает начальный ключ. XorIn.InitKey(Key,True);
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 16.06.2009, 17:36   #3
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от Asmoday Посмотреть сообщение
Data:=Data+StringToHex(Login,'00')+'0000'; //Добавляем имя акка
оригинальное решение

Добавлено через 4 минуты
Цитата:
Сообщение от Asmoday Посмотреть сообщение
Data:=Data+IntToHex(SessionKey2_2,8); //SessionKey2_2
Data:=Data+IntToHex(SessionKey2_1,8); //SessionKey2_1
Data:=Data+IntToHex(SessionKey1_2,8); //SessionKey1_2
Data:=Data+IntToHex(SessionKey1_1,8); //SessionKey1_1
а вот это скорее всего и есть ошибка, ибо байты при этом разворачиваются, то есть если например SessionKey1_1 = 9, то в пакет он запишется как 00000009, а должен как 09000000
__________________
Я здесь практически не появляюсь!, Skype - ikskor

Последний раз редактировалось xkor, 16.06.2009 в 17:36. Причина: Добавлено сообщение
xkor вне форума   Ответить с цитированием
Старый 17.06.2009, 01:45   #4
Новичок
 
Регистрация: 21.01.2009
Сообщений: 5
Сказал Спасибо: 3
Имеет 0 спасибок в 0 сообщенях
Dralka пока неопределено
По умолчанию

может ктонить описать процесс XOR шифрации ?
тоже пишу софтину ...
Dralka вне форума   Ответить с цитированием
Старый 17.06.2009, 02:30   #5
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Dralka, исходники пакетхака глянуть сложно?
http://l2phx.pp.ru/wsvn/filedetails....%2Fuencdec.pas - тут вот всё есть...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился спасибкой от:
Старый 17.06.2009, 21:48   #6
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 60
Сказал Спасибо: 3
Имеет 107 спасибок в 21 сообщенях
GoldFinch пока неопределено
По умолчанию

вот так выглядит алгоритм шифрования абисса:

Код:
// код C++

#pragma pack(push,2)
	struct packetbuf
	{
		unsigned short length;
		char data[USHRT_MAX+1-2];
	};
#pragma pack(pop)

class XorcryptManipulator
{
public:
	XorcryptManipulator(){}
	void Initialize(int key_lo,int key_hi);
	opacketstream& operator() ( opacketstream& pout );
	ipacketstream& operator() ( ipacketstream& pin );
private:
	__int64 key_in;  //key for input stream
	__int64 key_out; //key for output stream
};


opacketstream& bot::XorcryptManipulator::operator()( opacketstream& pout )
{
	packetbuf& buf=pout.buffer();	
	union
	{
		__int64 key;
		char bytes[8];
	} k2;
	k2.key=key_out;
	
	char k;
	buf.data[0] ^= k2.bytes[0];
	for (int i=1;i<buf.length;++i,buf.data[i-1]^=k)
		k=k2.bytes[i&7] ^ buf.data[i-1];

	key_out += buf.length;
	return pout;
}

ipacketstream& bot::XorcryptManipulator::operator()( ipacketstream& pin )
{
	packetbuf& buf=pin.buffer();	
	union
	{
		__int64 key;
		char bytes[8];
	} k2;
	k2.key=key_in;

	char k=buf.data[0];
	buf.data[0] ^= k2.bytes[0];
	for(int i=1;i<buf.length;++i)
	{
		char t=buf.data[i];
		buf.data[i]^=k^k2.bytes[i&7];
		k=t;
	}

	key_in += buf.length;
	return pin;
}

void bot::XorcryptManipulator::Initialize( int key_lo,int key_hi )
{
	union
	{
		__int64 key;
		struct
		{
			int lo;
			int hi;
		};
	} k;
	k.lo=key_lo;
	k.hi=key_hi;
	key_in=k.key;
	key_out=k.key;
}
GoldFinch вне форума   Ответить с цитированием
За это сообщение GoldFinch нажился спасибкой от:
Старый 03.09.2009, 22:31   #7
Новичок
 
Регистрация: 03.09.2009
Сообщений: 5
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
roma_ пока неопределено
По умолчанию

Сразу прошу прощение за навязчивость но попрошу описать алгоритм смены XOR ключа, точнее алгоритм получения начального xor ключа.
Если вдруг кто нить решится то БОЛЬШАЯ просьба описать в виде операций, на примере.

Исходники смотрел но разобраться в паскале не смог учил си

Добавлено через 10 минут
уточнение - клиент С4

Последний раз редактировалось roma_, 03.09.2009 в 22:31. Причина: Добавлено сообщение
roma_ вне форума   Ответить с цитированием
Старый 03.09.2009, 22:54   #8
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Цитата:
алгоритм получения начального xor ключа
Цитата:
уточнение - клиент С4
часть ключа - статическая (4 байта), а часть - приходит от сервера с пакетом 2Eh (тоже 4 байта)
склеиваем и получаем ключ котором следует ксорить/дексорить данные идущие после иниткея.
по ссылке которую выше давал xkor смотреть
L2Xor.InitKey и концовку TencDec.ProcessRecivedPacket
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 2 спасибками от:
Старый 04.09.2009, 01:10   #9
Новичок
 
Регистрация: 03.09.2009
Сообщений: 5
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
roma_ пока неопределено
По умолчанию

Еще раз спасибо alexteam за ответ.

Алгоритм примерно понял, помогите разобраться каким образом L2PacketHack получает НАЧАЛЬНЫЙ XOR ключ для дешифровки первого пакета?

пакет с ключем KeyInit
0001 03 B1 93 B6 01 00 00 00 01 00 00 00

следующий пакет (еще не дешифрован)
17 E8 E0 E0 02 12 AE F0 F4 43 4B 05 E7 EA 56 5A 5E....

этот же пакет но после дешифровки L2PacketHack
13 01 00 00 43 7C E8 D9 00 49 00 4E 43 61 E8 8B 00....

восстанавливаю XOR ключ, получаю:
04 FE 08 00 A1 6C 54 87 04

байты с 5 по 8 понятно, это константный ключ, а вот первые четыре совсем не совпадают с ключом из пакета KeyInit

как получился такой ключ?

Добавлено через 1 час 48 минут
Эта процедура формирует начальный XOR ключ?
я в паскале ничего не понимаю

procedure TencDec.CorrectXor;
var
// tmp: string;
Offset: Word;
TempPacket : Tpacket;
begin
//Обход смены XOR ключа.
case pckCount of
3: CorrectXorData := Packet;
4: begin
TempPacket := Packet;
// SetLength(tmp, TempPacket.Size);
// Move(TempPacket, tmp[1], TempPacket.Size);
xorS.DecryptGP(TempPacket.Data, TempPacket.Size-2);
Offset := $13 or ((TempPacket.size-7) div 295) shl 8;
PInteger(@TempPacket.Data[0])^:=PInteger(@TempPacket.Data[0])^ xor Offset xor PInteger(@(xorS.GKeyS[0]))^;
xorS.InitKey(TempPacket.Data[0],isInterlude);
xorC.InitKey(TempPacket.Data[0],isInterlude);
if (not Settings.isNoDecrypt) then xorC.DecryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
if (not Settings.isNoDecrypt) then xorC.EncryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
InitXOR:=True;
end;
end;
end;

Если да, то пожалуйста ответьте на вопросы:
1)
TempPacket.size это размер четвертого пакета? (в котором передаются данные о выбранном персонаже)?

2) откомментируйте чего происходит в этих строках

PInteger(@TempPacket.Data[0])^:=PInteger(@TempPacket.Data[0])^ xor Offset xor PInteger(@(xorS.GKeyS[0]))^;
xorS.InitKey(TempPacket.Data[0],isInterlude);
xorC.InitKey(TempPacket.Data[0],isInterlude);
if (not Settings.isNoDecrypt) then xorC.DecryptGP(CorrectXorData.Data, CorrectXorData.Size-2);
if (not Settings.isNoDecrypt) then xorC.EncryptGP(CorrectXorData.Data, CorrectXorData.Size-2);

Последний раз редактировалось roma_, 04.09.2009 в 01:10. Причина: Добавлено сообщение
roma_ вне форума   Ответить с цитированием
Старый 04.09.2009, 01:31   #10
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от alexteam Посмотреть сообщение
а часть - приходит от сервера с пакетом 2Eh (тоже 4 байта)
2Eh это начиная с камаэля где то, а в С4 этот пакет был с ИД - 0

roma_, странно что ключ неверный, он отличается от стандартно полученного, CorrectXor насколько я помню получает ключ (текущий а не начальный) анализируя толи 4й толи 3й пакет (поскольку там всегда нули в том месте которое шифруется динамической частью ключа, то можно вычислить текущий ключ)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 2 спасибками от:
Ответ

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



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

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


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

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

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