Acesta este un fix la un exploit vechi, care poate fi facut la schimbarea CH (cu un hack/script propriu)
Ce face acest FIX - adauga o limitare la aceasta functie, necesitand un state de logout valid inainte de a o putea folosi.
*Link download / Code:
Cautam in common/tables.h:
Code:
typedef struct SLogoutPacket
{
char login[LOGIN_MAX_LEN + 1];
char passwd[PASSWD_MAX_LEN + 1];
} TLogoutPacket;Mergem in db/ClientManagerLogin.cpp si cautam (in void CClientManager::QUERY_LOGIN_BY_KEY):
Code:
if (memcmp(pkLoginData->GetClientKey(), p->adwClientKey, sizeof(DWORD) * 4))
{
const DWORD* pdwClientKey = pkLoginData->GetClientKey();
sys_log(0, "LOGIN_BY_KEY client key differ %s %lu %lu %lu %lu, %lu %lu %lu %lu", r.login, p->adwClientKey[0], p->adwClientKey[1], p->adwClientKey[2], p->adwClientKey[3], pdwClientKey[0], pdwClientKey[1], pdwClientKey[2], pdwClientKey[3]);
pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
return;
}Adaugam dupa:
Acum deschidem db/ClientManagerLogin.cpp si cautam in void CClientManager::QUERY_LOGOUT:
Code:
CLoginData* pLoginData = GetLoginDataByLogin(packet->login);
if (pLoginData == NULL)
return;Adaugam dupa:
Deschidem db/LoginData.cpp si cautam inauntru la constructor (CLoginData::CLoginData()) adaugam:
In db/LoginData.h adaugam:
Deschidem game/char.cpp si in functia void CHARACTER::Initialize() adaugam:
Cautam functie de Warp -> (WarpSet, ChangeChannel, etc):
Code:
Stop();
Save();Adaugam inainte:
Acum in game/char.h adaugam:
Deschidem game/desc.cpp si cautam in void DESC::Destroy():
Code:
if (m_lpCharacter)
{
m_lpCharacter->Disconnect("DESC::~DESC");
m_lpCharacter = NULL;
}Inlocuim cu:
Cautam:
Code:
if (!g_bAuthServer)
{
if (m_accountTable.login[0] && m_accountTable.passwd[0])
{
TLogoutPacket pack;
strlcpy(pack.login, m_accountTable.login, sizeof(pack.login));
strlcpy(pack.passwd, m_accountTable.passwd, sizeof(pack.passwd));
db_clientdesc->DBPacket(HEADER_GD_LOGOUT, m_dwHandle, &pack, sizeof(TLogoutPacket));
}
}Modificam / adaptam asa:
Acum in game/input_db.cpp cautam in void CInputDB::LoginSuccess:
Code:
if (!d)
{
sys_log(0, "CInputDB::LoginSuccess - cannot find handle [%s]", pTab->login);
TLogoutPacket pack;
strlcpy(pack.login, pTab->login, sizeof(pack.login));
db_clientdesc->DBPacket(HEADER_GD_LOGOUT, dwHandle, &pack, sizeof(pack));
return;
}
if (strcmp(pTab->status, "OK"))
{
sys_log(0, "CInputDB::LoginSuccess - status[%s] is not OK [%s]", pTab->status, pTab->login);
TLogoutPacket pack;
strlcpy(pack.login, pTab->login, sizeof(pack.login));
db_clientdesc->DBPacket(HEADER_GD_LOGOUT, dwHandle, &pack, sizeof(pack));
LoginFailure(d, pTab->status);
return;
}Inlocuim cu:


la acest mesaj și conținutul se va afișa automat.



