154 lines
4.3 KiB
C++
154 lines
4.3 KiB
C++
#include "stdafx.h"
|
|
#include "L2GamePacket.h"
|
|
|
|
L2GamePacket::L2GamePacket()
|
|
{
|
|
this->_initNull();
|
|
}
|
|
|
|
L2GamePacket::L2GamePacket( const unsigned char *bytes, unsigned int length )
|
|
{
|
|
this->_initNull();
|
|
this->setBytes( bytes, length );
|
|
}
|
|
|
|
// in Hellbound key must be 16-byte array
|
|
// key is changed after enc/dec procedure
|
|
bool L2GamePacket::decodeXOR( unsigned char *key )
|
|
{
|
|
if( !key ) return false;
|
|
unsigned int sz = this->getPacketSize();
|
|
unsigned int dsz = this->getDataSize();
|
|
if( sz < 3 ) return false;
|
|
unsigned char temp = 0, temp2 = 0;
|
|
unsigned int i = 0;
|
|
unsigned char *data = (unsigned char *)this->getBytesPtr();
|
|
// xor enc/dec from index 2 (pass 2 bytes - packet size)
|
|
data += 2;
|
|
for( i = 0; i < dsz; i++ )
|
|
{
|
|
temp2 = data[i];
|
|
data[i] = (temp2 ^ (key[i & 15]) ^ temp);
|
|
temp = temp2;
|
|
}
|
|
|
|
unsigned int old = 0;
|
|
old |= key[8] & 0x000000ff;
|
|
old |= (key[9] << 0x08) & 0x0000ff00;
|
|
old |= (key[10] << 0x10) & 0x00ff0000;
|
|
old |= (key[11] << 0x18) & 0xff000000;
|
|
|
|
//old += sz;
|
|
old += dsz; // key increases by data size
|
|
|
|
key[8] = (unsigned char)((old) & 0xff);
|
|
key[9] = (unsigned char)((old >> 0x08) & 0xff);
|
|
key[10] = (unsigned char)((old >> 0x10) & 0xff);
|
|
key[11] = (unsigned char)((old >> 0x18) & 0xff);
|
|
return true;
|
|
}
|
|
|
|
// in Hellbound key must be 16-byte array
|
|
// key is changed after enc/dec procedure
|
|
bool L2GamePacket::encodeXOR( unsigned char *key )
|
|
{
|
|
if( !key ) return false;
|
|
unsigned int sz = this->getPacketSize();
|
|
unsigned int dsz = this->getDataSize();
|
|
if( sz < 3 ) return false;
|
|
unsigned char temp = 0, temp2 = 0;
|
|
unsigned int i = 0;
|
|
unsigned char *data = (unsigned char *)this->getBytesPtr();
|
|
// xor enc/dec from index 2 (pass 2 bytes - packet size)
|
|
data += 2;
|
|
for( i = 0; i < dsz; i++ )
|
|
{
|
|
temp2 = data[i];
|
|
data[i] = (temp2 ^ (key[i & 15]) ^ temp );
|
|
temp = data[i];
|
|
}
|
|
|
|
unsigned int old = 0;
|
|
old |= key[8] & 0x000000ff;
|
|
old |= (key[9] << 0x08) & 0x0000ff00;
|
|
old |= (key[10] << 0x10) & 0x00ff0000;
|
|
old |= (key[11] << 0x18) & 0xff000000;
|
|
|
|
//old += sz;
|
|
old += dsz; // key increases by data size
|
|
|
|
key[8] = (unsigned char)((old) & 0xff);
|
|
key[9] = (unsigned char)((old >> 0x08) & 0xff);
|
|
key[10] = (unsigned char)((old >> 0x10) & 0xff);
|
|
key[11] = (unsigned char)((old >> 0x18) & 0xff);
|
|
return true;
|
|
}
|
|
|
|
bool L2GamePacket::decodeXOR_buffer( unsigned char *decodeBytes, unsigned int bytesLen,
|
|
unsigned char *key )
|
|
{
|
|
//if( !key ) return false;
|
|
unsigned int dsz = bytesLen - 2;
|
|
//if( sz < 3 ) return false;
|
|
unsigned char temp = 0, temp2 = 0;
|
|
unsigned int i = 0;
|
|
unsigned char *data = decodeBytes;
|
|
// xor enc/dec from index 2 (pass 2 bytes - packet size)
|
|
data += 2;
|
|
for( i = 0; i < dsz; i++ )
|
|
{
|
|
temp2 = data[i];
|
|
data[i] = (temp2 ^ (key[i & 15]) ^ temp);
|
|
temp = temp2;
|
|
}
|
|
|
|
unsigned int old = 0;
|
|
old |= key[8] & 0x000000ff;
|
|
old |= (key[9] << 0x08) & 0x0000ff00;
|
|
old |= (key[10] << 0x10) & 0x00ff0000;
|
|
old |= (key[11] << 0x18) & 0xff000000;
|
|
|
|
//old += sz;
|
|
old += dsz; // key increases by data size
|
|
|
|
key[8] = (unsigned char)((old) & 0xff);
|
|
key[9] = (unsigned char)((old >> 0x08) & 0xff);
|
|
key[10] = (unsigned char)((old >> 0x10) & 0xff);
|
|
key[11] = (unsigned char)((old >> 0x18) & 0xff);
|
|
return true;
|
|
}
|
|
|
|
bool L2GamePacket::encodeXOR_buffer( unsigned char *encodeBytes, unsigned int bytesLen,
|
|
unsigned char *key )
|
|
{
|
|
//if( !key ) return false;
|
|
unsigned int dsz = bytesLen - 2;
|
|
//if( sz < 3 ) return false;
|
|
unsigned char temp = 0, temp2 = 0;
|
|
unsigned int i = 0;
|
|
unsigned char *data = encodeBytes;
|
|
// xor enc/dec from index 2 (pass 2 bytes - packet size)
|
|
data += 2;
|
|
for( i = 0; i < dsz; i++ )
|
|
{
|
|
temp2 = data[i];
|
|
data[i] = (temp2 ^ (key[i & 15]) ^ temp );
|
|
temp = data[i];
|
|
}
|
|
|
|
unsigned int old = 0;
|
|
old |= key[8] & 0x000000ff;
|
|
old |= (key[9] << 0x08) & 0x0000ff00;
|
|
old |= (key[10] << 0x10) & 0x00ff0000;
|
|
old |= (key[11] << 0x18) & 0xff000000;
|
|
|
|
//old += sz;
|
|
old += dsz; // key increases by data size
|
|
|
|
key[8] = (unsigned char)((old) & 0xff);
|
|
key[9] = (unsigned char)((old >> 0x08) & 0xff);
|
|
key[10] = (unsigned char)((old >> 0x10) & 0xff);
|
|
key[11] = (unsigned char)((old >> 0x18) & 0xff);
|
|
return true;
|
|
}
|