示例#1
0
文件: api.py 项目: samshine/speakeasy
    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)
示例#2
0
文件: api.py 项目: samshine/speakeasy
    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
示例#3
0
 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
示例#4
0
 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
示例#5
0
    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))
示例#6
0
文件: api.py 项目: samshine/speakeasy
 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))
示例#7
0
 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))
示例#8
0
    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')
示例#9
0
文件: api.py 项目: samshine/speakeasy
 def datatmp(f):
     if not callable(f):
         raise ApiEmuError('Invalid function type supplied: %s' %
                           (str(f)))
     f.__datahook__ = (impname, f)
     return f
示例#10
0
文件: api.py 项目: samshine/speakeasy
 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
示例#11
0
文件: api.py 项目: samshine/speakeasy
 def cast(self, obj, bytez):
     if isinstance(obj, EmuStruct):
         return obj.cast(bytez)
     else:
         raise ApiEmuError('Invalid object')
     return obj
示例#12
0
文件: api.py 项目: samshine/speakeasy
 def get_bytes(self, obj):
     if isinstance(obj, EmuStruct):
         return obj.get_bytes()
     else:
         raise ApiEmuError('Invalid object')
示例#13
0
文件: api.py 项目: samshine/speakeasy
 def sizeof(self, obj):
     if isinstance(obj, EmuStruct):
         return obj.sizeof()
     else:
         raise ApiEmuError('Invalid object')