Вернуться   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:31   #9
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 спасибками от:
Старый 04.09.2009, 03:41   #10
Новичок
 
Регистрация: 03.09.2009
Сообщений: 5
Сказал Спасибо: 2
Имеет 0 спасибок в 0 сообщенях
roma_ пока неопределено
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
странно что ключ неверный
L2PacketHack вычислил правильный ключ, пакеты расшифровывает верно.
Только мне не понятен алгоритм получения им этого ключа, которым он расшифровывает 1й зашифрованный пакет от сервера.

Вот пакет с ключем KeyInit, он не шифруется
0001 03 B1 93 B6 01 00 00 00 01 00 00 00

03 B1 93 B6 - это первая часть ключа, вторая A1 6C 54 87 - это константа
в итоге получается такой ключ: 03 B1 93 B6 A1 6C 54 87

Но L2PacketHack первый пакет от сервера расшифровывал этим ключом:
04 FE 08 00 A1 6C 54 87

Вот я и пытаюсь понять как он из получил 04 FE 08 00 этот ключ
Полагаю что работает смена XOR ключа, опция в настройках включена.
Остальные ключи получаются добавлением длины пакета к текущему ключу.
А вот как и по какому алгоритму получается ключ для первого зашифрованного пакета?
Т.е. этот 04 FE 08 00

Добавлено через 1 минуту
С паскалем у меня проблемы, пишу на С++
Поэтому из исходников паскаля и не могу разобраться с алгоритмом

Последний раз редактировалось roma_, 04.09.2009 в 03:41. Причина: Добавлено сообщение
roma_ вне форума   Ответить с цитированием
Ответ

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



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

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


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

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

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