Programación en Pawn - SAMP

[C] Stella Firewall ((Lo encontre gg))

Aquí podrás publicar temas sobre programación en general (C++, JAVA, Python, etc), que no encajen en el apartado Programación Web.
Bueno, sin mas nada que decir, navegando en Google, encontré este script del año de los dinosaurios, ni le he probado, pero según tengo entendido servía en su época (No se si ahora también) y se perdió el link con el tiempo.
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243

/* Minimal version of Stella Firewall, protection to query flood for SA-MP 0.3e */
/* By Kevin R.V <kevin.nullbyte@gmail.com> <kevin_seguridad0@hotmail.com> */

#include<stdio.h>	//For standard things
#include<stdlib.h>	//malloc
#include<string.h>	//memset
#include<netinet/ip_icmp.h>	//Provides declarations for icmp header
#include<netinet/udp.h>	//Provides declarations for udp header
#include<netinet/tcp.h>	//Provides declarations for tcp header
#include<netinet/ip.h>	//Provides declarations for ip header
#include<sys/socket.h>
#include<arpa/inet.h>
#include<pthread.h>
//V2
#define MAX_QUERYS 350
#define MAX_INCOMINGS 12

void ProcessPacket(unsigned char* , int);
void print_ip_header(unsigned char* , int);
void process_udp_packet(unsigned char * , int);
void *TimerCheck( void *ptr );
void SampQueryPacket(char * szHost, u_short port);
void SampIncomingPackets(char * szHost, u_short port);
void AddIncomingPacket(char * szHost);
int sock_raw;
void Ban(char * szHost);
void Reload();
int CheckIfExists(char * szHost);
void AddQueryPacket(char * szHost);
int tcp=0,udp=0,icmp=0,others=0,igmp=0,total=0,j;
struct sockaddr_in source,dest;

struct userPackets
{	
	char              szHost[30];
	long int   IncomingPackets;
	long int      QueryPackets;
	
};

struct userPackets ddosInfo[700];

int main()
{
	Reload();
	pthread_t thread1;
	pthread_create( &thread1, NULL, TimerCheck, NULL);
	int saddr_size , data_size;
	struct sockaddr saddr;
	struct in_addr in;
	
	unsigned char *buffer = (unsigned char *)malloc(65536); //Its Big!
	
	
	printf("Starting Stella Firewall BETA v0.1...\n");
	sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);
	if(sock_raw < 0)
	{
		printf("Socket Error\n");
		return 1;
	}
	while(1)
	{
		saddr_size = sizeof saddr;
		data_size = recvfrom(sock_raw , buffer , 65536 , 0 , &saddr , &saddr_size);
		if(data_size <0 )
		{
			printf("Recvfrom error , failed to get packets\n");
			return 1;
		}
		ProcessPacket(buffer , data_size);
	}
	close(sock_raw);
	return 0;
}

void ProcessPacket(unsigned char* buffer, int size)
{
	struct iphdr *iph = (struct iphdr*)buffer;
	++total;
	switch (iph->protocol)
	{
		
		case 17: //UDP Protocol
			++udp;
			process_udp_packet(buffer , size);
			break;
		
		default: 
		break;
	}
}

void process_udp_packet(unsigned char *Buffer , int Size)
{
	
	unsigned short iphdrlen;
	
	struct iphdr *iph = (struct iphdr *)Buffer;
	iphdrlen = iph->ihl*4;
	
	memset(&source, 0, sizeof(source));
	source.sin_addr.s_addr = iph->saddr;
	
	memset(&dest, 0, sizeof(dest));
	dest.sin_addr.s_addr = iph->daddr;
	struct udphdr *udph = (struct udphdr*)(Buffer + iphdrlen);
	char * Packet = &Buffer[4] + iphdrlen + sizeof udph;
	int len_pkt = ( Size - sizeof udph - iph->ihl * 4 );
	Packet[len_pkt] = '\0';
	
	if (Packet[0] == 0x28)
	{
			if ( ntohs(udph->len) == 12 )
			{
				SampIncomingPackets(inet_ntoa(source.sin_addr),ntohs(udph->dest));
			}
	}
	
	else if ( Packet[0] == 'S' && Packet[1] == 'A' && Packet[2] == 'M' && Packet[3] == 'P' )
	{
		SampQueryPacket(inet_ntoa(source.sin_addr),ntohs(udph->dest));
	} 
}

