refactor: unify project handling (cmdline = projects/default)

This commit is contained in:
Dobin
2024-03-29 20:29:33 +00:00
parent 70eb0bf798
commit 4410685d0d
7 changed files with 53 additions and 44 deletions
+1 -8
View File
@@ -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():
+1 -1
View File
@@ -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
View File
@@ -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
+12
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)