Skip to content

Commit 190ac8d

Browse files
authored
Merge pull request #792 from elicn/dev-improv
Clean and document loader and memory modules
2 parents 45bae68 + f3b5cbe commit 190ac8d

File tree

7 files changed

+421
-336
lines changed

7 files changed

+421
-336
lines changed

qiling/const.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55

66
from enum import EnumMeta, IntEnum
7-
from typing import Mapping
7+
from typing import Mapping, TypeVar
88

99
class QL_ENDIAN(IntEnum):
1010
EL = 1
@@ -64,16 +64,18 @@ class QL_INTERCEPT(IntEnum):
6464
QL_HOOK_BLOCK = 0b0001
6565
QL_CALL_BLOCK = 0b0010
6666

67-
def __reverse_enum(e: EnumMeta) -> Mapping[str, int]:
67+
__QL_CE = TypeVar('__QL_CE', QL_DEBUGGER, QL_ARCH, QL_OS, QL_VERBOSE)
68+
69+
def __reverse_enum(e: EnumMeta) -> Mapping[str, __QL_CE]:
6870
'''Create a reverse mapping for an enum.
6971
'''
7072

71-
return dict((k.lower(), v.value) for k, v in e.__members__.items())
73+
return dict((v.name.lower(), v.value) for v in e.__members__.values())
7274

73-
debugger_map = __reverse_enum(QL_DEBUGGER)
74-
arch_map = __reverse_enum(QL_ARCH)
75-
os_map = __reverse_enum(QL_OS)
76-
verbose_map = __reverse_enum(QL_VERBOSE)
75+
debugger_map: Mapping[str, QL_DEBUGGER] = __reverse_enum(QL_DEBUGGER)
76+
arch_map : Mapping[str, QL_ARCH] = __reverse_enum(QL_ARCH)
77+
os_map : Mapping[str, QL_OS] = __reverse_enum(QL_OS)
78+
verbose_map : Mapping[str, QL_VERBOSE] = __reverse_enum(QL_VERBOSE)
7779

