Skip to content

Commit f9c5f1a

Browse files
committed
set_api tune
1 parent 25f3519 commit f9c5f1a

File tree

4 files changed

+44
-16
lines changed

4 files changed

+44
-16
lines changed

qiling/arch/arm.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,24 @@ def enable_vfp(self) -> None:
104104

105105
def check_thumb(self):
106106
return UC_MODE_THUMB if self.__is_thumb() else UC_MODE_ARM
107+
108+
"""
109+
set_tls
110+
"""
111+
def init_get_tls(self):
112+
self.ql.mem.map(0xFFFF0000, 0x1000, info="[arm_tls]")
113+
"""
114+
'adr r0, data; ldr r0, [r0]; mov pc, lr; data:.ascii "\x00\x00"'
115+
"""
116+
sc = b'\x04\x00\x8f\xe2\x00\x00\x90\xe5\x0e\xf0\xa0\xe1\x00\x00\x00\x00'
117+
118+
# if ql.archendian == QL_ENDIAN.EB:
119+
# sc = swap_endianess(sc)
120+
121+
self.ql.mem.write(self.ql.arch.arm_get_tls_addr, sc)
122+
self.ql.log.debug("Set init_kernel_get_tls")
123+
124+
def swap_endianess(self, s: bytes, blksize=4) -> bytes:
125+
blocks = (s[i:i + blksize] for i in range(0, len(s), blksize))
126+
127+
return b''.join(bytes(reversed(b)) for b in blocks)

qiling/os/linux/linux.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from qiling.os.posix.const import NR_OPEN
1717
from qiling.os.posix.posix import QlOsPosix
1818

19-
from . import utils
2019
from . import futex
2120
from . import thread
2221

@@ -56,7 +55,7 @@ def load(self):
5655
self.ql.arch.enable_vfp()
5756
self.ql.hook_intno(self.hook_syscall, 2)
5857
self.thread_class = thread.QlLinuxARMThread
59-
utils.ql_arm_init_get_tls(self.ql)
58+
self.ql.arch.init_get_tls()
6059

6160
# MIPS32
6261
elif self.ql.archtype == QL_ARCH.MIPS:

qiling/os/qnx/qnx.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from typing import Callable
99
from unicorn import UcError
1010

11+
from qiling import Qiling
1112
from qiling.os.posix.posix import QlOsPosix
1213
from qiling.os.qnx.const import NTO_SIDE_CHANNEL, SYSMGR_PID, SYSMGR_CHID, SYSMGR_COID
1314
from qiling.os.qnx.helpers import QnxConn
@@ -20,7 +21,7 @@
2021
from qiling.os.posix.posix import QlOsPosix
2122

2223
class QlOsQnx(QlOsPosix):
23-
def __init__(self, ql):
24+
def __init__(self, ql: Qiling):
2425
super(QlOsQnx, self).__init__(ql)
2526

2627
self.ql = ql
@@ -60,11 +61,12 @@ def load(self):
6061
if self.ql.code:
6162
return
6263

63-
if self.ql.archtype!= QL_ARCH.ARM:
64-
return
65-
66-
self.ql.arch.enable_vfp()
67-
self.ql.hook_intno(self.hook_syscall, 2)
64+
# ARM
65+
if self.ql.archtype == QL_ARCH.ARM:
66+
self.ql.arch.enable_vfp()
67+
self.ql.hook_intno(self.hook_syscall, 2)
68+
#self.thread_class = thread.QlLinuxARMThread
69+
self.ql.arch.init_get_tls()
6870

6971

7072
def hook_syscall(self, intno= None, int = None):
@@ -98,15 +100,15 @@ def run(self):
98100
if self.ql.entry_point is not None:
99101
self.ql.loader.elf_entry = self.ql.entry_point
100102

101-
self.cpupage_addr = int(self.ql.os.profile.get("OS32", "cpupage_address"), 16)
102-
self.cpupage_tls_addr = int(self.ql.os.profile.get("OS32", "cpupage_tls_address"), 16)
103-
self.tls_data_addr = int(self.ql.os.profile.get("OS32", "tls_data_address"), 16)
104-
105-
self.syspage_addr = int(self.ql.os.profile.get("OS32", "syspage_address"), 16)
103+
self.cpupage_addr = int(self.ql.os.profile.get("OS32", "cpupage_address"), 16)
104+
self.cpupage_tls_addr = int(self.ql.os.profile.get("OS32", "cpupage_tls_address"), 16)
105+
self.tls_data_addr = int(self.ql.os.profile.get("OS32", "tls_data_address"), 16)
106+
self.syspage_addr = int(self.ql.os.profile.get("OS32", "syspage_address"), 16)
107+
syspage_path = os.path.join(self.ql.rootfs, "syspage.bin")
106108

107109
self.ql.mem.map(self.syspage_addr, 0x4000, info="[syspage_mem]")
108110

109-
syspage_path = os.path.join(self.ql.rootfs, "syspage.bin")
111+
110112
with open(syspage_path, "rb") as sp:
111113
self.ql.mem.write(self.syspage_addr, sp.read())
112114

@@ -130,9 +132,13 @@ def run(self):
130132
self.ql.emu_start(self.entry_point, (self.entry_point + len(self.ql.code)), self.ql.timeout, self.ql.count)
131133
else:
132134
if self.ql.loader.elf_entry != self.ql.loader.entry_point:
133-
self.ql.emu_start(self.ql.loader.entry_point, self.ql.loader.elf_entry, self.ql.timeout)
135+
entry_address = self.ql.loader.elf_entry
136+
if self.ql.archtype == QL_ARCH.ARM and entry_address & 1 == 1:
137+
entry_address -= 1
138+
self.ql.emu_start(self.ql.loader.entry_point, entry_address, self.ql.timeout)
134139
self.run_function_after_load()
135-
self.ql.enable_lib_patch()
140+
self.ql.loader.skip_exit_check = False
141+
self.ql.write_exit_trap()
136142

137143
self.ql.emu_start(self.ql.loader.elf_entry, self.exit_point, self.ql.timeout, self.ql.count)
138144

tests/test_qnx.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ def test_set_api_arm_qnx_sqrt(self):
2626
def my_msg_sendv(ql: Qiling):
2727
# params = ql.os.resolve_fcall_params({'s': STRING})
2828
# print(f'puts("{params["s"]}")')
29+
print("*" * 40)
2930
print("Set API_DONE")
31+
print("*" * 40)
3032

3133
ql = Qiling(["../examples/rootfs/arm_qnx/bin/hello_sqrt"], "../examples/rootfs/arm_qnx", verbose=QL_VERBOSE.DEBUG)
3234
ql.set_api('msg_sendv', my_msg_sendv)

0 commit comments

Comments
 (0)