Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

C++ - Désactiver l'Encryption des Packets


Messages recommandés

Centre de Téléchargement

Hidden Content

    Give reaction to this post to see the hidden content.
( Interne )

Bonjour,

 

Je viens vous partager mon savoir sur ce que j'ai découvert récemment sur l’encryption des packets. Certains risquent de me dire, mais cela a déjà été partagé par MartySama. En réalité, celui-ci n'est pas complet, il a oublié un facteur très important que je vous présenterai par la suite.

 

Mais du coup, vous devez vous demander ce qu'il ce passe si on désactive l'encryption des packets, par la manière dont il l'a partagé ? Et bien, on risque d'avoir une surcharge au niveau des buffers, ce qui risque d'entraîner des crashs game sans erreur ou encore des bugs assez étranges.

 

J'ai pu apercevoir différents bugs étranges. Le plus fréquent, c'était le fait qu'on ne puisse plus exécuter une action qui nécessite un accord avec le game. Exemple, au bout de 15 minutes de jeu avec quelques joueurs connectés, certains ne pourront plus cliquer sur un item, ou d'autres ne pourront plus parler, etc ...

 

Il y a eu beaucoup de débats sur ça, j'ai pris des avis à gauche et à droite et j'en ai tiré une problématique.

 

Pré-requis:

  • Vos sources serveur
  • Vos sources client

I. Explication

Révélation

Pourquoi ces bugs n'étaient pas présents avant l'encryption des packets ?

 

Tout simplement parce que la structure a été éditée !

En effet, on peut apercevoir que dans le protocol.h du Game, la fonction buffer_adjust_size a été commentée.

Également, dans le desc.cpp, ils ont complètement supprimé la condition dans la fonction :

void DESC::Packet

Mais pourquoi ?  Tout simplement car elle ne sert plus à rien, le nouveau système ne nécessite plus d'ajusteur de taille pour les buffers ( il me semble )

Ou alors, ils ont codé autre chose qui permet de régler automatiquement la taille des buffers mais j'ai pas encore regardé.

 

Pourquoi désactiverais-je ce système ? 

  • Temps de connexion LARGEMENT diminué ( vue qu'on n'utilise plus Cipher )
  • Temps de chargement diminué également
  • Meilleure fluidité (avis personnel)
  • Taille du game énormément diminuée ainsi que celle du lanceur
 
Voici une petite vidéo d'aperçu :
 

 

II. Modifications côté Serveur

Révélation

 

A. Fichier service.h (Common)

Révélation

Cherchez donc cette ligne :

#define _IMPROVED_PACKET_ENCRYPTION_

Et commentez la ligne comme ceci :

//#define _IMPROVED_PACKET_ENCRYPTION_

Sauvegardez !

 

B. Fichier protocol.h (Game)

Révélation

Cherchez la ligne suivante :

//buffer_adjust_size(pbuf, length);

Décommentez la comme ceci :

buffer_adjust_size(pbuf, length);

Sauvegardez !

 

C. Fichier desc.cpp (Game)

Révélation

Cherchez la ce code :

void DESC::Packet(const void * c_pvData, int iSize)

Remplacez l'intégralité de la fonction par ceci :