7880
loader_map = {
7981
QL_OS.LINUX : "ELF",

qiling/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ def _init_stop_guard(self):
691691
# Allocate a guard page, we need this in both cases
692692
# On a negative stack pointer, we still need a return address (otherwise we end up at 0)
693693
# Make sure it is not close to the heap (PE), otherwise the heap cannot grow
694-
self._exit_trap_addr = self.mem.find_free_space(0x1000, min_addr=0x9000000, alignment=0x10)
694+
self._exit_trap_addr = self.mem.find_free_space(0x1000, minaddr=0x9000000, align=0x10)
695695
self.mem.map(self._exit_trap_addr, 0x1000, info='[Stop guard]')
696696

697697
# Stop on a negative stack pointer

qiling/loader/elf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from qiling.const import *
1616

1717
from qiling.exception import *
18-
from .loader import QlLoader
18+
from .loader import QlLoader, Image
1919
from qiling.os.linux.function_hook import FunctionHook
2020
from qiling.os.linux.syscall_nums import SYSCALL_NR
2121
from qiling.os.linux.kernel_api.hook import *
@@ -422,7 +422,7 @@ def load_with_ld(self, stack_addr, load_address=-1, argv=[], env={}):
422422
self.ql.os.elf_entry = self.elf_entry = load_address + elfhead['e_entry']
423423
self.stack_address = new_stack
424424
self.load_address = load_address
425-
self.images.append(self.coverage_image(load_address, load_address + mem_end, self.path))
425+
self.images.append(Image(load_address, load_address + mem_end, self.path))
426426
self.ql.os.function_hook = FunctionHook(self.ql, self.elf_phdr + mem_start, self.elf_phnum, self.elf_phent,
427427
load_address, load_address + mem_end)
428428
self.init_sp = self.ql.reg.arch_sp

qiling/loader/loader.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22
#
33
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44
#
5-
from collections import namedtuple
65

7-
from qiling.const import QL_OS, QL_ARCH, QL_ENDIAN
8-
from qiling.exception import QlErrorArch, QlErrorOsType, QlErrorOutput
6+
from typing import Any, Mapping, MutableSequence, NamedTuple
97

8+
from qiling import Qiling
9+
10+
Image = NamedTuple('Image', (('base', int), ('end', int), ('path', str)))
1011

1112
class QlLoader():
12-
def __init__(self, ql):
13-
self.ql = ql
14-
self.env = self.ql.env
15-
self.argv = self.ql.argv
16-
self.images = []
17-
self.coverage_image = namedtuple('Image', 'base end path')
13+
def __init__(self, ql: Qiling):
14+
self.ql = ql
15+
self.env = self.ql.env
16+
self.argv = self.ql.argv
17+
self.images: MutableSequence[Image] = []
1818
self.skip_exit_check = False
19-
20-
def save(self):
21-
saved_state = {}
22-
saved_state['images'] = list(map(tuple, self.images))
23-
return saved_state
2419

25-
def restore(self, saved_state):
26-
for (base, end, path) in saved_state['images']:
27-
self.images.append(self.coverage_image(base, end, path))
20+
def save(self) -> Mapping[str, Any]:
21+
saved_state = {
22+
'images': [tuple(img) for img in self.images]
23+
}
24+
25+
return saved_state
2826

27+
def restore(self, saved_state: Mapping[str, Any]):
28+
self.images = [Image(*img) for img in saved_state['images']]

qiling/loader/pe.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from qiling.exception import *
1313
from qiling.const import *
1414
from qiling.arch.x86_const import *
15-
from .loader import QlLoader
15+
from .loader import QlLoader, Image
1616
from qiling.os.memory import QlMemoryHeap
1717

1818

@@ -141,7 +141,7 @@ def load_dll(self, dll_name, driver=False):
141141
self.add_ldr_data_table_entry(dll_name)
142142

143143
# add DLL to coverage images
144-
self.images.append(self.coverage_image(dll_base, dll_base+dll_len, path))
144+
self.images.append(Image(dll_base, dll_base+dll_len, path))
145145

146146
self.ql.log.info("Done with loading %s" % path)
147147

@@ -472,7 +472,7 @@ def load(self):
472472
self.sizeOfStackReserve = self.pe.OPTIONAL_HEADER.SizeOfStackReserve
473473
self.ql.log.info("Loading %s to 0x%x" % (self.path, self.pe_image_address))
474474
self.ql.log.info("PE entry point at 0x%x" % self.entry_point)
475-
self.images.append(self.coverage_image(self.pe_image_address, self.pe_image_address + self.pe.NT_HEADERS.OPTIONAL_HEADER.SizeOfImage, self.path))
475+
self.images.append(Image(self.pe_image_address, self.pe_image_address + self.pe.NT_HEADERS.OPTIONAL_HEADER.SizeOfImage, self.path))
476476

477477
# Stack should not init at the very bottom. Will cause errors with Dlls
478478
sp = self.stack_address + self.stack_size - 0x1000

qiling/loader/pe_uefi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from qiling import Qiling
1010
from qiling.const import QL_ARCH
1111
from qiling.exception import QlErrorArch, QlMemoryMappedError
12-
from qiling.loader.loader import QlLoader
12+
from qiling.loader.loader import QlLoader, Image
1313

1414
from qiling.os.uefi import context, st, smst
1515
from qiling.os.uefi.ProcessorBind import CPU_STACK_ALIGNMENT
@@ -122,7 +122,7 @@ def map_and_load(self, path: str, exec_now: bool=False):
122122
self.install_loaded_image_protocol(image_base, image_size)
123123

124124
# this would be used later be os.find_containing_image
125-
self.images.append(self.coverage_image(image_base, image_base + image_size, path))
125+
self.images.append(Image(image_base, image_base + image_size, path))
126126

127127
# update next memory slot to allow sequencial loading. its availability
128128
# is unknown though

0 commit comments

Comments
 (0)