PDA

Просмотр полной версии : Авто вход в игру


Anton5
18.02.2009, 10:03
Здравствуйте.
Почитал что нужно сделать для автоматического входа и понял что геморойно писать такой скрипт(шифрация логина, пароля, SessionKey и т.д)

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

Кто-нибудь встречал написанный скрипт или какой-нибудь шаблон на автоматический вход в игру, если нет придётся писать самому(небольшой опыт в написания скриптов имеется, но геморойно:()?

QaK
18.02.2009, 10:31
Что ты подразумеваешь под авто входом? Залогиниться в игру через скрипты никак не получится. Если только уже зайти на акк, тогда после этого можно написать авто вход чара, кидание трейда и передача вещей с последующим логаутом.

Anton5
18.02.2009, 10:49
А что помешает этому? Неужели нельзя спомощью скрипта расчитать все необходимые данные?
Порядок авторизации на логин сервере

Во первых сразу замечу что существует две ревизии протокола использующиеся на данный момент(может и больше но мне о них не известно) - c621 и 785a.
Отличие их в том что в c621 используется дополнительное шифрование и авторизация GameGuard. Пакеты Init и RequestAuthLogin также отличаются.
Определить версию можно по размеру пакета Init, для ревизии 785a он составляет 11 байт, для c621 – 170.

1. Сразу после установки соединения сервер отправляет клиенту пакет Init
2. В ответ на него клиент отправляет пакет RequestGGAuth(в ревизии протокола 785a этот пакет не высылается)
3. Сервер отвечает на него пакетом GGAuth (в ревизии протокола 785a этот пакет не высылается)
4. Если сервер ответил, что авторизация прошла успешно, то клиент высылает пакет RequestAuthLogin, содержащий логин и пароль.
5. Проверка логина и пароля, в случае неудачи, сервер высылает пакет LoginFail содержащий причину неудачи, инатче высылается пакет LoginOk, содержащий
session key #1.
6. Далее клиент запрашивает список серверов пакетом RequestServerList
7. В ответ на этот пакет сервер высылает клиенту ServerList, в нем содержиться список серверов и их IP адреса с номерами портов.
8. После выбора game-сервера, и нажатия на ОК, клиент отсылает пакет RequestServerLogin
9. Сервер авторизации выполняет проверки на максимальное количество игроков, доступность сервера и т.п., если все проверки пройдены, то высылает пакет
PlayOk,содержащий session key #2, этот ключь генерируется из текущего времени системы в мс, номера сокета и еще всякой лабуды. После этого клиент
отключается от логин сервера и подключается к гейм серверу.

Порядок авторизации на гейм сервере

1. После установки соединения, клиент высылает пакет ProtocolVersion, содержащий версию протокола.
2. Сервер высылает пакет CryptInit, содержащий XOR ключ которым будут шифроваться все следующие пакеты.
3. Клиент высылает пакет AuthLogin выбраному серверу, содержащий session key #1, session key #2 и логин. При несовпадении с теми ключами и логином,
что храняться на сервере авторизации клиент отключается.
4. Сервер высылает пакет CharList, содержащий список всех чаров на аккаунте.
5. Тут идет процесс создания/удаления и выбора чара, после того как чар выбран и нажата кнопка Start, клиент отправляет пакет CharacterSelected
6. Клиент отправляет 2 пакета - RequestQuestList и RequestExManorList
7. Сервер высылает пакет ExSendManorList
8. Сервер высылает пакет QuestList
9. Клиент отправляет пакет EnterWorld
10. Сервер отправляет пакет UserInfo, который также служит сигналом окончания загрузки.
11. Все мы в игре. Сервер с периодичностью 60 секунд высылает пакет NetPingRequest, на который клиент должен ответить пакетом NetPing

В описании пакетов будут встречаться ObjectID и ItemID, ItemID это идентификатор типа предмета, например у авадон робы он 2406. А ObjectID это
уникальный идентификатор самого предмета в игре. Например у двух чаров есть авадон роба, ItemID робы у каждого из них будет одинаковый - 2406, тогда
как ObjectID будет уникальным.

Пакеты сервера авторизации шифруются по алгоритму Blowfish. Стандартный ключ по умолчанию в 4-х хрониках:
5F 3B 35 2E 5D 39 34 2D 33 31 3D 3D 2D 25 78 54 21 5E 5B 24. К концу ключа прибавляется символ с кодом 0. В Interlude тип шифрования был изменен - пакет
Init содержит динамический Blowfish ключ случайно генерируемый для каждого клиента. Этот пакет сначала шифруется по алгоритму XOR(ключ генерируется
случайным образом и помещается в конце пакета), а потом шифруется по алгоритму Blowfish, статическим ключом. По умолчанию статический ключ -
6B 60 CB 5B 82 CE 90 B1 CC 2B 6C 55 6C 6C 6C 6C. Все последующие пакеты будут шифроваться динамическим Blowfish ключом. Пакет LoginRequest дополнительно
шифруется по алгоритму RSA. Ключ состоит из следующих частей: B = 1024, E = 65537, N = передается в пакете Init. Вместе эти 3 части составляют целый RSA
ключ. Байты N в пакете зашифрованы функцией:

void scrambleMod( char *n )
{
typedef unsigned char byte;
int i;

for( i=0; i<4; i++ ) {
byte temp = n[0x00 + i];
n[0x00 + i] = n[0x4d + i];
n[0x4d + i] = temp;
};

// step 2 xor first 0x40 bytes with last 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[i] = (byte)(n[i] ^ n[0x40 + i]);
};

// step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
for( i=0; i<4; i++ ) {
n[0x0d + i] = (byte)(n[0x0d + i] ^ n[0x34 + i]);
};

// step 4 xor last 0x40 bytes with first 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[0x40 + i] = (byte)(n[0x40 + i] ^ n[i]);
};
};

