Jump to content

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


Recommended Posts

Niveau requis Intermédiaire

Temps estimé : Entre 15 et 30 minutes

 

Réécriture by Xayah

 

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

  • Like 3

 

 

Github

Discord: Kuroro#9799

 

Link to post
  • 3 months later...

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


×
×
  • Create New...

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.