def queue_run(self, run_type, ep, run_args=[]): run = Run() if not isinstance(run_type, str): raise ApiEmuError('Invalid run type') if not isinstance(ep, int): raise ApiEmuError('Invalid run entry point') if not any((isinstance(run_args, list), isinstance(run_args, tuple))): raise ApiEmuError('Invalid run args') run.type = run_type run.start_addr = ep run.args = run_args self.emu.add_run(run)
def __init__(self, emu): super(ApiHandler, self).__init__() self.funcs = {} self.data = {} self.mod_name = '' self.emu = emu arch = self.emu.get_arch() if arch == _arch.ARCH_X86: self.ptr_size = 4 elif arch == _arch.ARCH_AMD64: self.ptr_size = 8 else: raise ApiEmuError('Invalid architecture') for name in dir(self): val = getattr(self, name, None) if val is None: continue func_attrs = getattr(val, '__apihook__', None) data_attrs = getattr(val, '__datahook__', None) if func_attrs: name, func, argc, conv, ordinal = func_attrs self.funcs[name] = (name, func, argc, conv, ordinal) if ordinal: self.funcs[ordinal] = (name, func, argc, conv, ordinal) elif data_attrs: name, func = data_attrs self.data[name] = func
def get_encoding(self, char_width): if char_width == 2: enc = 'utf-16le' elif char_width == 1: enc = 'utf-8' else: raise ApiEmuError('No encoding found for char width: %d' % (char_width)) return enc
def get_encoding(self, char_width): if char_width == 2: enc = "utf-16le" elif char_width == 1: enc = "utf-8" else: raise ApiEmuError("No encoding found for char width: %d" % (char_width)) return enc
def __init__(self, api, family, stype, protocol, flags): self.emu = api.emu super(WskSocket, self).__init__(self.emu) self.family = family self.sock_type = stype self.protocol = protocol self.flags = flags self.dispatch = None self.dispatch_addr = 0 self.dispatch_ptr = 0 self.types = api.win # TODO: support other wsk socket types if flags == WSK_FLAG_DATAGRAM_SOCKET: self.dispatch = self.types.WSK_PROVIDER_DATAGRAM_DISPATCH( self.emu.get_ptr_size()) self.dispatch_ptr = self.emu.mem_map( size=self.sizeof(self.dispatch) + self.emu.get_ptr_size(), tag="api.struct.WSK_PROVIDER_DATAGRAM_DISPATCH", ) # noqa # We need a ptr to the dispatch table ptr self.dispatch_addr = self.dispatch_ptr + self.emu.get_ptr_size() self.emu.mem_write( self.dispatch_ptr, self.dispatch_addr.to_bytes(self.emu.get_ptr_size(), "little"), ) # noqa addr = self.emu.add_callback( Netio.name, api.WskControlSocket.__apihook__[0]) # noqa self.dispatch.Basic.WskControlSocket = addr addr = self.emu.add_callback( Netio.name, api.WskCloseSocket.__apihook__[0]) # noqa self.dispatch.Basic.WskCloseSocket = addr addr = self.emu.add_callback(Netio.name, api.WskBind.__apihook__[0]) # noqa self.dispatch.WskBind = addr addr = self.emu.add_callback(Netio.name, api.WskSendTo.__apihook__[0]) # noqa self.dispatch.WskSendTo = addr addr = self.emu.add_callback( Netio.name, api.WskReceiveFrom.__apihook__[0]) # noqa self.dispatch.WskReceiveFrom = addr addr = self.emu.add_callback(Netio.name, api.WskRelease.__apihook__[0]) # noqa self.dispatch.WskRelease = addr addr = self.emu.add_callback( Netio.name, api.WskGetLocalAddress.__apihook__[0]) # noqa self.dispatch.WskGetLocalAddress = addr self.emu.mem_write(self.dispatch_addr, self.get_bytes(self.dispatch)) else: raise ApiEmuError("Unsupported WSK socket type: 0x%x" % (flags))
def get_char_width(self, ctx): """ Based on the API name, determine the character width being used by the function """ name = ctx.get('func_name', '') if name.endswith('A'): return 1 elif name.endswith('W'): return 2 raise ApiEmuError('Failed to get character width from function: %s' % (name))
def get_char_width(self, ctx): """ Based on the API name, determine the character width being used by the function """ name = ctx.get("func_name", "") if name.endswith("A"): return 1 elif name.endswith("W"): return 2 raise ApiEmuError("Failed to get character width from function: %s" % (name))
def __init__(self, emu): self.mods = {} self.instances = [] self.data = {} self.emu = emu arch = self.emu.get_arch() if arch == _arch.ARCH_X86: self.ptr_size = 4 elif arch == _arch.ARCH_AMD64: self.ptr_size = 8 else: raise ApiEmuError('Invalid architecture')
def datatmp(f): if not callable(f): raise ApiEmuError('Invalid function type supplied: %s' % (str(f))) f.__datahook__ = (impname, f) return f
def apitemp(f): if not callable(f): raise ApiEmuError('Invalid function type supplied: %s' % (str(f))) f.__apihook__ = (impname, f, argc, conv, ordinal) return f
def cast(self, obj, bytez): if isinstance(obj, EmuStruct): return obj.cast(bytez) else: raise ApiEmuError('Invalid object') return obj
def get_bytes(self, obj): if isinstance(obj, EmuStruct): return obj.get_bytes() else: raise ApiEmuError('Invalid object')
def sizeof(self, obj): if isinstance(obj, EmuStruct): return obj.sizeof() else: raise ApiEmuError('Invalid object')