Skip to content

Commit 3d30f12

Browse files
Remove definesyscall_return from syscall handlers
Move responsibility to POSIX dispatcher
1 parent e871122 commit 3d30f12

32 files changed

+180
-190
lines changed

examples/hello_arm_linux_custom_syscall.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def my_syscall_write(ql, write_fd, write_buf, write_count, *args, **kw):
2323
if ql.output in (QL_OUTPUT.DEBUG, QL_OUTPUT.DUMP):
2424
raise
2525

26-
ql.os.definesyscall_return(regreturn)
26+
return regreturn
2727

2828

2929
if __name__ == "__main__":

examples/netgear_6220_mips32el_linux.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323

2424
def my_syscall_write(ql, write_fd, write_buf, write_count, *rest):
2525
if write_fd == 2 and ql.os.fd[2].__class__.__name__ == 'ql_pipe':
26-
ql.os.definesyscall_return(-1)
26+
return -1
2727
else:
28-
syscall.ql_syscall_write(ql, write_fd, write_buf, write_count, *rest)
28+
return syscall.ql_syscall_write(ql, write_fd, write_buf, write_count, *rest)
2929

3030

3131
def my_bind(ql, *args, **kw):

examples/tendaac1518_httpd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def nvram_listener():
5555
def myvfork(ql):
5656
regreturn = 0
5757
logging.info("vfork() = %d" % regreturn)
58-
ql.os.definesyscall_return(regreturn)
58+
return regreturn
5959

6060

6161
def my_sandbox(path, rootfs):

qiling/os/freebsd/syscall.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,14 @@
77

88
def ql_syscall_clock_gettime(ql, clock_gettime_clock_id, clock_gettime_timespec, *args, **kw):
99
logging.info("clock_gettime()")
10-
regreturn = 0
11-
ql.os.definesyscall_return(regreturn)
10+
return 0
1211

1312

1413
def ql_syscall_sysarch(ql, op, parms, *args, **kw):
1514
"""
1615
wild guess, of cause not working
1716
"""
18-
17+
1918
regreturn = 0
2019
ql.GS_SEGMENT_ADDR = 0x6000
2120
ql.GS_SEGMENT_SIZE = 0x8000
@@ -28,4 +27,4 @@ def ql_syscall_sysarch(ql, op, parms, *args, **kw):
2827
#op_buf = ql.pack32(op)
2928
#ql.mem.write(parms, op_buf)
3029
logging.info("sysarch(0x%x,0x%x) = %i" % (op, parms, regreturn))
31-
ql.os.definesyscall_return(regreturn)
30+
return regreturn

qiling/os/linux/syscall.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ def ql_syscall_set_thread_area(ql, u_info_addr, *args, **kw):
3838
index = ql.os.gdtm.get_free_idx(12)
3939

4040
if index == -1 or index < 12 or index > 14:
41-
regreturn = -1
41+
return -1
4242
else:
4343
ql.os.gdtm.register_gdt_segment(index, base, limit, QL_X86_A_PRESENT | QL_X86_A_DATA | QL_X86_A_DATA_WRITABLE | QL_X86_A_PRIV_3 | QL_X86_A_DIR_CON_BIT, QL_X86_S_GDT | QL_X86_S_PRIV_3)
4444
ql.mem.write(u_info_addr, ql.pack32(index))
45-
regreturn = 0
46-
ql.os.definesyscall_return(regreturn)
47-
45+
return 0
46+
4847
elif ql.archtype == QL_ARCH.MIPS:
4948
CONFIG3_ULR = (1 << 13)
5049
ql.reg.cp0_config3 = CONFIG3_ULR

