Domanda [REL] 4Story packet encryption

Stato
Discussione chiusa ad ulteriori risposte.

d3vil401

Utente Platinum
3 Gennaio 2009
2,077
106
1,055
1,043
Ultima modifica da un moderatore:
Nel caso in cui vi servisse...

Codice:
void CPacket::Encrypt(INT64 key)
{
	if(!m_pHeader) return;

	INT64 llCheckSum = 0;
	DWORD dwDataSize = m_pHeader->m_wSize - PACKET_HEADER_SIZE;

	DWORD body = dwDataSize / sizeof(INT64);
	DWORD left = dwDataSize % sizeof(INT64);

	PINT64 lpBody = (PINT64)(m_pBuf + PACKET_HEADER_SIZE);
	for(DWORD i = 0; i < body; i++)
	{
		llCheckSum ^= lpBody[i];
		lpBody[i] ^= key;  
	}

	LPBYTE lpLeft = (LPBYTE)&lpBody[i];
	LPBYTE pchKey = (LPBYTE)&key;
	for(i = 0; i < left; i++)
	{
		llCheckSum ^=(BYTE)lpLeft[i]; 
		lpLeft[i] ^= (BYTE)pchKey[i];
	}

	m_pHeader->m_llChkSUM = llCheckSum;
}

void CPacket::EncryptHeader(INT64 key)
{
	if(!m_pHeader) return;

	LPBYTE lpHeader = (LPBYTE)((LPBYTE)m_pHeader+sizeof(WORD));
	WORD wID = m_pHeader->m_wID;
	for(BYTE i=0; i<PACKET_HEADER_SIZE-sizeof(WORD); i++)
	{
		if(i<2)
			lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wSize + i);
		else
			lpHeader[i] ^= (BYTE)(key + wID + i);
	}
}

BOOL CPacket::Decrypt(INT64 key)
{
	if(!m_pHeader) return FALSE;

	INT64 llCheckSum1 = 0;
	INT64 llCheckSum2 = m_pHeader->m_llChkSUM;
	DWORD dwDataSize = m_pHeader->m_wSize - PACKET_HEADER_SIZE;

	DWORD body = dwDataSize / sizeof(INT64);
	DWORD left = dwDataSize % sizeof(INT64);

	PINT64 lpBody = (PINT64)(m_pBuf + PACKET_HEADER_SIZE);
	for(DWORD i = 0; i < body; i++)
	{
		lpBody[i] ^= key;
		llCheckSum1 ^= lpBody[i];
	}

	LPBYTE lpLeft = (LPBYTE)&lpBody[i];
	LPBYTE pchKey = (LPBYTE)&key;
	for(i = 0; i < left; i++)
	{
		lpLeft[i] ^= (BYTE)pchKey[i];
		llCheckSum1 ^= (BYTE)lpLeft[i];
	}

	if( llCheckSum1 != llCheckSum2 ) return FALSE;

	return TRUE;
}

void CPacket::DecryptHeader(INT64 key)
{
	if(!m_pHeader) return;

	LPBYTE lpHeader = (LPBYTE)((LPBYTE)m_pHeader+sizeof(WORD));
	for(BYTE i=0; i<PACKET_HEADER_SIZE-sizeof(WORD); i++)
	{
		if(i<2)
			lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wSize + i);
		else
			lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wID + i);
	}
}
 
  • Mi piace
Reazioni: TheDark90
Stato
Discussione chiusa ad ulteriori risposte.