void DESC::Packet(const void * c_pvData, int iSize)
{
	assert(iSize > 0);

	if (m_iPhase == PHASE_CLOSE) // 끊는 상태면 보내지 않는다.
		return;

	if (m_stRelayName.length() != 0)
	{
		// Relay 패킷은 암호화하지 않는다.
		TPacketGGRelay p;

		p.bHeader = HEADER_GG_RELAY;
		strlcpy(p.szName, m_stRelayName.c_str(), sizeof(p.szName));
		p.lSize = iSize;

		if (!packet_encode(m_lpOutputBuffer, &p, sizeof(p)))
		{
			m_iPhase = PHASE_CLOSE;
			return;
		}

		m_stRelayName.clear();

		if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize))
		{
			m_iPhase = PHASE_CLOSE;
			return;
		}
	}
	else
	{
		if (m_lpBufferedOutputBuffer)
		{
			buffer_write(m_lpBufferedOutputBuffer, c_pvData, iSize);

			c_pvData = buffer_read_peek(m_lpBufferedOutputBuffer);
			iSize = buffer_size(m_lpBufferedOutputBuffer);
		}

		// TRAFFIC_PROFILE
		if (g_bTrafficProfileOn)
			TrafficProfiler::instance().Report(TrafficProfiler::IODIR_OUTPUT, *(BYTE *) c_pvData, iSize);
		// END_OF_TRAFFIC_PROFILER

#ifdef _IMPROVED_PACKET_ENCRYPTION_
		void* buf = buffer_write_peek(m_lpOutputBuffer);

		
		if (packet_encode(m_lpOutputBuffer, c_pvData, iSize))
		{
			if (cipher_.activated()) {
				cipher_.Encrypt(buf, iSize);
			}
		}
		else
		{
			m_iPhase = PHASE_CLOSE;
		}
#else
		if (!m_bEncrypted)
		{
			if (!packet_encode(m_lpOutputBuffer, c_pvData, iSize))
			{
				m_iPhase = PHASE_CLOSE;
			}
		}
		else
		{
			if (buffer_has_space(m_lpOutputBuffer) < iSize + 8)
			{
				buffer_adjust_size(m_lpOutputBuffer, iSize);

				if (buffer_has_space(m_lpOutputBuffer) < iSize + 8)
				{
					sys_err(
					"desc buffer mem_size overflow : ",
					"	memsize(%u) ",
					"	write_pos(%u)",
					"	iSize(%d)", 
					m_lpOutputBuffer->mem_size,
					m_lpOutputBuffer->write_point_pos,
					iSize);

					m_iPhase = PHASE_CLOSE;
				}
			}
			else
			{
				// 암호화에 필요한 충분한 버퍼 크기를 확보한다.
				/* buffer_adjust_size(m_lpOutputBuffer, iSize + 8); */
				DWORD * pdwWritePoint = (DWORD *) buffer_write_peek(m_lpOutputBuffer);

				if (packet_encode(m_lpOutputBuffer, c_pvData, iSize))
				{
					int iSize2 = TEA_Encrypt(pdwWritePoint, pdwWritePoint, GetEncryptionKey(), iSize);

					if (iSize2 > iSize)
						buffer_write_proceed(m_lpOutputBuffer, iSize2 - iSize);
				}
			}
		}
#endif // _IMPROVED_PACKET_ENCRYPTION_

		SAFE_BUFFER_DELETE(m_lpBufferedOutputBuffer);
	}

	//sys_log(0, "%d bytes written (first byte %d)", iSize, *(BYTE *) c_pvData);
	if (m_iPhase != PHASE_CLOSE)
		fdwatch_add_fd(m_lpFdw, m_sock, this, FDW_WRITE, true);
}

 

Sauvegardez !

 

Attention ! N'oubliez pas de compiler votre Game & votre DB

 

 

 

III. Modifications côté Client

Révélation

 

A. Fichier ServiceDefs.h (Eterpack)

Révélation

Cherchez cette ligne

#define _IMPROVED_PACKET_ENCRYPTION_

Et commentez la comme ceci :

//#define _IMPROVED_PACKET_ENCRYPTION_

 

B. Fichier Locale.cpp (UserInterface)

Révélation

Cherchez la ligne suivante : 

#define LSS_SECURITY_KEY    "testtesttesttest"

Éditez la comme ceci :

#define LSS_SECURITY_KEY    "1234abcd5678efgh" 

 

 

Attention ! N'oubliez pas de compiler votre lanceur !

 

 

Pour continuer:

Si vous avez un problème n'hésitez pas à poster vos questions dans l'AQS.

Si vous ne savez pas comment compiler votre Game & Db voici un tutoriel : Compiler le game & DB metin2

Si vous ne savez pas compiler votre lanceur voici donc un tutoriel : Compiler le client Binary

  • Metin2 Dev 1
  • Love 5
Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...


  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.