From b501c0b0c82dcf2401670cfc0ba8513b722dc745 Mon Sep 17 00:00:00 2001 From: Alexandre Iooss Date: Fri, 1 Dec 2023 10:39:16 +0100 Subject: [PATCH] Drop loaders.elfloader and loaders.peloaders --- rainbow/loaders/__init__.py | 4 +- rainbow/loaders/elfloader.py | 106 ----------------------------------- rainbow/loaders/peloader.py | 54 ------------------ 3 files changed, 1 insertion(+), 163 deletions(-) delete mode 100644 rainbow/loaders/elfloader.py delete mode 100644 rainbow/loaders/peloader.py diff --git a/rainbow/loaders/__init__.py b/rainbow/loaders/__init__.py index ecfcec5..80240d9 100644 --- a/rainbow/loaders/__init__.py +++ b/rainbow/loaders/__init__.py @@ -20,11 +20,9 @@ from typing import Optional from .cleloader import cleloader -from .elfloader import elfloader from .hexloader import hexloader -from .peloader import peloader -LOADERS = {".hex": hexloader, ".elf": elfloader, ".so": cleloader, ".exe": peloader} +LOADERS = {".hex": hexloader, ".elf": cleloader, ".so": cleloader, ".exe": cleloader} def load_selector(filename, rainbow_instance, typ=None, *args, **kwargs) -> Optional[int]: diff --git a/rainbow/loaders/elfloader.py b/rainbow/loaders/elfloader.py deleted file mode 100644 index bcefd74..0000000 --- a/rainbow/loaders/elfloader.py +++ /dev/null @@ -1,106 +0,0 @@ -# This file is part of rainbow -# -# rainbow is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -# -# -# Copyright 2019 Victor Servant, Ledger SAS - -import lief - - -def elfloader(elf_file, emu, map_virtual_segments=False, verbose=False) -> int: - """Load an .elf file into emu's memory using LIEF - - If `map_virtual_segments` is True, then segments such as `.bss` will be - mapped even if their physical size are zero. - """ - elffile = lief.parse(elf_file) - if verbose: - print(f"[x] Loading ELF segments...") - - if len(list(elffile.segments)) > 0: - for segment in elffile.segments: - # Only consider LOAD segments - if segment.type != lief.ELF.SEGMENT_TYPES.LOAD: - continue - - if map_virtual_segments: - emu.map_space( - segment.virtual_address, - segment.virtual_address + segment.virtual_size, - verbose=verbose, - ) - emu.emu.mem_write(segment.virtual_address, bytes(segment.content)) - else: - emu.map_space( - segment.physical_address, - segment.physical_address + segment.physical_size, - verbose=verbose, - ) - emu.emu.mem_write(segment.physical_address, bytes(segment.content)) - else: - # if there are no segments, still attempt to map .text area - section = elffile.get_section(".text") - emu.map_space( - section.virtual_address, - section.virtual_address + section.size, - verbose=verbose, - ) - emu.emu.mem_write(section.virtual_address, bytes(section.content)) - - # Handle relocations - for r in elffile.relocations: - if r.symbol.is_function: - if r.symbol.value == 0: - rsv = r.address - else: - rsv = r.symbol.value - emu.functions[r.symbol.name] = rsv - if verbose: - print(f"Relocating {r.symbol.name} at {r.address:x} to {rsv:x}") - emu[r.address] = rsv - - # lief > 0.10 - try: - for f in elffile.exported_functions: - tmpn = f.name - c = 0 - while tmpn in emu.functions: - c += 1 - tmpn = f.name + str(c) - emu.functions[tmpn] = f.address - except: - pass - - # TODO: when the ELF has relocated functions exported, LIEF fails on get_function_address - for i in elffile.symbols: - if i.type == lief.ELF.SYMBOL_TYPES.FUNC: - try: - tmpn = i.name - addr = i.value - if tmpn in emu.functions.keys(): - if emu.functions[tmpn] != addr: - c = 0 - while tmpn in emu.functions.keys(): - c += 1 - tmpn = i.name + str(c) - emu.functions[tmpn] = addr - else: - emu.functions[tmpn] = addr - except Exception as exc: - if verbose: - print(exc) - - emu.function_names = {emu.functions[x]: x for x in emu.functions.keys()} - return elffile.entrypoint diff --git a/rainbow/loaders/peloader.py b/rainbow/loaders/peloader.py deleted file mode 100644 index 7b6f670..0000000 --- a/rainbow/loaders/peloader.py +++ /dev/null @@ -1,54 +0,0 @@ -# This file is part of rainbow -# -# rainbow is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -# -# -# Copyright 2019 Victor Servant, Ledger SAS - -import lief - - -def peloader(exe_file, emu, verbose=False) -> int: - """Load a .exe file into emu's memory using LIEF""" - pefile = lief.parse(exe_file) - if verbose: - print(f"[x] Loading .exe ...") - - imagebase = pefile.optional_header.imagebase - for section in pefile.sections: - if verbose: - print(f"[=] Writing {section.name}") - emu.map_space( - imagebase + section.virtual_address, - imagebase + section.virtual_address + section.size, - verbose=verbose, - ) - emu.emu.mem_write(imagebase + section.virtual_address, bytes(section.content)) - - emu.functions = {} - - # Handle relocations - for r in pefile.relocations: - if r.symbol.is_function: - if r.symbol.value == 0: - rsv = r.address - (r.address & 1) - else: - rsv = r.symbol.value - (r.symbol.value & 1) - emu.functions[r.symbol.name] = rsv - if verbose: - print(f"Relocating {r.symbol.name} at {r.address:x} to {rsv:x}") - emu[r.address] = rsv - - emu.function_names = {emu.functions[x]: x for x in emu.functions.keys()} - return pefile.entrypoint