Jump to content
×
×
  • Create New...

C++ - Système de Séquence


Recommended Posts

Centre de Téléchargement

Télécharger ( Interne )

Salut à tous,

 

Je viens vous partager les résultats de mes test après quelques mois.

 

  1. Moins de déconnexion inexpliqué lié au game.
  2. Plus aucune erreur lié au séquence dans les syserrs
  3. Sources serveur & client allégés

 

Comme vous pouvez le constater, la suppression de ce système est entièrement bénéfique puisque c'est un système incomplet provoquant des déconnexion en jeu sans aucune raison.

Le système générait également cette erreur côté serveur:

 

Révélation

0628594f0bc72a7c01d29a0500990bafbb235c.p

 

Par contre, si vous avez désactiver l'encryption des packets sur vos sources, ça nécessitera beaucoup d'autres modifications assez importantes.

 

Si vous voulez faire une série de test vous avez la possibilité d'agir de 3 façons différentes :

 

  • #ifndef SEQUENCE_SYSTEM_DISABLED avant chaque code lié aux séquences.
  • Vous commentez le code
  • Vous supprimez le code pour alléger votre sources (j'ai opté pour celle-ci)

 

Commençons,

 

Ouvrez input.cpp et cherchez :

		if (bHeader == HEADER_CG_PONG)
			sys_log(0, "PONG! %u %u", m_pPacketInfo->IsSequence(bHeader), *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)));

 

Ici, le syslog lié au Header de la clé pong fait appel à la fonction IsSequence, on va modifier ça par :

		if (bHeader == HEADER_CG_PONG)
			sys_log(0, "PONG! %u", *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)));

 

Juste en bas vous avez :

		if (m_pPacketInfo->IsSequence(bHeader))
		{
			BYTE bSeq = lpDesc->GetSequence();
			BYTE bSeqReceived = *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE));

			if (bSeq != bSeqReceived)
			{
				sys_err("SEQUENCE %x mismatch 0x%x != 0x%x header %u", get_pointer(lpDesc), bSeq, bSeqReceived, bHeader);

				LPCHARACTER	ch = lpDesc->GetCharacter();

				char buf[1024];
				int	offset, len;

				offset = snprintf(buf, sizeof(buf), "SEQUENCE_LOG [%s]-------------\n", ch ? ch->GetName() : "UNKNOWN");

				if (offset < 0 || offset >= (int) sizeof(buf))
					offset = sizeof(buf) - 1;

				for (size_t i = 0; i < lpDesc->m_seq_vector.size(); ++i)
				{
					len = snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n",
							lpDesc->m_seq_vector[i].hdr,
							lpDesc->m_seq_vector[i].seq);

					if (len < 0 || len >= (int) sizeof(buf) - offset)
						offset += (sizeof(buf) - offset) - 1;
					else
						offset += len;
				}

				snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", bHeader, bSeq);
				sys_err("%s", buf);

				lpDesc->SetPhase(PHASE_CLOSE);
				return true;
			}
			else
			{
				lpDesc->push_seq(bHeader, bSeq);
				lpDesc->SetNextSequence();
				//sys_err("SEQUENCE %x match %u next %u header %u", lpDesc, bSeq, lpDesc->GetSequence(), bHeader);
			}
		}

Ajoutez le ifdef, commentez ou supprimez l'intégralité du code.

 

Cherchez :

CInputHandshake::CInputHandshake()
{
	CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG;
	pkPacketInfo->SetSequence(HEADER_CG_PONG, false);

	m_pMainPacketInfo = m_pPacketInfo;
	BindPacketInfo(pkPacketInfo);
}

 

On va supprimer l’envoi de la séquence de la clé pong ici comme ceci :

CInputHandshake::CInputHandshake()
{
	CPacketInfoCG * pkPacketInfo = M2_NEW CPacketInfoCG;
//	pkPacketInfo->SetSequence(HEADER_CG_PONG, false);

	m_pMainPacketInfo = m_pPacketInfo;
	BindPacketInfo(pkPacketInfo);
}

 

C'est tout pour l'input.cpp, ouvrons le fichier desc.cpp :

#include "sequence.h"

Ajoutez un commentaire à l'include.

 

Ensuite cherchez et commentez le code :

m_iCurrentSequence

 

Cherchez et commentez le code:

m_seq_vector.clear();

 

Cherchez à nouveau & commentez le code :

m_seq_vector.clear();

 

Cherchez :

BYTE DESC::GetSequence()
{
	return gc_abSequence[m_iCurrentSequence];
}

void DESC::SetNextSequence()
{
	if (++m_iCurrentSequence == SEQUENCE_MAX_NUM)
		m_iCurrentSequence = 0;
}

Commentez l'intégralité.

 

Pour finir, cherchez :

