Code: Select all
#include <windows.h>
#include <winerror.h>
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#include <iostream>
#include <strstream>
using namespace std;
#define MAX_BUFFER 8192
char buf[MAX_BUFFER];
void DoRecv(SOCKET s)
{
int rVal = recv(s, buf, MAX_BUFFER - 1, 0);
if(rVal == SOCKET_ERROR)
{
switch(WSAGetLastError())
{
case WSAENOTCONN:
case WSAECONNRESET:
cerr << "socket not connected" << endl;
break;
case WSAESHUTDOWN:
cerr << "socket has been shut down" << endl;
break;
default:
cerr << "unknown error\n" << endl;
};
exit(1);
}
buf[rVal] = 0;
}
void DoSend(SOCKET s)
{
int rVal = send(s, buf, strlen(buf), 0);
if(rVal == SOCKET_ERROR)
{
cerr << "Failed send()\n";
exit(1);
}
}
const char *keySubst(const unsigned char* aKey, size_t len) {
static basic_string<unsigned char> temp;
if(temp.length() == 0) {
for(size_t i = 0; i<len; i++) {
if(aKey[i] == 0 || aKey[i]==5 || aKey[i]==124 || aKey[i]==96 || aKey[i]==126 || aKey[i]==36) {
temp += (unsigned char *)"/%DCN";
switch(aKey[i]) {
case 0: temp += (unsigned char *)"000"; break;
case 5: temp += (unsigned char *)"005"; break;
case 36: temp += (unsigned char *)"023"; break;
case 96: temp += (unsigned char *)"096"; break;
case 124: temp += (unsigned char *)"124"; break;
case 126: temp += (unsigned char *)"126"; break;
}
temp += (unsigned char *)"%/";
} else {
temp.push_back(aKey[i]);
}
}
}
return (const char *)temp.c_str();
// return new string((char*)temp.c_str(), temp.length());
}
const char* makeKey(const string& aLock) {
static const char nolock[] = "";
if(aLock.size() < 3)
return nolock;
basic_string<unsigned char> temp;
unsigned char v1;
v1 = (unsigned char)(aLock[0]^5);
v1 = (unsigned char)(((v1 >> 4) | (v1 << 4)) & 0xff);
temp.push_back(v1);
for(string::size_type i = 1; i<aLock.length(); i++) {
v1 = (unsigned char)(aLock[i]^aLock[i-1]);
v1 = (unsigned char)(((v1 >> 4) | (v1 << 4))&0xff);
temp.push_back(v1);
}
temp[0] = (unsigned char)(temp[0] ^ temp[aLock.length()-1]);
return keySubst(temp.c_str(), aLock.length());
}
int main()
{
WORD version = MAKEWORD(1,1);
WSADATA wsaData;
int rVal=0;
if(WSAStartup(version,(LPWSADATA)&wsaData) == SOCKET_ERROR) {
cerr << "Error initializing WINSOCK." << endl;
}
//store information about the server
LPHOSTENT hostEntry = gethostbyname("underhill.dyndns.dk");
if(!hostEntry)
{
cerr << "Failed gethostbyname()" << endl;
WSACleanup();
return -1;
}
//create the socket
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == SOCKET_ERROR)
{
cerr << "Failed socket()" << endl;
WSACleanup();
return -1;
}
//Fill in the sockaddr_in struct
SOCKADDR_IN serverInfo;
serverInfo.sin_family = PF_INET;
serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
serverInfo.sin_port = htons(411);
rVal = connect(s,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
if(rVal == SOCKET_ERROR)
{
cerr << "Failed connect()" << endl;
WSACleanup();
return -1;
}
cout << "Connected." << endl;
for(;;) {
DoRecv(s);
char _cmd[2048];
istrstream is(buf);
while(is.getline(_cmd, 2047, '|')) {
string cmd(_cmd);
if(cmd.compare(0, 5, "$Lock") == 0) {
string::size_type pos = cmd.find(" Pk=");
if(pos != string::npos) {
sprintf(buf, "$Key %s|$ValidateNick FUCKUP|", makeKey(cmd.substr(6, pos - 6)));
DoSend(s);
}
continue;
}
if(cmd.compare(0, 9, "$HubName ") == 0) {
continue;
}
if(cmd.compare(0, 8, "$GetPass") == 0) {
sprintf(buf, "$MyPass howard|");
DoSend(s);
continue;
}
if(cmd.compare(0, 8, "$BadPass") == 0) {
cerr << "Incorrect password!" << endl;
closesocket(s);
WSACleanup();
exit(1);
}
if(cmd.compare(0, 7, "$Hello ") == 0) {
sprintf(buf, "$MyINFO $ALL FUCKUP HUBBOT$ $DSL$$0$|");
DoSend(s);
continue;
}
if(cmd.compare(0, 9, "$LogedIn ") == 0) {
continue;
}
if(cmd.compare(0, 13, "$UserCommand ") == 0) {
continue;
}
cout << "CMD[" << cmd.c_str() << ']' << endl;
}
}
closesocket(s);
WSACleanup();
return 0;
}