Counter Strike 1.6 HLDS fake , scris in C++ in anii 2010-2011.
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <vector>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#define SMALL_STACK 16384 //16K for threads stack-minimum
using namespace std;
// culori
char cyan[]="\033[1;36m";
char mov[]="\033[1;34m";
char red[]="\033[1;31m";
char yellow[]="\033[1;33m";
char alb[]="\033[0m";
char quote[]="\"";
// culori F
int sock;
int auto_cfg;
// variabile
char versiune[] = "winner";
char game_description[] = "Counter-Strike";
char ip[16],harta[32],hostname[64];
int port,jucatori,sloturi;
char ip_evidenta[]="188.215.51.20";
int developer = 0; // daca vine 1 prin argument printam si INPUT OUTPUT :)
char owner[32],drop[32];
// variabile F
vector<string> boti;
void steam_challange_response(sockaddr_in client);
void valve_challange_response(sockaddr_in client);
void connect(sockaddr_in client);
void server_details_valve(sockaddr_in client);
void server_details_steam(sockaddr_in client);
void players_details(sockaddr_in client);
void register_in_masters();
// functii ajutatoare
int random(int min, int max)
{
return (int)(rand() % (max + 1 - min) + min);
}
long byteToLong(char b[])
{
long int l;
memcpy( &l, b, sizeof b );
return l;
}
char *shortToByte(short a)
{
char* where = (char*)malloc(10);
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
return where;
}
void StringExplode(string str, string separator, vector<string>* results)
{
int found;
found = str.find_first_of(separator);
while(found != string::npos)
{
if(found > 0)
{
results->push_back(str.substr(0,found));
}
str = str.substr(found+1);
found = str.find_first_of(separator);
}
if(str.length() > 0)
{
results->push_back(str);
}
}
string char2hex( char dec )
{
char dig1 = (dec&0xF0)>>4;
char dig2 = (dec&0x0F);
if ( 0<= dig1 && dig1<= 9) dig1+=48; //0,48inascii
if (10<= dig1 && dig1<=15) dig1+=97-10; //a,97inascii
if ( 0<= dig2 && dig2<= 9) dig2+=48;
if (10<= dig2 && dig2<=15) dig2+=97-10;
string r;
r.append( &dig1, 1);
r.append( &dig2, 1);
return r;
}
string urlencode(const string &c)
{
string escaped="";
int max = c.length();
for(int i=0; i<max; i++)
{
if ( (48 <= c[i] && c[i] <= 57) ||//0-9
(65 <= c[i] && c[i] <= 90) ||//abc...xyz
(97 <= c[i] && c[i] <= 122) //ABC...XYZ
)
{
escaped.append( &c[i], 1);
}
else
{
escaped.append("%");
escaped.append( char2hex(c[i]) );//converts char 255 to string "ff"
}
}
return escaped;
}
// functii ajutatoare F
//evidenta CsServers.ro
void evidenta_alive()
{
char cmd[512];
int browser = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in evidenta;
evidenta.sin_family=AF_INET;
evidenta.sin_port = htons(80);
evidenta.sin_addr.s_addr = inet_addr(ip_evidenta);
connect(browser,(sockaddr *)&evidenta,sizeof(struct sockaddr));
std::string tq(owner);
string cp = urlencode(tq);
char *names = (char *)&cp[0];
sprintf(cmd,"GET /red3/alive.php?owner=%s&ip=%s&port=%d&drop=%s&versiune=%s HTTP/1.1%c%cHost:%s%c%cConnection: close%c%c%c%c",names,ip,port,drop,versiune,'\r','\n',"www.csservers.ro",'\r','\n','\r','\n','\r','\n');
send(browser,cmd,strlen(cmd),0);
close(browser);
}
void evidenta_new(char *jucator,char ip_jucator[15])
{
char cmd[512];
int browser = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in evidenta;
evidenta.sin_family=AF_INET;
evidenta.sin_port = htons(80);
evidenta.sin_addr.s_addr = inet_addr(ip_evidenta);
connect(browser,(sockaddr *)&evidenta,sizeof(struct sockaddr));
std::string tq(owner);
string cp = urlencode(tq);
char *names = (char *)&cp[0];
std::string tq1(jucator);
string cp1 = urlencode(tq1);
char *namesc = (char *)&cp1[0];
sprintf(cmd,"GET /red3/new.php?owner=%s&ip=%s&port=%d&drop=%s&jucator=%s&ip_jucator=%s&versiune=%s HTTP/1.1%c%cHost:%s%c%cConnection: close%c%c%c%c",names,ip,port,drop,namesc,ip_jucator,versiune,'\r','\n',"www.csservers.ro",'\r','\n','\r','\n','\r','\n');
send(browser,cmd,strlen(cmd),0);
close(browser);
}
//evidenta CsServers.ro
void finalizare_register_in_master(unsigned long challenge,struct sockaddr_in master)
{
char query[2];
bzero(&query,strlen(query));
query[0]=0x30;
query[1]=0x0a;
char query2[348];
strcpy(query2,"\\protocol\\7");
// sprintf(query2,"%s%s",query2,"\\protocol\\7");
char c[50];
sprintf(c,"\\challenge\\%ld",challenge);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\players\\%d",jucatori);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\max\\%d",sloturi);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\bots\\%d",0);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\gamedir\\cstrike");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\map\\%s",harta);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\password\\0");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\os\\l");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\lan\\0");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\region\\255");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\gameport\\%d",port);
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\specport\\0");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\appid\\10");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\type\\d");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\secure\\0");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\version\\1.1.2.6");
sprintf(query2,"%s%s",query2,c);
sprintf(c,"\\product\\cstrike");
sprintf(query2,"%s%s",query2,c);
char gsd[]={0x0a,0x00};
char fin[2+strlen(query2)+2];
memcpy(fin,query,2);
strcpy(fin+2,query2);
memcpy(fin+2+strlen(query2),gsd,2);
sendto(sock,fin,sizeof(fin),0,(struct sockaddr *)&master,(unsigned int)sizeof(sockaddr));
}
void *evidenta_si_mastere(void *c)
{
while(1)
{
register_in_masters();
evidenta_alive();
sleep(300);
}
}
int main(int argc, char *argv[])
{
// argumente
strcpy(hostname,argv[1]);
strcpy(ip,argv[2]);
port = atoi(argv[3]);
strcpy(harta,argv[4]);
jucatori = atoi(argv[5]);
sloturi = atoi(argv[6]);
strcpy(owner,argv[7]);
strcpy(drop,argv[8]);
if(argv[9])
developer = atoi(argv[9]);
// argumente
// trebuie sa citim botii din fisier
ifstream fisier_boti("boti.cfg");
for(int i=0;i<32;i++)
{
char nume_bot[50];
fisier_boti.getline(nume_bot,50);
boti.push_back(nume_bot);
}
fisier_boti.close();
// trebuie sa citim botii din fisier F
if(developer==1)
{
cout<<endl
<<yellow<<" [START REDIRECT SERVER] "<<endl<<endl
<<red<<" Hostname: "<<alb<<hostname<<endl
<<red<<" IP: "<<alb<<ip<<endl
<<red<<" Port: "<<alb<<port<<endl
<<red<<" Harta: "<<alb<<harta<<endl
<<red<<" Jucatori: "<<alb<<jucatori<<endl
<<red<<" Sloturi: "<<alb<<sloturi<<endl
<<red<<" Owner: "<<alb<<owner<<endl
<<red<<" Drop2: "<<alb<<drop<<endl;
}
struct sockaddr_in client;
struct sockaddr_in server;
char request[2048];
sock = socket(AF_INET,SOCK_DGRAM,0);
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(ip);
server.sin_port = htons(port);
bind(sock,(sockaddr *)&server,sizeof(server));
unsigned int client_length = sizeof(struct sockaddr_in);
// pthread
pthread_t changer;
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setstacksize(&thread_attr, SMALL_STACK);
pthread_t registerer;
int x2;
x2=pthread_create(®isterer,&thread_attr,evidenta_si_mastere,NULL);
// pthread F
evidenta_alive();
while(1)
{
if(recvfrom(sock,request,2048,0,(struct sockaddr *)&client,&client_length))
{
if(developer==1)
{
cout<<endl<<mov<<" <- "<<alb<<"["<<mov<<inet_ntoa(client.sin_addr)<<alb<<"]: "<<request;
}
char client_ip[15];
sprintf(client_ip,"%s",inet_ntoa(client.sin_addr));
if(request[17]=='s' && request[18]=='t' && request[19]=='e') // steam
{
steam_challange_response(client);
}
if(request[17]=='v' && request[18]=='a' && request[19]=='l') // valve
{
valve_challange_response(client);
}
if(request[4]=='c' && request[5]=='o' && request[6]=='n' && request[7]=='n') // connect 47/48
{
if(request[12]=='4' && request[13]=='7') // protocol 47
{
// e acelasi connect pt ambii
}
if(request[12]=='4' && request[13]=='8') // protocol 48
{
// e acelasi connect pt ambii
}
char *name_ptr = strstr(request,"name\\");
char n2[500];
strcpy(n2,name_ptr+5);
// char name[strlen(n2)-strlen(rr)+1];
char ns[50];
memset(ns,0x00,sizeof(ns));
int x=0;
while(n2[x]!='"'&&n2[x]!='\\'&&x<strlen(n2))
{
ns[x]=n2[x];
x++;
}
evidenta_new(ns,client_ip);
connect(client);
}
if(request[4]=='d' && request[5]=='e' && request[6]=='t' && request[7]=='a' && request[8]=='i' && request[9]=='l' && request[10]=='s') // server details VALVE
{
server_details_valve(client);
}
// ÿÿÿÿUÿÿÿÿce Engine Query
if(request[4]=='U') // players details
{
players_details(client);
}
// ÿÿÿÿTSource Engine Query
if(request[4]=='T' && request[5]=='S' && request[6]=='o' && request[7]=='u' && request[8]=='r' && request[9]=='c' && request[10]=='e') // server details STEAM (TSource Engine Query)
{
server_details_steam(client);
}
if(request[4]=='N') // register in master server
{
}
if(request[4]=='R')
{
//eroarea de la master: UDP heartbeats are no longer supported. Please update your server..
}
if(request[4]=='s')
{
char challenge[4];
challenge[0]=request[6];
challenge[1]=request[7];
challenge[2]=request[8];
challenge[3]=request[9];
//printam challenge
if(developer==1)
{
cout<<endl<<endl<<red<<" -> "<<alb<<"["<<red<<inet_ntoa(client.sin_addr)<<alb<<"]: "<<byteToLong(challenge)<<endl;
}
finalizare_register_in_master(byteToLong(challenge),client);
}
}
sleep(0.7);
}
pthread_detach( registerer );
if(auto_cfg==1)
pthread_detach( changer );
return 0;
}
void steam_challange_response(sockaddr_in client)
{
char cmd[] = { 0xff, 0xff, 0xff, 0xff, 'A', '0' , '0' , '0' , '0' , '0' , '0' , '0' , '0' , 0x20, '2', '3', '6', '2', '9', '6', '1', '4', '3', '8', 0x20, '3', 0x20, '1', 'm', 0x20, '3' };
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void valve_challange_response(sockaddr_in client)
{
char cmd[] = { 0xff, 0xff, 0xff, 0xff, 'A', '0' , '0' , '0' , '0' , '0' , '0' , '0' , '0' , 0x20, '5', '6', '9', '3', '3', '1', '0', '8', '6', 0x20, '2' };
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void connect(sockaddr_in client)
{
char cmd[50];
memset(cmd,0x00,sizeof(cmd));
char start[] = { 0xff, 0xff, 0xff, 0xff, 'L', 0x20 };
char stop[] = { 0x22, 0x20, 0x31, 0x00 };
memcpy(cmd,start,sizeof(start));
memcpy(cmd+sizeof(start),drop,sizeof(drop));
memcpy(cmd+(sizeof(start)+sizeof(drop)),stop,sizeof(stop));
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void server_details_valve(sockaddr_in client)
{
char query[5];
char num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1c,0x1d,0x1e,0x1f,0x20};
bzero(&query,strlen(query));
query[0]=0xff;
query[1]=0xff;
query[2]=0xff;
query[3]=0xff;
query[4]=0x6d;
char cmd[200];
int len=0;
bzero(&cmd,strlen(cmd));
memcpy(cmd,query,5);
len+=5;
char buf[100];
sprintf(buf,"127.0.0.1:%d",port);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
char sp6[1]={0x00};
memcpy(cmd+len,sp6,1);
len+=1;
char sp5[2]={0x01,0x01};
memcpy(cmd+len,sp5,2);
len+=2;
sprintf(buf,"%s",hostname);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp6,1);
len+=1;
sprintf(buf,"%s",harta);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp6,1);
len+=1;
sprintf(buf,"%s","cstrike");
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp6,1);
len+=1;
sprintf(buf,"%s",game_description);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
// free(sp2);
char sp3[23]={0x00,num[jucatori],num[sloturi],0x2f,0x64,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00};
memcpy(cmd+len,sp3,23);
len+=23;
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void server_details_steam(sockaddr_in client)
{
char query[6];
char num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1c,0x1d,0x1e,0x1f,0x20};
bzero(&query,strlen(query));
query[0]=0xff;
query[1]=0xff;
query[2]=0xff;
query[3]=0xff;
query[4]=0x49;
query[5]=0x30;
char cmd[348];
bzero(&cmd,strlen(cmd));
int len=0;
memcpy(cmd+len,query,6);
len+=6;
//char sp[2]= {0xc2,0x80};
char sp[2]= {0x01,0x01};
memcpy(cmd+len,sp,2);
len+=2;
char buf[100];
sprintf(buf,"%s",hostname);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
char sp2[1]={0x00};
memcpy(cmd+len,sp2,1);
len+=1;
sprintf(buf,"%s",harta);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp2,1);
len+=1;
sprintf(buf,"%s","cstrike");
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp2,1);
len+=1;
sprintf(buf,"%s",game_description);
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp2,1);
len+=1;
char sp3[]={0x0a,0x00,num[jucatori],num[sloturi],0x00,0x64,0x6c,0x00,0x01};
memcpy(cmd+len,sp3,sizeof(sp3));
len+=sizeof(sp3);
sprintf(buf,"%s","1.1.2.6/Stdio");
memcpy(cmd+len,buf,strlen(buf));
len+=strlen(buf);
memcpy(cmd+len,sp2,1);
len+=1;
char sp4[1]={0x80};
memcpy(cmd+len,sp4,sizeof(sp4));
len+=sizeof(sp4);
char *par = shortToByte((short)port);
memcpy(cmd+len,par,2);
len+=2;
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void players_details(sockaddr_in client)
{
char timp = 0x41;
char frag = random(1,115);
char cmd[] = {
0xff, 0xff, 0xff, 0xff, 0x44, 0x1d, 0x00,
'a', 'l', 'e', 'x', 0x00, frag, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'A', 0x00,
'g', 'i', 'g', 'i', 'z', '!', 0x00, frag, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'B', 0x00,
'p', 'u', 'l', 'a', 0x00, frag, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'C', 0x00,
'm', 'a', 't', 'a', 0x00, frag, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'D', 0x00,
'p', 'i', 'z', 'd', 'a', 0x00, frag, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'E', 0x00
};
sendto(sock,cmd,sizeof(cmd),0,(struct sockaddr *)&client,(unsigned int)sizeof(sockaddr));
}
void register_in_masters()
{
const int nr_mastere = 37;
char masters[nr_mastere][32] = {
"31.28.166.117:27010",
"31.28.170.123:27010", // 2.1
//"37.143.8.94:27010", // 2.1
"46.4.71.67:27010",
"46.38.57.227:27010", // 2.1
"46.38.63.6:27010", // 2.1
"46.149.46.168:27010", // 2.1
"46.165.194.14:27010",
"46.165.194.16:27010",
"46.165.194.225:27010",
"46.254.21.202:27010", // 2.1
"62.109.30.108:27010", // 2.1
"62.109.30.108:27011", // 2.1
//"69.28.158.131:27014", // 2.1
"78.46.63.214:27010",
"78.47.20.140:27010", // 2.1
"78.47.85.132:27010", // 2.1
"78.47.189.126:28010", // 2.1
"78.47.189.126:29012", // 2.1
"83.243.73.222:27010", // 2.1
"85.10.231.175:27010",
"89.20.147.157:27010", // 2.1
"89.28.42.226:27010", // 2.1
"89.108.101.63:27015", // 2.1
"89.137.241.79:27010",
"89.137.241.79:27011", // 2.1
//"91.150.72.233:27010", // 2.1
"95.211.153.82:27010", // 2.1
"92.243.95.195:27010",
"95.211.148.40:27010", // 2.1
"176.9.50.13:27010",
"178.63.65.159:27010", // 2.1
"178.236.137.96:27010",
"188.40.40.201:27010",
"188.120.245.247:27010", // 2.1
"188.127.232.88:27010", // 2.1
//"194.106.162.211:27011", // 2.1
"208.64.200.39:27011",
"208.64.200.52:27011",
"208.64.200.65:27015",
"208.64.200.117:27011"
//"208.64.200.118:27011"
};
for(int i=0;i<nr_mastere;i++)
{
struct sockaddr_in master;
master.sin_family=AF_INET;
vector<string> parts;
StringExplode(masters[i],":",&parts);
bzero(&master,sizeof(master));
master.sin_port = htons(atoi((char *)&parts[1][0]));
master.sin_addr.s_addr = inet_addr((char *)&parts[0][0]);
char cmd_start[] = { 0x4d, 0xff };
if(sendto(sock,cmd_start,sizeof(cmd_start),0,(struct sockaddr *)&master,(unsigned int)sizeof(sockaddr))<0)
{
cout<<endl<<"nu am putut inscrie serverul in master server"<<endl;
}
char cmd_stop[] = { 0x71 };
sendto(sock,cmd_stop,sizeof(cmd_stop),0,(struct sockaddr *)&master,(unsigned int)sizeof(sockaddr));
}
}