Для расшифровки можно воспользоваться следующей функцией:

void unscrambleMod( char *n )
{
typedef unsigned char byte;
int i;

// step 4 xor last 0x40 bytes with first 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[0x40 + i] = (byte)(n[0x40 + i] ^ n[i]);
};

// step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
for( i=0; i<4; i++ ) {
n[0x0d + i] = (byte)(n[0x0d + i] ^ n[0x34 + i]);
};

// step 2 xor first 0x40 bytes with last 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[i] = (byte)(n[i] ^ n[0x40 + i]);
};

for( i=0; i<4; i++ ) {
byte temp = n[0x00 + i];
n[0x00 + i] = n[0x4d + i];
n[0x4d + i] = temp;
};
};


Также есть сервера использующие старый протокол авторизации(ревизия 785a) который не шифрует пакет Init, а остальные шифрует Blowfish
ключом длинной 21 байт. При этом пакет LoginRequest шифруется только по алгоритму Blowfish, без дополнительного шифрования RSA.
Для шифрования пакетов гейм сервера используется алгоритм XOR. Ключ XOR генерируется случайно и передается клиенту в пакете CryptInit. Функции
шифрования и дешифрации приведены ниже:

/* Декодирует данные */
void decrypt( unsigned char *data, unsigned int len, unsigned char *Key )
{

int temp = 0;

for( unsigned int i = 0; i < len; ++i ) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = temp2;
};


int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;

old += len;

Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
};

/* Кодирует данные */
void encrypt( unsigned char *data, unsigned int len, unsigned char *Key )
{
int temp = 0;

for( unsigned int i = 0; i < len; i++) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = data[i];
};

int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;

old += len;

Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
};

С каждым кодированным/декодированным пакетом ключ изменяется на длину пакета, поэтому нужно использовать два отдельных экземпляра ключа – один для
шифрования исходящих пакетов, второй для расшифровки входящих.
Все пакеты шифруются начиная с 3-го байта, т.е. размер пакета никогда не шифруется.
Взято здесь (http://fursoffers.narod.ru/Packets.htm).

------------------------------------

Кажись дошло. L2PacketHack не создайт соединение, он только перехватывает существующее. :(

Тогда я думаю следующий вариант прокатит, как вы думаете?
Логинюсь, дохожу до выбора перса и тут уже скрипт "перехватывает управление" выбирает перса, заходит им выгру, выполняет нужные мне действия, "нажиматся кнопка перезайти", выберается следующий перс и т.д.

QaK
18.02.2009, 15:27
Если только уже зайти на акк, тогда после этого можно написать авто вход чара, кидание трейда и передача вещей с последующим логаутом.
Логинюсь, дохожу до выбора перса и тут уже скрипт "перехватывает управление" выбирает перса, заходит им выгру, выполняет нужные мне действия, "нажиматся кнопка перезайти", выберается следующий перс и т.д. ты гений епть ...

Anton5
18.02.2009, 15:43
ты гений епть ...
Даже у гениев бывают озарения :D:D:D