void Reload()
{
	int i = 0;
	for(i = 0; i<700; i++)
	{
		strcpy(ddosInfo[i].szHost, "127.0.0.1");
		ddosInfo[i].IncomingPackets = 0;
		ddosInfo[i].QueryPackets = 0;
	}
	
	
}
int CheckIfExists(char * szHost)
{
	int i = 0;
	for(i = 0; i<700; i++)
	{
		if ( strcmp(ddosInfo[i].szHost, szHost) == 0 )
		return i;
	}
	return -1;
}

void *TimerCheck( void *ptr )
{
	while(1)
	{
		sleep(6);
		Reload();
	}
	
}

void Ban(char * szHost)
{
	printf("Attack from: %s, blocking it...\n", szHost);
	char cmd[50];
	memset(cmd, 0, sizeof(cmd));
	sprintf(cmd, "iptables -A INPUT -s %s -j DROP", szHost);
	system(cmd);
}


void AddQueryPacket(char * szHost)
{
	
	int check = CheckIfExists(szHost);
	if ( check != -1)
	{
		ddosInfo[check].QueryPackets++;
		if ( ddosInfo[check].QueryPackets > MAX_QUERYS )
		Ban(ddosInfo[check].szHost);
	}
	else
	{
		int i = 0;
		for(i = 0; i<700; i++)
		{
			if ( strcmp(ddosInfo[i].szHost, "127.0.0.1") == 0 )
			{
				strcpy(ddosInfo[i].szHost, szHost);
				ddosInfo[i].IncomingPackets = 0;
				ddosInfo[i].QueryPackets = 1;
				break;
			}
		}
		
	}
	
	
}

void AddIncomingPacket(char * szHost)
{
	
	int check = CheckIfExists(szHost);
	if ( check != -1)
	{
		ddosInfo[check].IncomingPackets++;
		 
		if ( ddosInfo[check].IncomingPackets > MAX_INCOMINGS )
		Ban(ddosInfo[check].szHost);
	}
	else
	{
		int i = 0;
		for(i = 0; i<700; i++)
		{
			if ( strcmp(ddosInfo[i].szHost, "127.0.0.1") == 0 )
			{
				strcpy(ddosInfo[i].szHost, szHost);
				ddosInfo[i].IncomingPackets = 1;
				ddosInfo[i].QueryPackets = 0;
				break;
			}
		}
		
	}	
	
	
}

void SampQueryPacket(char * szHost, u_short port)
{
	if ( port == 9355 )
	{
		AddQueryPacket(szHost);
	}
	
}

void SampIncomingPackets(char * szHost, u_short port)
{
	if ( port == 9355 )
	{
		AddIncomingPacket(szHost);
	}
}
  Cantidad de llaves: Abiertas(32)-Cerradas(32) | Lineas Totales: 243
"SA-MP 0.3e" que recuerdos jaja. Buen aporte amigo, quizá falto un poquito mas de información ya que alguien que no sepa no sabrá de que trata.
Recuerda que debes detallar exactamente que hace el código aportado, que requiere, etcétera.

No lo leí entero pero con algunas que otras funciones que leí ya me hago una idea de como funciona....
Ayuda como un anti bot spam(servidores llenos y toda esa basura).
Stella Firewall, es un Firewall que creó n3ptun0 hace años, su propio nombre lo dice, firewall, en su momento paraba los ataques DDoS a los servidores. No sé si el código aún funciona.

Saludos
Estas son las cosas que realmente merecen la pena liberar... No gamemodes que ni se van a usar en un servidor.
Básicamente es como un anti DDOS attack, pero no se testeó según decís, y puede que me dé fallas con bots...
Buen aporte..
Me sale 1 error
Juan88 escribió:
30 Nov 2017 16:04
Me sale 1 error
Si es algo sobre bind adress, es por que tienes otro o el mismo programa, ya corriendo a escucha de ese puerto.
Buen aporte tal vez lo use, dejando créditos claro.
Por la re-estructuración del foro, muevo el tema a la sección indicada.

¿Quién está conectado?

En total hay 1 usuario conectado :: 0 registrados, 0 ocultos y 1 invitado (basados en usuarios activos en los últimos 5 minutos)
La mayor cantidad de usuarios identificados fue 855 el 27 May 2018 00:03

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado