Код:
VOID XorEncrypt(BYTE *data, DWORD len, BYTE *Key)
{
int temp = 0;
for( unsigned int i = 0; i < len; i++) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = data[i];
};
int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;
old += len;
Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
}
INT SendPacket(BYTE* buf, WORD size, SOCKET conn, DWORD EncodeType, DWORD EncodeData, DWORD TimeOut)
{
BYTE pbuf[65535];
memcpy(pbuf+2, buf, size);
size+=2;
memcpy(pbuf, &size, sizeof(WORD));
memcpy(buf, pbuf, size);
if (EncodeType == 1)
Blowfish_EncodeBlock((BLOWFISH_CTX*)EncodeData, pbuf+2, size-2);
if (EncodeType == 2)
XorEncrypt(pbuf+2, size-2, (BYTE*)EncodeData);
return SendNonBlock(conn, (CHAR*)pbuf, size, 0, TimeOut);
}
VOID GSCryptInit(BYTE *buf, DWORD size, BYTE *XorKeyEnc, BYTE *XorKeyDec)
{
BYTE KeyConst[8] = {0xC8, 0x27, 0x93, 0x01, 0xA1, 0x6C, 0x31, 0x97};
memcpy(XorKeyEnc, buf+4, 8);
memcpy(XorKeyDec, buf+4, 8);
memcpy(XorKeyEnc+8, KeyConst, 8);
memcpy(XorKeyDec+8, KeyConst, 8);
}
VOID GSAuthLogin(BYTE *buf, CHAR* Login, DWORD *SessionKey1, DWORD *SessionKey2, DWORD *SessionKey3, DWORD *SessionKey4, SOCKET s, BYTE *XorKeyEnc)
{
WCHAR ULogin[15];
swprintf(ULogin, 15, L"%hs", Login);
memset(buf, 0, 65535);
buf[0] = 0x2B;
memcpy(buf+1, ULogin, wcslen(ULogin)*2+2);
memcpy(buf+wcslen(ULogin)*2+3, SessionKey4, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+7, SessionKey3, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+11, SessionKey1, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+15, SessionKey2, sizeof(DWORD));
buf[wcslen(ULogin)*2+19]=0x08;
buf[wcslen(ULogin)*2+23]=0x7A;
buf[wcslen(ULogin)*2+24]=0x03;
buf[wcslen(ULogin)*2+31]=0x01;
SendPacket(buf, wcslen(ULogin)*2+35, s, 2, (DWORD)XorKeyEnc, 90);
}