qiling/os/macos/syscall.py

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,17 @@ def ql_syscall_fgetattrlist(ql, fd, alist, attributeBuffer, bufferSize, options,
6363

6464
if len(attr) > bufferSize:
6565
logging.debug("Length error")
66-
ql.os.definesyscall_return(1)
66+
return 1
6767
else:
6868

6969
ql.mem.write(attributeBuffer, attr)
7070
#set_eflags_cf(ql, 0x0)
71-
ql.os.definesyscall_return(KERN_SUCCESS)
71+
return KERN_SUCCESS
7272

7373

7474
def ql_syscall_poll(ql, target, address, size, *args, **kw):
75-
ql.os.definesyscall_return(KERN_SUCCESS)
7675
logging.info("pool()")
76+
return KERN_SUCCESS
7777

7878

7979
################
@@ -90,12 +90,12 @@ def ql_syscall_kernelrpc_mach_vm_allocate_trap(ql, port, addr, size, flags, *arg
9090
ql.os.macho_task.min_offset = mmap_end
9191
logging.debug("[+] vm alloc form 0x%x to 0x%0x" % (mmap_address, mmap_end))
9292
ql.mem.write(addr, struct.pack("<Q", mmap_address))
93-
ql.os.definesyscall_return(0)
93+
return 0
9494

9595
# 0xc
9696
def ql_syscall_kernelrpc_mach_vm_deallocate_trap(ql, target, address, size, *args, **kw):
97-
ql.os.definesyscall_return(KERN_SUCCESS)
9897
logging.debug("[+] [mach] mach vm deallocate trap")
98+
return KERN_SUCCESS
9999

100100
# 0xf
101101
def ql_syscall_kernelrpc_mach_vm_map_trap(ql, target, address, size, mask, flags, cur_protection):
@@ -114,7 +114,7 @@ def ql_syscall_kernelrpc_mach_vm_map_trap(ql, target, address, size, mask, flags
114114
ql.os.macho_vmmap_end = vmmap_end
115115
ql.mem.map(vmmap_address, vmmap_end - vmmap_address)
116116
ql.mem.write(address, struct.pack("<Q", vmmap_address))
117-
ql.os.definesyscall_return(KERN_SUCCESS)
117+
return KERN_SUCCESS
118118

119119
# 0x12
120120
def ql_syscall_kernelrpc_mach_port_deallocate_trap(ql, *args, **kw):
@@ -136,26 +136,26 @@ def ql_syscall_kernelrpc_mach_port_construct_trap(ql, target, options, context,
136136

137137
# 0x1a
138138
def ql_syscall_mach_reply_port(ql, *args, **kw):
139-
ql.os.definesyscall_return(ql.os.macho_mach_port.name)
140139
logging.debug("[+] [mach] mach reply port , ret: %s" % (ql.os.macho_mach_port.name))
140+
return ql.os.macho_mach_port.name
141141

142142
# 0x1b
143143
def ql_syscall_thread_self_trap(ql, *args, **kw):
144144
port_manager = ql.os.macho_port_manager
145145
thread_port = port_manager.get_thread_port(ql.os.macho_thread)
146146
logging.debug("[+] [mach] thread_self_trap: ret: %s" % (thread_port))
147-
ql.os.definesyscall_return(thread_port)
147+
return thread_port
148148

149149
# 0x1c
150150
def ql_syscall_task_self_trap(ql, *args, **kw):
151-
ql.os.definesyscall_return(ql.os.macho_task.id)
152151
logging.debug("[+] [mach] task self trap, ret: %d" % (ql.os.macho_task.id))
152+
return ql.os.macho_task.id
153153

154154
# 0x1d
155155
def ql_syscall_host_self_trap(ql, *args, **kw):
156156
port_manager = ql.os.macho_port_manager
157-
ql.os.definesyscall_return(port_manager.host_port.name)
158-
logging.debug("[+] [mach] host_self_trap, ret: %s" % (666))
157+
logging.debug("[+] [mach] host_self_trap, ret: %s" % (ql.os.macho_port_manager.host_port.name))
158+
return port_manager.host_port.name
159159

160160
# 0x1f
161161
def ql_syscall_mach_msg_trap(ql, args, opt, ssize, rsize, rname, timeout):
@@ -165,7 +165,7 @@ def ql_syscall_mach_msg_trap(ql, args, opt, ssize, rsize, rname, timeout):
165165
mach_msg.read_msg_from_mem(args, ssize)
166166
logging.debug("[+] Recv-> Header: %s, Content: %s" % (mach_msg.header, mach_msg.content))
167167
ql.os.macho_port_manager.deal_with_msg(mach_msg, args)
168-
ql.os.definesyscall_return(0)
168+
return 0
169169

170170

171171
#################
@@ -178,9 +178,9 @@ def ql_syscall_access_macos(ql, path, flags, *args, **kw):
178178
logging.info("access(%s, 0x%x)" % (path_str, flags))
179179
logging.debug("[+] access(path: %s, flags: 0x%x)" % (path_str, flags))
180180
if not ql.os.macho_fs.isexists(path_str):
181-
ql.os.definesyscall_return(ENOENT)
181+
return ENOENT
182182
else:
183-
ql.os.definesyscall_return(KERN_SUCCESS)
183+
return KERN_SUCCESS
184184

185185
# 0x30
186186
def ql_syscall_sigprocmask(ql, how, mask, omask, *args, **kw):
@@ -204,7 +204,7 @@ def ql_syscall_fcntl64_macos(ql, fcntl_fd, fcntl_cmd, fcntl_arg, *args, **kw):
204204
regreturn = 0
205205

206206
logging.info("fcntl64(fd: %d, cmd: %d, arg: 0x%x) = %d" % (fcntl_fd, fcntl_cmd, fcntl_arg, regreturn))
207-
ql.os.definesyscall_return(regreturn)
207+
return regreturn
208208

209209
# 0x99
210210
def ql_syscall_pread(ql, fd, buf, nbyte, offset, *args, **kw):
@@ -216,7 +216,7 @@ def ql_syscall_pread(ql, fd, buf, nbyte, offset, *args, **kw):
216216
data = ql.os.fd[fd].read(nbyte)
217217
ql.mem.write(buf, data)
218218
set_eflags_cf(ql, 0x0)
219-
ql.os.definesyscall_return(nbyte)
219+
return nbyte
220220

221221
# 0xa9
222222
def ql_syscall_csops(ql, pid, ops, useraddr, usersize, *args, **kw):
@@ -225,7 +225,7 @@ def ql_syscall_csops(ql, pid, ops, useraddr, usersize, *args, **kw):
225225
logging.info("csops(pid: %d, ops: 0x%x, useraddr: 0x%x, usersize: 0x%x) flag: 0x%x" % (
226226
pid, ops, useraddr, usersize, ((CS_ENFORCEMENT | CS_GET_TASK_ALLOW))
227227
))
228-
ql.os.definesyscall_return(KERN_SUCCESS)
228+
return KERN_SUCCESS
229229

230230
# 0xdc
231231
def ql_syscall_getattrlist(ql, path, alist, attributeBuffer, bufferSize, options, *args, **kw):
@@ -264,11 +264,11 @@ def ql_syscall_getattrlist(ql, path, alist, attributeBuffer, bufferSize, options
264264

265265
if len(attr) > bufferSize:
266266
logging.debug("Length error")
267-
ql.os.definesyscall_return(1)
267+
return 1
268268
else:
269269
ql.mem.write(attributeBuffer, attr)
270270
set_eflags_cf(ql, 0x0)
271-
ql.os.definesyscall_return(KERN_SUCCESS)
271+
return KERN_SUCCESS
272272

273273
# 0xc2
274274
# struct rlimit {
@@ -282,7 +282,7 @@ def ql_syscall_getrlimit(ql, which, rlp, *args, **kw):
282282
RLIM_NLIMITS = 9
283283
which = which & _RLIMIT_POSIX_FLAG
284284
if which >= RLIM_NLIMITS:
285-
ql.os.definesyscall_return(EINVAL)
285+
return EINVAL
286286
else :
287287
ql.mem.write(rlp, b'\x00\x13\x00\x00\x00\x00\x00\x00') # rlim_cur
288288
ql.mem.write(rlp, b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x7F') # rlim_max
@@ -343,14 +343,14 @@ def ql_syscall_mmap2_macos(ql, mmap2_addr, mmap2_length, mmap2_prot, mmap2_flags
343343
regreturn = mmap_base
344344
logging.debug("[+] mmap_base is 0x%x" % regreturn)
345345

346-
ql.os.definesyscall_return(regreturn)
346+
return regreturn
347347

348348
# 0xca
349349
def ql_syscall_sysctl(ql, name, namelen, old, oldlenp, new_arg, newlen):
350350
logging.info("sysctl(name: 0x%x, namelen: 0x%x, old: 0x%x, oldlenp: 0x%x, new: 0x%x, newlen: 0x%x)" % (
351351
name, namelen, old, oldlenp, new_arg, newlen
352352
))
353-
ql.os.definesyscall_return(KERN_SUCCESS)
353+
return KERN_SUCCESS
354354

355355
# 0x112
356356
def ql_syscall_sysctlbyname(ql, name, namelen, old, oldlenp, new_arg, newlen):
@@ -360,14 +360,14 @@ def ql_syscall_sysctlbyname(ql, name, namelen, old, oldlenp, new_arg, newlen):
360360
logging.debug("[+] sysctlbyname(name: 0x%x, namelen: 0x%x, old: 0x%x, oldlenp: 0x%x, new: 0x%x, newlen: 0x%x)" % (
361361
name, namelen, old, oldlenp, new_arg, newlen
362362
))
363-
ql.os.definesyscall_return(KERN_SUCCESS)
363+
return KERN_SUCCESS
364364

365365
# 0x126
366366
# check shared region if avalible , return not ready every time
367367
def ql_syscall_shared_region_check_np(ql, p, uap, retvalp, *args, **kw):
368368
logging.info("shared_region_check_np(0x%x, 0x%x, 0x%x) = 0x%x" % (p, uap, retvalp, EINVAL))
369369
logging.debug("[+] shared_region_check_np(p: 0x%x, uap: 0x%x, retvalp: 0x%x) = 0x%x" % (p, uap, retvalp, EINVAL))
370-
ql.os.definesyscall_return(EINVAL)
370+
return EINVAL
371371

372372
# 0x150
373373
def ql_syscall_proc_info(ql, callnum, pid, flavor, arg, buff, buffer_size):
@@ -436,7 +436,7 @@ def ql_syscall_stat64_macos(ql, stat64_pathname, stat64_buf_ptr, *args, **kw):
436436
logging.debug("[+] stat64 write completed")
437437
else:
438438
logging.debug("[!] stat64 read/write fail")
439-
ql.os.definesyscall_return(regreturn)
439+
return regreturn
440440

441441
# 0x153
442442
def ql_syscall_fstat64_macos(ql, fstat64_fd, fstat64_add, *args, **kw):
@@ -501,18 +501,18 @@ def ql_syscall_fstat64_macos(ql, fstat64_fd, fstat64_add, *args, **kw):
501501
logging.debug("[+] fstat64 write completed")
502502
else:
503503
logging.debug("[!] fstat64 read/write fail")
504-
ql.os.definesyscall_return(regreturn)
504+
return regreturn
505505

506506
# 0x16e
507507
def ql_syscall_bsdthread_register(ql, threadstart, wqthread, flags, stack_addr_hint, targetconc_ptr, dispatchqueue_offset):
508508
set_eflags_cf(ql, 0x0)
509-
ql.os.definesyscall_return(0x00000000400000df)
509+
return 0x00000000400000df
510510

511511
# 0x174
512512
def ql_syscall_thread_selfid(ql, *args, **kw):
513513
thread_id = ql.os.macho_thread.id
514514
logging.info("thread_selfid() = %d" % (thread_id))
515-
ql.os.definesyscall_return(thread_id)
515+
return thread_id
516516

517517
# 0x18e
518518
def ql_syscall_open_nocancel(ql, filename, flags, mode, *args, **kw):
@@ -544,7 +544,7 @@ def ql_syscall_open_nocancel(ql, filename, flags, mode, *args, **kw):
544544
logging.debug("[+] File Found: %s" % relative_path)
545545
else:
546546
logging.debug("[!] File Not Found %s" % relative_path)
547-
ql.os.definesyscall_return(regreturn)
547+
return regreturn
548548

549549
# 0x1b6
550550
def ql_syscall_shared_region_map_and_slide_np(ql, fd, count, mappings_addr, slide, slide_start, slide_size):
@@ -563,19 +563,19 @@ def ql_syscall_shared_region_map_and_slide_np(ql, fd, count, mappings_addr, slid
563563
ql.mem.write(mapping.sfm_address, content)
564564
mappings_addr += mapping.size
565565
mapping_list.append(mapping)
566-
ql.os.definesyscall_return(slide_size)
566+
return slide_size
567567

568568
# 0x1e3
569569
def ql_syscall_csrctl(ql, op, useraddr, usersize, *args, **kw):
570570
logging.info("csrctl(0x%x, 0x%x, 0x%x)" % (op, useraddr, usersize))
571571
logging.debug("csrctl(op: 0x%x, useraddr :0x%x, usersize: 0x%x)" % (op, useraddr, usersize))
572-
ql.os.definesyscall_return(1)
572+
return 1
573573

574574
# 0x1f4
575575
def ql_syscall_getentropy(ql, buffer, size, *args, **kw):
576576
logging.info("getentropy(0x%x, 0x%x)" % (buffer, size))
577577
logging.debug("[+] getentropy(buffer: 0x%x, size: 0x%x)" % (buffer, size))
578-
ql.os.definesyscall_return(KERN_SUCCESS)
578+
return KERN_SUCCESS
579579

580580
# 0x208
581581
def ql_syscall_terminate_with_payload(ql, pid, reason_namespace, reason_code, payload, payload_size, reason_string):
@@ -585,9 +585,9 @@ def ql_syscall_terminate_with_payload(ql, pid, reason_namespace, reason_code, pa
585585
logging.debug("[+] terminate_with_payload(pid: %d, reason_namespace: 0x%x, reason_code: 0x%x, payload: 0x%x \
586586
payload_size: 0x%x, reason_string: 0x%x)" % (pid, reason_namespace, reason_code,
587587
payload, payload_size, reason_string))
588-
ql.os.definesyscall_return(KERN_SUCCESS)
589588
ql.emu_stop()
590589
raise QlErrorSyscallError("[!] Exit with Error")
590+
return KERN_SUCCESS
591591

592592
# 0x209
593593
def ql_syscall_abort_with_payload(ql, reason_namespace, reason_code, payload, payload_size, reason_string, reason_flags):
@@ -596,7 +596,7 @@ def ql_syscall_abort_with_payload(ql, reason_namespace, reason_code, payload, pa
596596

597597
logging.debug("[+] abort_with_payload(reason_namespace: 0x%x, reason_code: 0x%x, payload: 0x%x, payload_size: 0x%x, reason_string: 0x%x,\
598598
reason_flags: 0x%x)" % (reason_namespace, reason_code, payload, payload_size, reason_string, reason_flags))
599-
ql.os.definesyscall_return(KERN_SUCCESS)
599+
return KERN_SUCCESS
600600

601601

602602
################
@@ -608,5 +608,4 @@ def ql_syscall_abort_with_payload(ql, reason_namespace, reason_code, payload, pa
608608
def ql_syscall_thread_fast_set_cthread_self64(ql, u_info_addr, *args, **kw):
609609
logging.debug("[+] [mdep] thread fast set cthread self64(tsd_base:0x%x)" % (u_info_addr))
610610
ql.reg.msr(GSMSR, u_info_addr)
611-
ql.os.definesyscall_return(KERN_SUCCESS)
612-
return
611+
return KERN_SUCCESS

qiling/os/posix/posix.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,17 @@ def load_syscall(self, intno=None):
162162
self.syscalls_counter += 1
163163

164164
try:
165-
if self.syscall_onEnter == None:
165+
if self.syscall_onEnter is None:
166166
ret = 0
167167
else:
168168
ret = self.syscall_onEnter(self.ql, self.get_func_arg()[0], self.get_func_arg()[1], self.get_func_arg()[2], self.get_func_arg()[3], self.get_func_arg()[4], self.get_func_arg()[5])
169169

170170
if isinstance(ret, int) == False or ret & QL_CALL_BLOCK == 0:
171-
self.syscall_map(self.ql, self.get_func_arg()[0], self.get_func_arg()[1], self.get_func_arg()[2], self.get_func_arg()[3], self.get_func_arg()[4], self.get_func_arg()[5])
172-
173-
if self.syscall_onExit != None:
171+
ret = self.syscall_map(self.ql, self.get_func_arg()[0], self.get_func_arg()[1], self.get_func_arg()[2], self.get_func_arg()[3], self.get_func_arg()[4], self.get_func_arg()[5])
172+
if ret is not None and isinstance(ret, int):
173+
self.set_syscall_return(ret)
174+
175+
if self.syscall_onExit is not None:
174176
self.syscall_onExit(self.ql, self.get_func_arg()[0], self.get_func_arg()[1], self.get_func_arg()[2], self.get_func_arg()[3], self.get_func_arg()[4], self.get_func_arg()[5])
175177

176178
except KeyboardInterrupt:
@@ -203,7 +205,7 @@ def get_syscall(self):
203205

204206
return self.ql.reg.read(syscall_num)
205207

206-
def definesyscall_return(self, regreturn):
208+
def set_syscall_return(self, regreturn):
207209
# each name has a list of calls, we want the last one and we want to update the return value
208210
self.syscalls[self.syscall_name][-1]["result"] = regreturn
209211
if self.ql.archtype == QL_ARCH.ARM: # ARM

0 commit comments

Comments
 (0)