mirror of
https://github.com/dobin/SuperMega
synced 2026-06-02 17:27:10 +00:00
refactor: unify project handling (cmdline = projects/default)
This commit is contained in:
+1
-8
@@ -4,15 +4,8 @@ import yaml
|
|||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
from typing import List, Tuple
|
from typing import List, Tuple
|
||||||
from model.settings import Settings
|
|
||||||
from model.defs import *
|
from model.defs import *
|
||||||
|
from model.project import WebProject
|
||||||
|
|
||||||
class WebProject():
|
|
||||||
def __init__(self, name: str, settings: Settings):
|
|
||||||
self.name = name
|
|
||||||
self.settings: Settings = settings
|
|
||||||
self.comment: str = ""
|
|
||||||
|
|
||||||
|
|
||||||
class Storage():
|
class Storage():
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<select class="form-select" name="inject_style" aria-label="INJECTSTYLE">
|
<select class="form-select" name="inject_style" aria-label="INJECTSTYLE">
|
||||||
{% for name, value in injectstyles %}
|
{% for name, value in injectstyles %}
|
||||||
<option value="{{name}}"
|
<option value="{{name}}"
|
||||||
{% if value in project.settings.inject_style.value %} selected {% endif %}
|
{% if value in project.settings.inject_mode.value %} selected {% endif %}
|
||||||
>{{value}}</option>
|
>{{value}}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
+2
-23
@@ -9,7 +9,6 @@ from pygments.lexers import CLexer, NasmLexer, DiffLexer, HexdumpLexer
|
|||||||
from pygments.formatters import HtmlFormatter
|
from pygments.formatters import HtmlFormatter
|
||||||
import difflib
|
import difflib
|
||||||
from ansi2html import Ansi2HTMLConverter
|
from ansi2html import Ansi2HTMLConverter
|
||||||
import shutil
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -25,6 +24,7 @@ from phases.injector import verify_injected_exe
|
|||||||
from phases.compiler import compile_dev
|
from phases.compiler import compile_dev
|
||||||
from phases.assembler import asm_to_shellcode
|
from phases.assembler import asm_to_shellcode
|
||||||
from helper import run_process_checkret
|
from helper import run_process_checkret
|
||||||
|
from model.project import prepare_project
|
||||||
|
|
||||||
views = Blueprint('views', __name__)
|
views = Blueprint('views', __name__)
|
||||||
|
|
||||||
@@ -184,12 +184,6 @@ def add_project():
|
|||||||
decoder_style = request.form['decoder_style']
|
decoder_style = request.form['decoder_style']
|
||||||
settings.decoder_style = DecoderStyle[decoder_style]
|
settings.decoder_style = DecoderStyle[decoder_style]
|
||||||
|
|
||||||
exec_style = request.form['exec_style']
|
|
||||||
settings.exec_style = ExecStyle[exec_style]
|
|
||||||
|
|
||||||
inject_style = request.form['inject_style']
|
|
||||||
settings.inject_style = InjectStyle[inject_style]
|
|
||||||
|
|
||||||
if storage.get_project(project_name) != None:
|
if storage.get_project(project_name) != None:
|
||||||
# overwrite project
|
# overwrite project
|
||||||
project = storage.get_project(project_name)
|
project = storage.get_project(project_name)
|
||||||
@@ -242,22 +236,7 @@ def build_project(project_name):
|
|||||||
|
|
||||||
project = storage.get_project(project_name)
|
project = storage.get_project(project_name)
|
||||||
project.settings.try_start_final_infected_exe = False
|
project.settings.try_start_final_infected_exe = False
|
||||||
|
prepare_project(project_name, project.settings)
|
||||||
src = "{}{}/".format(PATH_CARRIER, project.settings.source_style.value)
|
|
||||||
dst = "{}{}/".format(PATH_WEB_PROJECT, project_name)
|
|
||||||
|
|
||||||
# delete all files in dst directory
|
|
||||||
for file in os.listdir(dst):
|
|
||||||
if file == "project.pickle":
|
|
||||||
continue
|
|
||||||
os.remove(dst + file)
|
|
||||||
|
|
||||||
# copy *.c *.h files from src directory to dst directory
|
|
||||||
for file in os.listdir(src):
|
|
||||||
if file.endswith(".c") or file.endswith(".h"):
|
|
||||||
logger.info("Copy {} to {}".format(src + file, dst))
|
|
||||||
shutil.copy2(src + file, dst)
|
|
||||||
|
|
||||||
thread = Thread(target=supermega_thread, args=(project.settings, ))
|
thread = Thread(target=supermega_thread, args=(project.settings, ))
|
||||||
thread.start()
|
thread.start()
|
||||||
thread_running = True
|
thread_running = True
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ import os
|
|||||||
import pathlib
|
import pathlib
|
||||||
import glob
|
import glob
|
||||||
import logging
|
import logging
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
from model.project import WebProject
|
||||||
from config import config
|
from config import config
|
||||||
from model.defs import *
|
from model.defs import *
|
||||||
from observer import observer
|
from observer import observer
|
||||||
@@ -13,6 +15,15 @@ logger = logging.getLogger("Helper")
|
|||||||
SHC_VERIFY_SLEEP = 0.1
|
SHC_VERIFY_SLEEP = 0.1
|
||||||
|
|
||||||
|
|
||||||
|
def write_webproject(project_name, settings):
|
||||||
|
filepath = "{}project.pickle".format(settings.main_dir)
|
||||||
|
logger.info("Write project to: {}".format(filepath))
|
||||||
|
webProject = WebProject(project_name, settings)
|
||||||
|
webProject.comment = "Created by command line interface"
|
||||||
|
with open(filepath, "wb") as f:
|
||||||
|
pickle.dump(webProject, f)
|
||||||
|
|
||||||
|
|
||||||
def clean_tmp_files():
|
def clean_tmp_files():
|
||||||
files_to_clean = [
|
files_to_clean = [
|
||||||
# compile artefacts in current working dir
|
# compile artefacts in current working dir
|
||||||
@@ -23,6 +34,7 @@ def clean_tmp_files():
|
|||||||
for file in files_to_clean:
|
for file in files_to_clean:
|
||||||
pathlib.Path(file).unlink(missing_ok=True)
|
pathlib.Path(file).unlink(missing_ok=True)
|
||||||
|
|
||||||
|
|
||||||
def clean_files(settings):
|
def clean_files(settings):
|
||||||
logger.info("--( Remove old files")
|
logger.info("--( Remove old files")
|
||||||
|
|
||||||
|
|||||||
+28
-1
@@ -1,14 +1,22 @@
|
|||||||
import logging
|
import logging
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
from model.defs import *
|
||||||
from model.payload import Payload
|
from model.payload import Payload
|
||||||
from model.exehost import ExeHost
|
from model.exehost import ExeHost
|
||||||
from model.settings import Settings
|
from model.settings import Settings
|
||||||
from model.carrier import Carrier
|
from model.carrier import Carrier
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger("Project")
|
logger = logging.getLogger("Project")
|
||||||
|
|
||||||
|
|
||||||
|
class WebProject():
|
||||||
|
def __init__(self, name: str, settings: Settings):
|
||||||
|
self.name = name
|
||||||
|
self.settings: Settings = settings
|
||||||
|
self.comment: str = ""
|
||||||
|
|
||||||
|
|
||||||
class Project():
|
class Project():
|
||||||
def __init__(self, settings: Settings):
|
def __init__(self, settings: Settings):
|
||||||
self.name: str = ""
|
self.name: str = ""
|
||||||
@@ -26,3 +34,22 @@ class Project():
|
|||||||
self.payload.init()
|
self.payload.init()
|
||||||
self.exe_host.init()
|
self.exe_host.init()
|
||||||
self.carrier.init()
|
self.carrier.init()
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_project(project_name, settings):
|
||||||
|
src = "{}{}/".format(PATH_CARRIER, settings.source_style.value)
|
||||||
|
dst = "{}{}/".format(PATH_WEB_PROJECT, project_name)
|
||||||
|
|
||||||
|
# delete all files in dst directory
|
||||||
|
for file in os.listdir(dst):
|
||||||
|
if file == "project.pickle":
|
||||||
|
continue
|
||||||
|
if file.startswith("."):
|
||||||
|
continue
|
||||||
|
os.remove(dst + file)
|
||||||
|
|
||||||
|
# copy *.c *.h files from src directory to dst directory
|
||||||
|
for file in os.listdir(src):
|
||||||
|
if file.endswith(".c") or file.endswith(".h"):
|
||||||
|
logger.info("Copy {} to {}".format(src + file, dst))
|
||||||
|
shutil.copy2(src + file, dst)
|
||||||
+3
-9
@@ -1,5 +1,8 @@
|
|||||||
|
import logging
|
||||||
from model.defs import *
|
from model.defs import *
|
||||||
|
|
||||||
|
logger = logging.getLogger("Views")
|
||||||
|
|
||||||
|
|
||||||
class Settings():
|
class Settings():
|
||||||
def __init__(self, web=""):
|
def __init__(self, web=""):
|
||||||
@@ -28,15 +31,6 @@ class Settings():
|
|||||||
self.generate_shc_from_asm: bool = True
|
self.generate_shc_from_asm: bool = True
|
||||||
|
|
||||||
|
|
||||||
def prep(self):
|
|
||||||
self.main_dir = "{}{}/".format(PATH_CARRIER, self.source_style.value)
|
|
||||||
self.template_path = self.main_dir + "template.c"
|
|
||||||
self.main_c_path = self.main_dir + "main.c"
|
|
||||||
self.main_asm_path = self.main_dir + "main.asm"
|
|
||||||
self.main_exe_path = self.main_dir + "main.exe"
|
|
||||||
self.main_shc_path = self.main_dir + "main.bin"
|
|
||||||
|
|
||||||
|
|
||||||
def prep_web(self, project_name):
|
def prep_web(self, project_name):
|
||||||
self.main_dir = "{}{}/".format(PATH_WEB_PROJECT, project_name)
|
self.main_dir = "{}{}/".format(PATH_WEB_PROJECT, project_name)
|
||||||
self.template_path = self.main_dir + "template.c"
|
self.template_path = self.main_dir + "template.c"
|
||||||
|
|||||||
+6
-2
@@ -14,7 +14,7 @@ import phases.injector
|
|||||||
from observer import observer
|
from observer import observer
|
||||||
from pe.pehelper import extract_code_from_exe_file_ep
|
from pe.pehelper import extract_code_from_exe_file_ep
|
||||||
from sender import scannerDetectsBytes
|
from sender import scannerDetectsBytes
|
||||||
from model.project import Project
|
from model.project import Project, prepare_project
|
||||||
from model.settings import Settings
|
from model.settings import Settings
|
||||||
from model.defs import *
|
from model.defs import *
|
||||||
from log import setup_logging
|
from log import setup_logging
|
||||||
@@ -96,7 +96,8 @@ def main():
|
|||||||
settings.inject_exe_in = args.inject
|
settings.inject_exe_in = args.inject
|
||||||
settings.inject_exe_out = args.inject.replace(".exe", ".infected.exe")
|
settings.inject_exe_out = args.inject.replace(".exe", ".infected.exe")
|
||||||
|
|
||||||
settings.prep()
|
settings.prep_web("default")
|
||||||
|
write_webproject("default", settings)
|
||||||
exit_code = start(settings)
|
exit_code = start(settings)
|
||||||
exit(exit_code)
|
exit(exit_code)
|
||||||
|
|
||||||
@@ -112,6 +113,9 @@ def start(settings: Settings) -> int:
|
|||||||
# And logs
|
# And logs
|
||||||
observer.reset()
|
observer.reset()
|
||||||
|
|
||||||
|
# Prepare the project: copy all files to projects/<project_name>/
|
||||||
|
prepare_project("default", settings)
|
||||||
|
|
||||||
# Do the thing and catch the errors
|
# Do the thing and catch the errors
|
||||||
try:
|
try:
|
||||||
start_real(settings)
|
start_real(settings)
|
||||||
|
|||||||
Reference in New Issue
Block a user