void DESC::push_seq(BYTE hdr, BYTE seq)
{
	if (m_seq_vector.size()>=20)
	{
		m_seq_vector.erase(m_seq_vector.begin());
	}

	seq_t info = { hdr, seq };
	m_seq_vector.push_back(info);
}

Commentez également l'intégralité de la fonction.

 

Ouvrons le desc.h pour les déclarations.

 

Cherchez :

// sequence 버그 찾기용 데이타
struct seq_t
{
	BYTE	hdr;
	BYTE	seq;
};
typedef std::vector<seq_t>	seq_vector_t;
// sequence 버그 찾기용 데이타

Commentez le tout.

 

Cherchez :

		BYTE			GetSequence();
		void			SetNextSequence();

Commentez les 2 fonctions.

 

Cherchez :

int			m_iCurrentSequence;

Commentez la fonction.

 

Cherchez :

	public:
		seq_vector_t	m_seq_vector;
		void			push_seq (BYTE hdr, BYTE seq);

Commentez tout.

 

Ouvrons le packet_info.cpp et cherchons :

void CPacketInfo::Set(int header, int iSize, const char * c_pszName, bool bSeq)
{
	if (m_pPacketMap.find(header) != m_pPacketMap.end())
		return;

	TPacketElement * element = M2_NEW TPacketElement;

	element->iSize = iSize;
	element->stName.assign(c_pszName);
	element->iCalled = 0;
	element->dwLoad = 0;

	element->bSequencePacket = bSeq;

	if (element->bSequencePacket)
		element->iSize += sizeof(BYTE);

	m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element));
}

 

Modifiez par:

void CPacketInfo::Set(int header, int iSize, const char * c_pszName)
{
	if (m_pPacketMap.find(header) != m_pPacketMap.end())
		return;

	TPacketElement * element = M2_NEW TPacketElement;

	element->iSize = iSize;
	element->stName.assign(c_pszName);
	element->iCalled = 0;
	element->dwLoad = 0;
/*
	element->bSequencePacket = bSeq;

	if (element->bSequencePacket)
		element->iSize += sizeof(BYTE);
*/
	m_pPacketMap.insert(std::map<int, TPacketElement *>::value_type(header, element));
}

 

Cherchez :

bool CPacketInfo::IsSequence(int header)
{
	TPacketElement * pkElement = GetElement(header);
	return pkElement ? pkElement->bSequencePacket : false;
}

void CPacketInfo::SetSequence(int header, bool bSeq)
{
	TPacketElement * pkElem = GetElement(header);

	if (pkElem)
	{
		if (bSeq)
		{
			if (!pkElem->bSequencePacket)
				pkElem->iSize++;
		}
		else
		{
			if (pkElem->bSequencePacket)
				pkElem->iSize--;
		}

		pkElem->bSequencePacket = bSeq;
	}
}

Commentez la totalité.

 

Maintenant, on va modifier tout les packets de la fonction CPacketInfoCG::CPacketInfoCG(). L’envoi de séquence n'étant plus nécessaire, remplacez ceci :

Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false);

 

Par :

	Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload");

 

Faites ceci pour tous les header avec un true ou un false.

 

Vous devriez avoir quelque comme comme ça:

 

Révélation

062859a42844c93aebd5389a7a057ad945cbbc.p

 

Ouvrons le packet_info.h et cherchons :

typedef struct SPacketElement
{
	int		iSize;
	std::string	stName;
	int		iCalled;
	DWORD	dwLoad;
	bool	bSequencePacket;
} TPacketElement;

 

Modifiez par:

typedef struct SPacketElement
{
	int		iSize;
	std::string	stName;
	int		iCalled;
	DWORD	dwLoad;
	//bool	bSequencePacket;
} TPacketElement;

 

Cherchez :

		void Set(int header, int size, const char * c_pszName, bool bSeq=false);

 

Modifiez par :

		void Set(int header, int size, const char * c_pszName);

 

Cherchez et commentez le code :

		bool IsSequence(int header);
		void SetSequence(int header, bool bSeq);

 

Pour conclure le tutoriel, ouvrons input_udp.cpp et cherchons :

Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest", false);

 

Modifiez par :

Set(1, sizeof(ServerStateChecker_RequestPacket), "ServerStateRequest");

 

Enfin, supprimez les 2 fichiers séquence de vos sources et n'oubliez pas de les retirer du makefile.

 

 

Pour la partie client je ne vais pas faire de tutoriel étant donné que ce fichier n'est jamais modifié donc vous pouvez prendre le miens (j'en ai refait un pour vous vu que j'ai désactivé l’encryption des packets de mon côté).

 

Lien de téléchargement : Cliquez-ici !

