diff --git a/model/payload.py b/model/payload.py index a8d7f76..d4252f4 100644 --- a/model/payload.py +++ b/model/payload.py @@ -10,12 +10,10 @@ class Payload(): def __init__(self, filepath: FilePath): self.payload_path: FilePath = filepath self.payload_data: bytes = b"" - self.len: int = 0 def init(self): logging.info("--( Load payload: {}".format(self.payload_path)) with open(self.payload_path, 'rb') as f: self.payload_data = f.read() - self.len = len(self.payload_data) diff --git a/phases/injector.py b/phases/injector.py index 2902d1c..b3cbc8f 100644 --- a/phases/injector.py +++ b/phases/injector.py @@ -13,11 +13,12 @@ from model.project import Project from model.settings import Settings from pe.asmdisasm import * from model.defs import * +from model.payload import Payload logger = logging.getLogger("Injector") -def inject_exe(main_shc: bytes, settings: Settings, carrier: Carrier, project: Project): +def inject_exe(main_shc: bytes, settings: Settings, carrier: Carrier, payload: Payload): exe_in = settings.inject_exe_in exe_out = settings.inject_exe_out carrier_invoke_style: CarrierInvokeStyle = settings.carrier_invoke_style @@ -93,7 +94,7 @@ def inject_exe(main_shc: bytes, settings: Settings, carrier: Carrier, project: P # Aligning the payload (not carrier!) to page size is important for dll_loader_change if settings.carrier_name == "dll_loader_change": # align shellcode_rva minus an offset to page size - shellcode_rva = align_to_page_size(shellcode_rva, shellcode_len - project.payload.len) + shellcode_rva = align_to_page_size(shellcode_rva, shellcode_len - len(payload.payload_data)) shellcode_offset = superpe.pe.get_offset_from_rva(shellcode_rva) logger.info("---( Inject: Write Shellcode to offset:0x{:X} (rva:0x{:X})".format( diff --git a/supermega.py b/supermega.py index eb1fd46..03ebb81 100644 --- a/supermega.py +++ b/supermega.py @@ -158,14 +158,13 @@ def start_real(settings: Settings): # FIXUP DLL Payload # Prepare DLL payload for usage in dll_loader_change - # This needs to be done before rendering the C templates, as the need - # the size of the payload + # This needs to be done before rendering the C templates, as need + # the real size of the payload if project.settings.carrier_name == "dll_loader_change": project.payload.payload_data = preload_dll(project.payload.payload_path) - project.payload.len = len(project.payload.payload_data) # CREATE: Carrier C source files from template (C->C) - phases.templater.create_c_from_template(settings, project.payload.len) + phases.templater.create_c_from_template(settings, len(project.payload.payload_data)) # If we put the payload into .rdata # PREPARE DataReuseEntry for usage in Compiler/AsmTextParser @@ -211,11 +210,11 @@ def start_real(settings: Settings): #observer.add_code_file("full_shc", full_shellcode) else: # shellcode is in .rdata, so we dont need to merge - # This is handle before, e.g. encoding. + # Encoding is handled before this full_shellcode = carrier_shellcode # inject (merged) loader into an exe. Big task. - phases.injector.inject_exe(full_shellcode, settings, project.carrier, project) + phases.injector.inject_exe(full_shellcode, settings, project.carrier, project.payload) #observer.add_code_file("exe_final", extract_code_from_exe_file_ep(settings.inject_exe_out, 300)) # Check binary with avred