|
4 | 4 | # |
5 | 5 |
|
6 | 6 | import os |
| 7 | + |
| 8 | +from typing import Callable |
7 | 9 | from unicorn import UcError |
8 | 10 |
|
9 | 11 | from qiling.os.posix.posix import QlOsPosix |
10 | 12 | from qiling.os.qnx.const import NTO_SIDE_CHANNEL, SYSMGR_PID, SYSMGR_CHID, SYSMGR_COID |
11 | 13 | from qiling.os.qnx.helpers import QnxConn |
12 | 14 | from qiling.os.qnx.structs import _thread_local_storage |
13 | | -from qiling.const import QL_ARCH |
| 15 | +from qiling.cc import QlCC, intel, arm, mips, riscv |
| 16 | +from qiling.const import QL_ARCH, QL_INTERCEPT |
| 17 | +from qiling.os.fcall import QlFunctionCall |
| 18 | +from qiling.os.const import * |
| 19 | +from qiling.os.posix.const import NR_OPEN |
| 20 | +from qiling.os.posix.posix import QlOsPosix |
14 | 21 |
|
15 | 22 | class QlOsQnx(QlOsPosix): |
16 | 23 | def __init__(self, ql): |
17 | 24 | super(QlOsQnx, self).__init__(ql) |
| 25 | + |
| 26 | + self.ql = ql |
| 27 | + |
| 28 | + cc: QlCC = { |
| 29 | + QL_ARCH.X86 : intel.cdecl, |
| 30 | + QL_ARCH.X8664 : intel.amd64, |
| 31 | + QL_ARCH.ARM : arm.aarch32, |
| 32 | + QL_ARCH.ARM64 : arm.aarch64, |
| 33 | + QL_ARCH.MIPS : mips.mipso32, |
| 34 | + QL_ARCH.RISCV : riscv.riscv, |
| 35 | + QL_ARCH.RISCV64: riscv.riscv, |
| 36 | + }[ql.archtype](ql) |
| 37 | + |
| 38 | + self.fcall = QlFunctionCall(ql, cc) |
| 39 | + |
| 40 | + self.thread_class = None |
| 41 | + self.futexm = None |
| 42 | + self.fh = None |
| 43 | + self.function_after_load_list = [] |
| 44 | + self.elf_mem_start = 0x0 |
18 | 45 | self.load() |
19 | 46 |
|
20 | 47 | # use counters to get free Ids |
@@ -44,6 +71,20 @@ def hook_syscall(self, intno= None, int = None): |
44 | 71 | return self.load_syscall() |
45 | 72 |
|
46 | 73 |
|
| 74 | + def add_function_hook(self, fn: str, cb: Callable, intercept: QL_INTERCEPT): |
| 75 | + self.ql.os.function_hook.add_function_hook(fn, cb, intercept) |
| 76 | + |
| 77 | + |
| 78 | + def register_function_after_load(self, function): |
| 79 | + if function not in self.function_after_load_list: |
| 80 | + self.function_after_load_list.append(function) |
| 81 | + |
| 82 | + |
| 83 | + def run_function_after_load(self): |
| 84 | + for f in self.function_after_load_list: |
| 85 | + f() |
| 86 | + |
| 87 | + |
47 | 88 | def hook_sigtrap(self, intno= None, int = None): |
48 | 89 | self.ql.log.info("Trap Found") |
49 | 90 | self.emu_error() |
@@ -90,6 +131,7 @@ def run(self): |
90 | 131 | else: |
91 | 132 | if self.ql.loader.elf_entry != self.ql.loader.entry_point: |
92 | 133 | self.ql.emu_start(self.ql.loader.entry_point, self.ql.loader.elf_entry, self.ql.timeout) |
| 134 | + self.run_function_after_load() |
93 | 135 | self.ql.enable_lib_patch() |
94 | 136 |
|
95 | 137 | self.ql.emu_start(self.ql.loader.elf_entry, self.exit_point, self.ql.timeout, self.ql.count) |
|
0 commit comments