Сообщений: 897
Тем: 30
Зарегистрирован: Feb 2012
Репутация:
8,447
Доброго времени суток!
Собственно сабж:
Делаю лаунчер. Требуется добавить функцию автоматической авторизации.
Бороздил этот коммунити, бороздил гугол, но конкретного ответа не нашел. В этом коммунити были догадки насчет изменения l2.ini и добавления ключей для l2.exe, но ключи я так и не смог подобрать.
Если тут есть люди, которые владеют нужной информацией - поделитесь ей пожалуйста.
Сообщений: 1,432
Тем: 34
Зарегистрирован: Jul 2012
Репутация:
11,419
moveton Написал:Доброго времени суток!
Собственно сабж:
Делаю лаунчер. Требуется добавить функцию автоматической авторизации.
Бороздил этот коммунити, бороздил гугол, но конкретного ответа не нашел. В этом коммунити были догадки насчет изменения l2.ini и добавления ключей для l2.exe, но ключи я так и не смог подобрать.
Если тут есть люди, которые владеют нужной информацией - поделитесь ей пожалуйста.
То есть при нажатии на кнопку "Start" в лаунчере, игрока автоматически кидает в комнату персонажей, минуя окно логина?
Сообщений: 897
Тем: 30
Зарегистрирован: Feb 2012
Репутация:
8,447
Asmodiel Написал:То есть при нажатии на кнопку "Start" в лаунчере, игрока автоматически кидает в комнату персонажей, минуя окно логина?
Да, всё верно.
Сообщений: 1,432
Тем: 34
Зарегистрирован: Jul 2012
Репутация:
11,419
moveton Написал:Да, всё верно.
Значит без вмешательства в клиент это навряд ли возможно, ибо нужно что-то в клиенте, что может послать что-то, что может миновать авторизацию, взяв данные из лаунчера.
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
http://www.l2diary.ru/blog/40.html
+ пакет на стороне сервера полностью копирующий RequestLogin. Точно не помню -
Код: if(opcode == 0x00)
{
if(Config.USE_ONLY_CMD_AUTH)
packet = new RequestLogin();
else
packet = new RequestAuthLogin();
}
else if(opcode == 0x0b)
packet = new RequestLogin();
else
debugOpcode(opcode, state);
Возможно еще придется внести правки в l2.ini (что то там насчет CommandLine бла бла бла = true)
Сообщений: 320
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
817
07-17-2014, 05:52 PM
(Сообщение последний раз редактировалось: 09-07-2016, 12:51 PM WoWan-SM.)
Протестировано только что на клиенте Lindvior.
withoutLogin.bat
Код: l2.exe account= password=
l2.ini сменить с
Код: ExternalLogin=false
CmdLineLogin=false
на
Код: ExternalLogin=true
CmdLineLogin=true
И да реализовать на стороне LS обработку этого пакета с опкодом 0x0B, а то сервак будет молчать и дальше с места не сдвинется.
Добавлено через 33 минуты
ANZO Написал:http://www.l2diary.ru/blog/40.html
+ пакет на стороне сервера полностью копирующий RequestLogin. Точно не помню -
Код: if(opcode == 0x00)
{
if(Config.USE_ONLY_CMD_AUTH)
packet = new RequestLogin();
else
packet = new RequestAuthLogin();
}
else if(opcode == 0x0b)
packet = new RequestLogin();
else
debugOpcode(opcode, state);
Возможно еще придется внести правки в l2.ini (что то там насчет CommandLine бла бла бла = true)
Не совсем идентичный. Не знаю как на других хрониках, но в Lindvior он на 16 байт короче.
Добавлено через 3 часа 10 минут
Реализовал пакет для захода:
Код: package l2next.loginserver.clientpackets;
import l2next.loginserver.Config;
import l2next.loginserver.GameServerManager;
import l2next.loginserver.IpBanManager;
import l2next.loginserver.L2LoginClient;
import l2next.loginserver.accounts.Account;
import l2next.loginserver.accounts.SessionManager;
import l2next.loginserver.crypt.PasswordHash;
import l2next.loginserver.gameservercon.GameServer;
import l2next.loginserver.gameservercon.lspackets.GetAccountInfo;
import l2next.loginserver.serverpackets.LoginFail;
import l2next.loginserver.serverpackets.LoginOk;
import l2next.loginserver.utils.Log;
import javax.crypto.Cipher;
/**
* Новый пакет авторизации для захода без ввода логина и пароля
* Created by WoWan-SM on 17.07.2014.
* L2Dev.su
*/
public class RequestLogin extends L2LoginClientPacket {
private byte[] _raw = new byte[128];
@Override
protected void readImpl()
{
readD();
readB(_raw);
readD();
readH();
readC();
}
@Override
protected void runImpl() throws Exception
{
L2LoginClient client = getClient();
byte[] decrypted;
try
{
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/nopadding");
rsaCipher.init(Cipher.DECRYPT_MODE, client.getRSAPrivateKey());
decrypted = rsaCipher.doFinal(_raw, 0x00, 0x80);
}
catch(Exception e)
{
client.closeNow();
return;
}
String user = new String(decrypted, 0x40, 14).trim();
user = user.toLowerCase();
String password = new String(decrypted, 0x60, 16).trim();
int currentTime = (int) (System.currentTimeMillis() / 1000L);
Account account = new Account(user);
account.restore();
String passwordHash = Config.DEFAULT_CRYPT.encrypt(password);
if(account.getPasswordHash() == null)
{
if(Config.AUTO_CREATE_ACCOUNTS && user.matches(Config.ANAME_TEMPLATE) && password.matches(Config.APASSWD_TEMPLATE))
{
account.setAllowedIP("");
account.setPasswordHash(passwordHash);
account.save();
}
else
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}
}
boolean passwordCorrect = account.getPasswordHash().equals(passwordHash);
if(!passwordCorrect)
// проверяем не зашифрован ли пароль одним из устаревших но
// поддерживаемых алгоритмов
{
for(PasswordHash c : Config.LEGACY_CRYPT)
{
if(c.compare(password, account.getPasswordHash()))
{
passwordCorrect = true;
account.setPasswordHash(passwordHash);
break;
}
}
}
if(!IpBanManager.getInstance().tryLogin(client.getIpAddress(), passwordCorrect))
{
client.closeNow();
return;
}
if(!passwordCorrect)
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}
if(account.getAccessLevel() < 0)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}
if(account.getBanExpire() > currentTime)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}
if(!account.isAllowedIP(client.getIpAddress()))
{
client.close(LoginFail.LoginFailReason.REASON_ATTEMPTED_RESTRICTED_IP);
return;
}
for(GameServer gs : GameServerManager.getInstance().getGameServers())
{
if(gs.getProtocol() >= 2 && gs.isAuthed())
{
gs.sendPacket(new GetAccountInfo(user));
}
}
account.setLastAccess(currentTime);
account.setLastIP(client.getIpAddress());
Log.LogAccount(account);
SessionManager.Session session = SessionManager.getInstance().openSession(account);
client.setAuthed(true);
client.setLogin(user);
client.setAccount(account);
client.setSessionKey(session.getSessionKey());
client.setState(L2LoginClient.LoginClientState.AUTHED);
client.sendPacket(new LoginOk(client.getSessionKey()));
}
}
По структуре почти идентичен с RequestAuthLogin, только в начале какая-то приблуда intовая затесалась 0x08
и смещение чтение логина и пароля.
Было:
Код: String user = new String(decrypted, 0x5E, 14).trim();
user = user.toLowerCase();
String password = new String(decrypted, 0x6C, 16).trim();
Стало:
Код: String user = new String(decrypted, 0x40, 14).trim();
user = user.toLowerCase();
String password = new String(decrypted, 0x60, 16).trim();
Студия L2dev.su. Сборки Lindvior, Epilogue. ICQ 1817070. Skype wowan.sm
Сообщений: 148
Тем: 5
Зарегистрирован: Sep 2014
Репутация:
549
Реализуемо я так понимаю под любые хроники?
Сообщений: 64
Тем: 3
Зарегистрирован: Mar 2012
Репутация:
9
Сообщений: 18
Тем: 2
Зарегистрирован: Aug 2012
Репутация:
-5
Если вводить так, то работает
Код: l2.exe account=test password=testpwd
Если так, то нет
Код: l2.exe account=test password=test,pwd
Т.е если в пароли есть запятая, то пароль не принимается и не пускает на аккаунт, как решить проблему ?
Сообщений: 561
Тем: 44
Зарегистрирован: Sep 2011
Репутация:
412
Дополню некропост.
В гайде выше не указано что ключи в l2.ini должны быть в блоке [Auth]
PHP код: <?php
[Auth]
CmdLineLogin=True
ExternalLogin=True
По умолчанию во многих l2.ini они находятся в блоке [URL] и не работают. Сам с таким столкнулся и решил поделиться.
И актуален вопрос, а как такое же провернуть в клиенте для Interlude?
|