From 23fbcb54a83cf9690c8b53ec3b1567daf70007ad Mon Sep 17 00:00:00 2001 From: Yuval Nativ Date: Wed, 14 Dec 2016 16:03:35 +0700 Subject: [PATCH] So, Python3 as well --- .gitignore | 200 ++---------------------------------- imports/db_handler.py | 12 +-- imports/eula_handler.py | 4 +- imports/globals.py | 18 +++- imports/manysearches.py | 6 +- imports/muchmuchstrings.py | 25 ++--- imports/terminal_handler.py | 55 +++++----- imports/update_handler.py | 33 +++--- requirements.txt | 1 + theZoo.py | 6 +- 10 files changed, 102 insertions(+), 258 deletions(-) create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 92db09e..3724e6c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,195 +1,23 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata bin/ tmp/ *.idea/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others +*.pydevproject +*.pyd +*.pyc +.DS_Store +__pycache__ sql/ *.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares $RECYCLE.BIN/ +Desktop.ini +conf/eula_run.conf -# Mac crap -.DS_Store +# Egg +logo/ -############# -## Python -############# - *.py[co] - # Packages *.egg *.egg-info @@ -204,13 +32,3 @@ develop-eggs/ # Installer logs pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg diff --git a/imports/db_handler.py b/imports/db_handler.py index de11d8f..f5fe903 100644 --- a/imports/db_handler.py +++ b/imports/db_handler.py @@ -10,7 +10,7 @@ class DBHandler: self.con = lite.connect(globals.vars.db_path) self.cur = self.con.cursor() except lite.Error as e: - print "An error occurred:", e.args[0] + print("An error occurred:", e.args[0]) sys.exit() def get_full_details(self): @@ -21,7 +21,7 @@ class DBHandler: def get_mal_list(self): return self.cur.execute("SELECT ID, NAME, TYPE From Malwares").fetchall() - + def get_mal_names(self): # Sqlite3 returns a tuple even if a single value is returned @@ -36,14 +36,14 @@ class DBHandler: def query(self, query, param=''): if globals.vars.DEBUG_LEVEL is 2: - print locals() + print(locals()) try: if param is not '': return self.cur.execute(query, param if type(param) is list else [param]).fetchall() else: return self.cur.execute(query).fetchall() except lite.Error as e: - print "An error occurred:", e.args[0] + print("An error occurred:", e.args[0]) sys.exit() def close_connection(self): @@ -52,7 +52,7 @@ class DBHandler: self.con.close() return except lite.Error as e: - print "An error occurred:", e.args[0] + print("An error occurred:", e.args[0]) sys.exit() def renew_connection(self): @@ -60,5 +60,5 @@ class DBHandler: self.con = lite.connect(globals.vars.db_path) self.cur = self.con.cursor() except lite.Error as e: - print "An error occurred:", e.args[0] + print("An error occurred:", e.args[0]) sys.exit() diff --git a/imports/eula_handler.py b/imports/eula_handler.py index 4319dcd..57d9a12 100644 --- a/imports/eula_handler.py +++ b/imports/eula_handler.py @@ -50,12 +50,12 @@ class EULA: notice += '|you can control and know how to handle. Running them on a live system will |\n' notice += '|infect you machines will live and dangerous malwares!. |\n' notice += '|___________________________________________________________________________|\n' - print red(notice) + print(red(notice)) eula_answer = raw_input( 'Type YES in captial letters to accept this EULA.\n > ') if eula_answer == 'YES': new = open(globals.vars.eula_file, 'a') new.write(eula_answer) else: - print 'You need to accept the EULA.\nExiting the program.' + print('You need to accept the EULA.\nExiting the program.') sys.exit(0) diff --git a/imports/globals.py b/imports/globals.py index 539257b..4e5a3b0 100644 --- a/imports/globals.py +++ b/imports/globals.py @@ -27,8 +27,10 @@ class init: appname = "theZoo" codename = "Moat" authors = "Yuval Nativ, Lahad Ludar, 5fingers" + maintainers = [ "Shahak Shalev", "Yuval Nativ" ] + github_add = "https://www.github.com/ytisf/theZoo" licensev = "GPL v3.0" - fulllicense = appname + " Copyright (C) 2014 " + authors + "\n" + fulllicense = appname + " Copyright (C) 2016 " + authors + "\n" fulllicense += "This program comes with ABSOLUTELY NO WARRANTY; for details type '" + \ sys.argv[0] + " -w'.\n" fulllicense += "This is free software, and you are welcome to redistribute it." @@ -65,6 +67,8 @@ class vars: version = "0.6.0 'Moat'" appname = "Malware DB" authors = "Yuval Nativ, Lahad Ludar, 5fingers" + maintainers = [ "Shahak Shalev", "Yuval Nativ" ] + github_add = "https://www.github.com/ytisf/theZoo" licensev = "GPL v3.0" ############ DEBUGGING ############### @@ -75,7 +79,7 @@ class vars: # DEBUG_LEVEL 2 = DEBUG SQL QUERIES DEBUG_LEVEL = 0 - fulllicense = appname + " Copyright (C) 2014 " + authors + "\n" + fulllicense = appname + " Copyright (C) 2016 " + authors + "\n" fulllicense += "This program comes with ABSOLUTELY NO WARRANTY; for details type '" + \ sys.argv[0] + " -w'.\n" fulllicense += "This is free software, and you are welcome to redistribute it." @@ -98,7 +102,7 @@ class vars: giturl_dl = 'https://github.com/ytisf/theZoo/raw/master/' giturl = 'https://github.com/ytisf/theZoo' - with file(maldb_ver_file) as f: + with open(maldb_ver_file, 'r') as f: db_ver = f.read() # ASCII Art is a must... @@ -118,7 +122,9 @@ class vars: maldb_banner += " NMM- sMMy``````````````sMMy .MMM\n" maldb_banner += " ooo. :ooooooo+ +ooooooo/ `ooo\n" maldb_banner += " /MMMMN mMMMM+ \n" - maldb_banner += " Authors: " + authors + "\n" + maldb_banner += " authors: " + authors + "\n" + maldb_banner += " maintained by: " + ', '.join(maintainers) + "\n" + maldb_banner += " github: " + giturl + "\n\n" elif screen is 2: maldb_banner = " ____.----. \n" @@ -149,4 +155,6 @@ class vars: maldb_banner += " /_/ /_/\__,_/_/ |__/|__/\__,_/_/ \___/ /_____/_____/\n\n" maldb_banner += " version: " + version + "\n" maldb_banner += " db_version: " + db_ver + "\n" - maldb_banner += " built by: " + authors + "\n\n" \ No newline at end of file + maldb_banner += " built by: " + authors + "\n" + maldb_banner += " maintained by: " + ', '.join(maintainers) + "\n" + maldb_banner += " github: " + giturl + "\n\n" diff --git a/imports/manysearches.py b/imports/manysearches.py index 6bacf21..2d7b645 100644 --- a/imports/manysearches.py +++ b/imports/manysearches.py @@ -45,7 +45,7 @@ class MuchSearch(object): self.ar = self.db.query(self.prequery + self.query, [self.param]) self.print_payloads(self.ar) else: - print red("[!]") + " Filter did not match any malware :(\n" + print(red("[!]") + " Filter did not match any malware :(\n") return self.hits @@ -65,5 +65,5 @@ class MuchSearch(object): table.align = "l" for malware in m: table.add_row(malware) - print table - print bold(green("[+]")) + " Total records found: %s" % len(m) + "\n" + print(table) + print(bold(green("[+]")) + " Total records found: %s" % len(m) + "\n") diff --git a/imports/muchmuchstrings.py b/imports/muchmuchstrings.py index 57755e1..7e5dc17 100644 --- a/imports/muchmuchstrings.py +++ b/imports/muchmuchstrings.py @@ -22,21 +22,22 @@ from imports import globals class banners: def print_license(self): - print "" - print globals.vars.fulllicense - print "" + print("") + print(globals.vars.fulllicense) + print("") def versionbanner(self): - print "" - print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - print "\t\t " + globals.vars.appname + ' v' + globals.vars.version - print "Built by:\t\t" + globals.vars.authors - print "Is licensed under:\t" + globals.vars.licensev - print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - print globals.vars.fulllicense - print globals.vars.usage + print("") + print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + print("\t\t " + globals.vars.appname + ' v' + globals.vars.version) + print("Built by:\t\t" + globals.vars.authors) + print("Maintained by:\t\t" + ', '.join(globals.vars.maintainers)) + print("Is licensed under:\t" + globals.vars.licensev) + print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + print(globals.vars.fulllicense) + print(globals.vars.usage) def print_available_payloads(self, array): answer = str(array[globals.vars.column_for_uid]) + "\t" + str(array[globals.vars.column_for_name]) + "\t" + str(array[globals.vars.column_for_version]) + "\t\t" answer += str(array[globals.vars.column_for_location]) + "\t\t" + str(array[globals.vars.colomn_for_time]) - print answer + print(answer) diff --git a/imports/terminal_handler.py b/imports/terminal_handler.py index f3f37d9..9830f24 100644 --- a/imports/terminal_handler.py +++ b/imports/terminal_handler.py @@ -1,17 +1,25 @@ -import sys import re +import sys import rlcompleter try: import readline except ImportError: from imports import winreadline as readline -import globals +from imports import globals from imports import manysearches from imports.update_handler import Updater from imports import db_handler from imports.colors import * +# Compatilibility to Python3 +if sys.version_info.major == 3: + raw_input = input +elif sys.version_info.major == 2: + pass +else: + sys.stderr.write("What kind of sorcery is this?!\n") + class Controller: @@ -59,7 +67,7 @@ class Controller: cmd = raw_input( bold(green('mdb ')) + green('#> ')).strip() except KeyboardInterrupt: - print bold(blue("\n\n[*]")) + " Hope you enjoyed your visit at" + bold(red(" theZoo")) + "!" + print(bold(blue("\n\n[*]")) + " Hope you enjoyed your visit at" + bold(red(" theZoo")) + "!") exit() self.actOnCommand(cmd) @@ -67,14 +75,13 @@ class Controller: def actOnCommand(self, cmd): try: while cmd == "": - # print 'no cmd' return if cmd == 'help': - print " Available commands:\n" + print(" Available commands:\n") for (cmd, desc) in self.commands: - print "\t%s\t%s" % ('{0: <12}'.format(cmd), desc) - print '' + print("\t%s\t%s" % ('{0: <12}'.format(cmd), desc)) + print('') return # Checks if normal or freestyle search @@ -84,7 +91,7 @@ class Controller: args = cmd.rsplit(' ')[1:] manySearch.sort(args) except: - print red('[!]') + 'Uh oh, Invalid query.' + print(red('[!]') + 'Uh oh, Invalid query.') return if cmd == 'exit': @@ -121,15 +128,15 @@ class Controller: email = "info" email += "\x40" email += "morirt\x2ecom" - print "-------------- Begin of theZoo Report --------------" - print report - print "-------------- Ending of theZoo Report --------------" - print "To avoid compromising your privacy we have chose this method of reporting." - print "If you have not stated your name we will not write a thanks in our README." - print "Your email will remain private in scenario and will not be published." - print "" - print "Please create an archive file with the structure described in the README file" - print "And attach it to the email. " + print("-------------- Begin of theZoo Report --------------") + print(report) + print("-------------- Ending of theZoo Report --------------") + print("To avoid compromising your privacy we have chose this method of reporting.") + print("If you have not stated your name we will not write a thanks in our README.") + print("Your email will remain private in scenario and will not be published.") + print("") + print("Please create an archive file with the structure described in the README file") + print("And attach it to the email. ") print("Please send this report to %s" % email) return @@ -139,7 +146,7 @@ class Controller: try: update_handler.get_malware(self.currentmodule) except: - print red('[-] ') + 'Error getting malware.' + print(red('[-] ') + 'Error getting malware.') return # If used the 'use' command if re.match('^use', cmd): @@ -148,20 +155,20 @@ class Controller: self.currentmodule = int(cmd[1]) cmd = '' except TypeError: - print 'Please enter malware ID' + print('Please enter malware ID') except: - print 'The use method needs an argument.' + print('The use method needs an argument.') return if cmd == 'list all': - print "\nAvailable Payloads:" + print("\nAvailable Payloads:") manySearch = manysearches.MuchSearch() manySearch.print_payloads(self.db.get_mal_list(), ["%", "Name", "Type"]) return if cmd == 'info': if self.currentmodule is None: - print red("[!] ") + "First select a malware using the \'use\' command" + print(red("[!] ") + "First select a malware using the \'use\' command") return m = self.db.get_mal_info(self.currentmodule) manySearch = manysearches.MuchSearch() @@ -169,9 +176,9 @@ class Controller: return if cmd == 'quit': - print ":(" + print(":(") sys.exit(1) except KeyboardInterrupt: - print ("\n\nI'll just go now...") + print("\n\nI'll just go now...") sys.exit() diff --git a/imports/update_handler.py b/imports/update_handler.py index 5ecffde..188c977 100644 --- a/imports/update_handler.py +++ b/imports/update_handler.py @@ -18,7 +18,16 @@ import sys from os import remove, rename -import urllib2 + +# Compatilibility to Python3 +if sys.version_info.major == 3: + from urllib.request import urlopen +elif sys.version_info.major == 2: + from urllib2 import urlopen + import urllib2 +else: + sys.stderr.write("What kind of sorcery is this?!\n") + from imports import globals from imports import db_handler from imports.colors import * @@ -46,16 +55,16 @@ class Updater: :return: ''' if globals.vars.DEBUG_LEVEL is 1: - print locals() - response = urllib2.urlopen( + print(locals()) + response = urlopen( globals.vars.giturl_dl + globals.vars.maldb_ver_file) new_maldb_ver = response.read() if new_maldb_ver == curr_db_version: - print green('[+]') + " theZoo is up to date.\n" + green('[+]') + " You are at " + new_maldb_ver + " which is the latest version." + print(green('[+]') + " theZoo is up to date.\n" + green('[+]') + " You are at " + new_maldb_ver + " which is the latest version.") return - print red('[+]') + " A newer version is available: " + new_maldb_ver + "!" - print red('[+]') + " Updating..." + print(red('[+]') + " A newer version is available: " + new_maldb_ver + "!") + print(red('[+]') + " Updating...") # Get the new DB and update it @@ -84,11 +93,11 @@ class Updater: self.download_from_repo(loc, '.pass') self.download_from_repo(loc, '.md5') self.download_from_repo(loc, '.sha256') - print bold(green("[+]")) + " Successfully downloaded a new friend.\n" - + print(bold(green("[+]")) + " Successfully downloaded a new friend.\n") + def download_from_repo(self, filepath, suffix=''): if globals.vars.DEBUG_LEVEL is 1: - print locals() + print(locals()) file_name = filepath.rsplit('/')[-1] + suffix # Dirty way to check if we're downloading a malware @@ -97,11 +106,11 @@ class Updater: url = globals.vars.giturl_dl + filepath + '/' + file_name else: url = globals.vars.giturl_dl + filepath - u = urllib2.urlopen(url) + u = urlopen(url) f = open(file_name, 'wb') meta = u.info() file_size = int(meta.getheaders("Content-Length")[0]) - print "Downloading: %s Bytes: %s" % (file_name, file_size) + print("Downloading: %s Bytes: %s" % (file_name, file_size)) file_size_dl = 0 block_sz = 8192 while True: @@ -115,4 +124,4 @@ class Updater: status = status + chr(8) * (len(status) + 1) sys.stdout.write('\r' + status) f.close() - print "\n" + print("\n") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9856939 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +urllib2 diff --git a/theZoo.py b/theZoo.py index 29ed640..b5280cb 100644 --- a/theZoo.py +++ b/theZoo.py @@ -82,7 +82,7 @@ def main(): # Check if version flag is on if arguments.ver_bol == 1: - print vars.maldb_banner + print(vars.maldb_banner) sys.exit(1) # Check if license flag is on @@ -92,13 +92,13 @@ def main(): if len(arguments.mal_filter) > 0: manySearch = manysearches.MuchSearch() - print vars.maldb_banner + print(vars.maldb_banner) manySearch.sort(arguments.mal_filter) sys.exit(1) # Initiate normal run. No arguments given. os.system('cls' if os.name == 'nt' else 'clear') - print vars.maldb_banner + print(vars.maldb_banner) while 1: terminalHandler.MainMenu() sys.exit(1)