refactor: attempt to simplify payload

This commit is contained in:
Dobin Rutishauser
2024-06-17 10:33:34 +02:00
parent 83313538ef
commit 0d320b38d0
3 changed files with 8 additions and 10 deletions
-2
View File
@@ -10,12 +10,10 @@ class Payload():
def __init__(self, filepath: FilePath): def __init__(self, filepath: FilePath):
self.payload_path: FilePath = filepath self.payload_path: FilePath = filepath
self.payload_data: bytes = b"" self.payload_data: bytes = b""
self.len: int = 0
def init(self): def init(self):
logging.info("--( Load payload: {}".format(self.payload_path)) logging.info("--( Load payload: {}".format(self.payload_path))
with open(self.payload_path, 'rb') as f: with open(self.payload_path, 'rb') as f:
self.payload_data = f.read() self.payload_data = f.read()
self.len = len(self.payload_data)
+3 -2
View File
@@ -13,11 +13,12 @@ from model.project import Project
from model.settings import Settings from model.settings import Settings
from pe.asmdisasm import * from pe.asmdisasm import *
from model.defs import * from model.defs import *
from model.payload import Payload
logger = logging.getLogger("Injector") 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_in = settings.inject_exe_in
exe_out = settings.inject_exe_out exe_out = settings.inject_exe_out
carrier_invoke_style: CarrierInvokeStyle = settings.carrier_invoke_style 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 # Aligning the payload (not carrier!) to page size is important for dll_loader_change
if settings.carrier_name == "dll_loader_change": if settings.carrier_name == "dll_loader_change":
# align shellcode_rva minus an offset to page size # 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) shellcode_offset = superpe.pe.get_offset_from_rva(shellcode_rva)
logger.info("---( Inject: Write Shellcode to offset:0x{:X} (rva:0x{:X})".format( logger.info("---( Inject: Write Shellcode to offset:0x{:X} (rva:0x{:X})".format(
+5 -6
View File
@@ -158,14 +158,13 @@ def start_real(settings: Settings):
# FIXUP DLL Payload # FIXUP DLL Payload
# Prepare DLL payload for usage in dll_loader_change # Prepare DLL payload for usage in dll_loader_change
# This needs to be done before rendering the C templates, as the need # This needs to be done before rendering the C templates, as need
# the size of the payload # the real size of the payload
if project.settings.carrier_name == "dll_loader_change": if project.settings.carrier_name == "dll_loader_change":
project.payload.payload_data = preload_dll(project.payload.payload_path) 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) # 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 # If we put the payload into .rdata
# PREPARE DataReuseEntry for usage in Compiler/AsmTextParser # PREPARE DataReuseEntry for usage in Compiler/AsmTextParser
@@ -211,11 +210,11 @@ def start_real(settings: Settings):
#observer.add_code_file("full_shc", full_shellcode) #observer.add_code_file("full_shc", full_shellcode)
else: else:
# shellcode is in .rdata, so we dont need to merge # 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 full_shellcode = carrier_shellcode
# inject (merged) loader into an exe. Big task. # 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)) #observer.add_code_file("exe_final", extract_code_from_exe_file_ep(settings.inject_exe_out, 300))
# Check binary with avred # Check binary with avred