Source : Madara, merci de citer la source si vous souhaitez partager ce tutoriel ailleurs.

 

  • Funky Emulation 2
  • J'adore 20

 

 

Link to comment
  • Replies 5
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Popular Posts

Kuroro

Centre de Téléchargement Télécharger ( Interne ) Salut à tous,   Je viens vous partager les résultats de mes test après quelques mois.   Moins de déconnexion inexpliqué lié au game. Plus aucune erreur lié au séquence dans les syserrs Sources serveur & client allégés   Comme vous pouvez le constater, la suppression de ce système est entièrement bénéfique puisque c'est un système incomplet provoquant des déconnexion en jeu sans au

Kameyu

Re,   C'est leur choix, personne ne leur impose de crypter leurs paquets, c'était juste à titre indicatif.   Rapport à la sécurité des paquets, dire que les gens n'exploitent plus ce genre de failles ne signe pas l'exclusion définitive. N'importe quel nigaud ayant trouvé un hack (du style Lalaker qui utilise les paquets pour envoyer des données au serveur et simuler les fonctions d'attaque/déplacement & cie) pourrait trouver les bons paquets et les adapter pour

Kuroro

Re,   Ouaip, pour les cheats c'est une autre histoire, si tu fais rien pour, c'est sûr que ça laissera une ouverture. Après, y a pas que le temps de connexion & de chargement qui diminue, tu as moins de déconnexion en jeu pour rien et le jeu est un peu fluide ( remarque personnel )   Ré-écrire le système de séquence de metin n'est pas une mauvaise idée également à condition de bien faire le travail et de ne pas bâcler & négliger ça comme ymir l'a fait ...  

  • Développeur

Yo!

 

Pourquoi vouloir supprimer directement le système plutôt que corriger ce qui fonctionne mal ?

L'encryption de paquets peut s'avérer utile dans des cas précis.

 

Certes le login et la stabilité de la connexion peuvent s'avérer plus efficaces dans des cas précis mais quid de la protection de ton client ?

Il serait plus facile pour quelqu'un de sniffer tes paquets pour créer un logiciel de triche car les paquets ne seraient plus cryptés.

 

Il me semblerait plus utile d'améliorer le système déjà en place (et plus ou moins fonctionnel) plutôt que de le supprimer pour un simple

gain de stabilité de connexion au détriment de la sécurité des données du client.

Edited by Kameyu
Link to comment

Salut,

 

Merci pour ta réponse.

Je t'invite à télécharger le client de wom2, de te faire un compte et d'entrer en jeu. Compte même pas 2 secondes pour le login, la selection et le chargement.

Je pense qu'avoir un jeu optimisé est indispensable pour avoir une base stable & rapide.

 

Tout les gros dev, à ma connaissance ont retiré ce système des sources mais ça ne veut dire pas qu'ils ont raison.

C'est d'ailleurs pour cette raison que j'ai effectué des test sur du long terme et que j'en ai tiré cette conclusion.

 

Concernant ta remarque par rapport à la sécurités des donne du client, on est en 2018, les gens n'exploitent plus ce genre de faille depuis un bon bout de temps.

Je pense que tout les gros serveur auraient sautés sinon. 

 

Merci pour ta réponse développé

 

 

Link to comment
  • Développeur

Re,

 

C'est leur choix, personne ne leur impose de crypter leurs paquets, c'était juste à titre indicatif.

 

Rapport à la sécurité des paquets, dire que les gens n'exploitent plus ce genre de failles ne signe pas l'exclusion définitive.

N'importe quel nigaud ayant trouvé un hack (du style Lalaker qui utilise les paquets pour envoyer des données au serveur

et simuler les fonctions d'attaque/déplacement & cie) pourrait trouver les bons paquets et les adapter pour ton serveur.

 

Libre aux autres de faire ce qu'ils en veulent, mais pour ma part gagner 2 secondes de connexion au détriment d'une sécurité,

ça vaut pas vraiment le coup.

Par contre, je ne dirai pas que ce que tu as proposé est inutile hein, loin de là. Je me demandais juste s'il était pas plus judicieux de

développer le système déjà présent plutôt que l'enlever directement pour un simple gain de rapidité plus ou moins négligeable.

  • J'adore 1
Link to comment

Re,

 

Ouaip, pour les cheats c'est une autre histoire, si tu fais rien pour, c'est sûr que ça laissera une ouverture.

Après, y a pas que le temps de connexion & de chargement qui diminue, tu as moins de déconnexion en jeu pour rien et le jeu est un peu fluide ( remarque personnel )

 

Ré-écrire le système de séquence de metin n'est pas une mauvaise idée également à condition de bien faire le travail et de ne pas bâcler & négliger ça comme ymir l'a fait ...

 

Merci pour ton avis

Edited by Madara
  • J'adore 1

 

 

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.