Deferato 1 Опубликовано 15 сентября, 2011 Вообщем решил я поставить анти брут по этому мануалу Скрытый текстДля начала немного теории.Всем известно такое явление, как брут - перебор паролей. Брутят зачастую либо веб-составляющую проекта (личный кабинет), либо же непосредственно сам сервер. Защита последнего и будет описана, но об этом немного дальше. Как же работает брут, в частности ла2 серверов? Зловредная программа () берет из списка логин+пароль и отправляет на логин сервер запрос на авторизацию, если пароль подошел к логину - осуществляется запись такой связки с файл - ваш аккаунт в руках брутера. 1. Одним из вариантов защиты от брута является авторегистрация. В этом есть некая логика: абсолютно все подбирающиеся аккаунты брутеру будут выдаваться как рабочие, но на самом деле - они будут пустые, т.к. брутом будут собственно и создаваться. Минус способа - быстро заполняется база пустыми аккаунтами. 2. Рассмотрим вариант защиты через ядро. В зависимости от некоторых обстоятельств логин-сервер возвращает 1 из 5 ответов: AUTH_SUCCESS - авторизация успешна. Пользователю выдается сессионый ключ и возвращается пакет LoginOk(), который показывает нам окно Лицензии. После которого появляется список серверов - пакет ServerList(). INVALID_PASSWORD - пароль неверный. Срабатывает "client.close(LoginFailReason.REASON_USER_OR_PASS_ WRONG);", т.е. выдается сообщение о неверном пароле и предотвращается доступ пользователя далее. ACCOUNT_BANNED - аккаунт забанен. ALREADY_ON_LS - на данный аккаунт уже произведена авторизация на логин-сервере. ALREADY_ON_GS - персонаж с данного аккаунта уже находится в игре (ну, и при попытке авторизации персонажа выкинет с игры) Брут, получив от логин-сервера пакет ServerList() (список серверов), считает аккаунт сбрученным и записывает его в файл. Вот на этом мы и построим защиту. Переходим в net\sf\l2j\loginserver\clientpackets\RequestAuthLo gin.java (в некоторых сборках путь может незначительно отличатся в начале - net\sf\l2j\). Находим следующий код: Цитировать case INVALID_PASSWORD: client.close(LoginFailReason.REASON_USER_OR_PASS_WRONG); break; и меняем на следующее: Цитировать case INVALID_PASSWORD: client.setSessionKey(lc.assignSessionKeyToClient(_user, client)); getClient().sendPacket(new ServerList(getClient())); break; Поясню. Таким образом при неправильном вводе пароля, будет возвращаться пакет ServerList(), что для брута послужит зеленым светом, мол, пароль подошел (но на самом деле - пароль неверный). После описанных выше действий появится небольшой побочный эффект. Если простой пользователь введет случайно неверный пароль - его сразу (минуя лицензию) направит на список серверов (пакет ServerList()). И при нажатии на любой сервер - ничего не произойдет, а пользователь так и не поймет что же случилось. К тому же логин сервер будет засыпаться ошибкой "Unknown opcode: ...." при каждом нажатии пользователя на сервер из списка. Сейчас мы это исправим... Идем в net/sf/l2j/loginserver/L2LoginPacketHandler.java. Находим там код: Цитировать case AUTHED_GG: if (opcode == 0x00) { packet = new RequestAuthLogin(); } else { debugOpcode(opcode, state); } и меняем его так: Цитировать case AUTHED_GG: if (opcode == 0x00) { packet = new RequestAuthLogin(); } else { client.close(LoginFailReason.REASON_USER_OR_PASS_WRONG); } Теперь пользователь, после ввода неправильного пароля и перенаправлении на список серверов, при попытке войти на сервер будет выкинут на начальное окно (ввод логина и пароля) с сообщением, что ввел неверный пароль. Вроде бы все. Среди тех способов защиты от брута, что находятся в свободном доступе - этот наиболее привлекательный. Вроде нигде не ошибся, если будут проблемы/вопросы - излагайте в данной теме. Офф источник postpacific.ru (Учимся искать друзья) Все по нему сделал и в эклипсе выдает ошибку [javac] Compiling 68 source files to C:\Games\GameServer\build\classes [javac] C:\Games\GameServer\head-src\com\l2jfrozen\loginserver\L2LoginPacketHandler.java:80: cannot find symbol [javac] symbol : variable LoginFailReason [javac] location: class com.l2jfrozen.loginserver.L2LoginPacketHandler [javac] client.close(LoginFailReason.REASON_USER_OR_PASS_WRONG); [javac] ^ [javac] 1 error вот код этого файла L2LoginPacketHandler.java Скрытый текст/* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * http://www.gnu.org/copyleft/gpl.html */ package com.l2jfrozen.loginserver; import java.nio.ByteBuffer; import com.l2jfrozen.Config; import com.l2jfrozen.loginserver.L2LoginClient.LoginClientState; import com.l2jfrozen.loginserver.network.clientpackets.AuthGameGuard; import com.l2jfrozen.loginserver.network.clientpackets.RequestAuthLogin; import com.l2jfrozen.loginserver.network.clientpackets.RequestServerList; import com.l2jfrozen.loginserver.network.clientpackets.RequestServerLogin; import com.l2jfrozen.logs.Log; import com.l2jfrozen.netcore.IPacketHandler; import com.l2jfrozen.netcore.ReceivablePacket; import com.l2jfrozen.util.PacketsFloodProtector; /** * Handler for packets received by Login Server * * @author ProGramMoS */ public final class L2LoginPacketHandler implements IPacketHandler<L2LoginClient> { /** * @see com.l2jserver.mmocore.network.IPacketHandler#handlePacket(java.nio.ByteBuffer, * com.l2jserver.mmocore.interfaces.MMOClient) */ @Override public ReceivablePacket<L2LoginClient> handlePacket(ByteBuffer buf, L2LoginClient client) { int opcode = buf.get() & 0xFF; if(!PacketsFloodProtector.tryPerformAction(opcode, -1, client)){ return null; } ReceivablePacket<L2LoginClient> packet = null; LoginClientState state = client.getState(); if(Config.DEBUG_PACKETS){ Log.add("Packet: " + Integer.toHexString(opcode) + " on State: " + state.name() + " Client: " + client.toString(), "LoginPacketsLog"); } switch(state) { case CONNECTED: if(opcode == 0x07) { packet = new AuthGameGuard(); } else { debugOpcode(opcode, state); } break; case AUTHED_GG: if(opcode == 0x00) { packet = new RequestAuthLogin(); } else { client.close(LoginFailReason.REASON_USER_OR_PASS_WRONG); } break; case AUTHED_LOGIN: if(opcode == 0x05) { packet = new RequestServerList(); } else if(opcode == 0x02) { packet = new RequestServerLogin(); } else { debugOpcode(opcode, state); } break; } state = null; return packet; } private void debugOpcode(int opcode, LoginClientState state) { System.out.println("Unknown Opcode: " + opcode + " for state: " + state.name()); } } ПОМОГИТЕ !!!!!! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Excellion 0 Опубликовано 15 сентября, 2011 если бы был смысл ставить данный анти-брут я бы тебе помог ! но от него нету толку ибо нынешние антибруты исследуют пакеты до самого чара... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Deferato 1 Опубликовано 15 сентября, 2011 А как тогда сервер защитить от брута?! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Kain 1 Опубликовано 15 сентября, 2011 Авто бан на 10-30 минут при 5-15 не удачных попыток войти на акаунт. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Deferato 1 Опубликовано 15 сентября, 2011 С брутом разобрался http://forummaxi.ru/index.php?showtopic=4080 - новая проблема Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты