示例#1
0
    def parse_types_from_source(self,
                                source,
                                filename=None,
                                include_dirs=[],
                                auto_type_source=None):
        """
		``parse_types_from_source`` parses the source string and any needed headers searching for them in
		the optional list of directories provided in ``include_dirs``.

		:param str source: source string to be parsed
		:param str filename: optional source filename
		:param list(str) include_dirs: optional list of string filename include directories
		:param str auto_type_source: optional source of types if used for automatically generated types
		:return: :py:class:`TypeParserResult` (a SyntaxError is thrown on parse error)
		:rtype: TypeParserResult
		:Example:

			>>> platform.parse_types_from_source('int foo;\\nint bar(int x);\\nstruct bas{int x,y;};\\n')
			({types: {'bas': <type: struct bas>}, variables: {'foo': <type: int32_t>}, functions:{'bar':
			<type: int32_t(int32_t x)>}}, '')
			>>>
		"""

        if filename is None:
            filename = "input"
        dir_buf = (ctypes.c_char_p * len(include_dirs))()
        for i in xrange(0, len(include_dirs)):
            dir_buf[i] = str(include_dirs[i])
        parse = core.BNTypeParserResult()
        errors = ctypes.c_char_p()
        result = core.BNParseTypesFromSource(self.handle, source, filename,
                                             parse, errors, dir_buf,
                                             len(include_dirs),
                                             auto_type_source)
        error_str = errors.value
        core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
        if not result:
            raise SyntaxError(error_str)
        type_dict = {}
        variables = {}
        functions = {}
        for i in xrange(0, parse.typeCount):
            name = types.QualifiedName._from_core_struct(parse.types[i].name)
            type_dict[name] = types.Type(core.BNNewTypeReference(
                parse.types[i].type),
                                         platform=self)
        for i in xrange(0, parse.variableCount):
            name = types.QualifiedName._from_core_struct(
                parse.variables[i].name)
            variables[name] = types.Type(core.BNNewTypeReference(
                parse.variables[i].type),
                                         platform=self)
        for i in xrange(0, parse.functionCount):
            name = types.QualifiedName._from_core_struct(
                parse.functions[i].name)
            functions[name] = types.Type(core.BNNewTypeReference(
                parse.functions[i].type),
                                         platform=self)
        core.BNFreeTypeParserResult(parse)
        return types.TypeParserResult(type_dict, variables, functions)
示例#2
0
def demangle_ms(arch, mangled_name):
    """
	``demangle_ms`` demangles a mangled Microsoft Visual Studio C++ name to a Type object.

	:param Architecture arch: Architecture for the symbol. Required for pointer and integer sizes.
	:param str mangled_name: a mangled Microsoft Visual Studio C++ name
	:return: returns tuple of (Type, demangled_name) or (None, mangled_name) on error
	:rtype: Tuple
	:Example:

		>>> demangle_ms(Architecture["x86_64"], "?testf@Foobar@@SA?AW4foo@1@W421@@Z")
		(<type: public: static enum Foobar::foo __cdecl (enum Foobar::foo)>, ['Foobar', 'testf'])
		>>>
	"""
    handle = ctypes.POINTER(core.BNType)()
    outName = ctypes.POINTER(ctypes.c_char_p)()
    outSize = ctypes.c_ulonglong()
    names = []
    if core.BNDemangleMS(arch.handle, mangled_name, ctypes.byref(handle),
                         ctypes.byref(outName), ctypes.byref(outSize)):
        for i in xrange(outSize.value):
            names.append(outName[i])
        core.BNFreeDemangledName(ctypes.byref(outName), outSize.value)
        return (types.Type(handle), names)
    return (None, mangled_name)
示例#3
0
	def expr_type(self):
		"""Type of expression"""
		result = core.BNGetMediumLevelILExprType(self.function.handle, self.expr_index)
		if result.type:
			platform = None
			if self.function.source_function:
				platform = self.function.source_function.platform
			return types.Type(result.type, platform = platform, confidence = result.confidence)
		return None
示例#4
0
	def functions(self):
		"""List of platform-specific function definitions (read-only)"""
		count = ctypes.c_ulonglong(0)
		type_list = core.BNGetPlatformFunctions(self.handle, count)
		result = {}
		for i in xrange(0, count.value):
			name = types.QualifiedName._from_core_struct(type_list[i].name)
			result[name] = types.Type(core.BNNewTypeReference(type_list[i].type))
		core.BNFreeTypeList(type_list, count.value)
		return result
示例#5
0
	def system_calls(self):
		"""List of system calls for this platform (read-only)"""
		count = ctypes.c_ulonglong(0)
		call_list = core.BNGetPlatformSystemCalls(self.handle, count)
		result = {}
		for i in xrange(0, count.value):
			name = types.QualifiedName._from_core_struct(call_list[i].name)
			t = types.Type(core.BNNewTypeReference(call_list[i].type))
			result[call_list[i].number] = (name, t)
		core.BNFreeSystemCallList(call_list, count.value)
		return result
示例#6
0
def demangle_gnu3(arch, mangled_name):
    handle = ctypes.POINTER(core.BNType)()
    outName = ctypes.POINTER(ctypes.c_char_p)()
    outSize = ctypes.c_ulonglong()
    names = []
    if core.BNDemangleGNU3(arch.handle, mangled_name, ctypes.byref(handle),
                           ctypes.byref(outName), ctypes.byref(outSize)):
        for i in xrange(outSize.value):
            names.append(outName[i])
        core.BNFreeDemangledName(ctypes.byref(outName), outSize.value)
        if not handle:
            return (None, names)
        return (types.Type(handle), names)
    return (None, mangled_name)
示例#7
0
 def get_system_call_type(self, number):
     obj = core.BNGetPlatformSystemCallType(self.handle, number)
     if not obj:
         return None
     return types.Type(obj, platform=self)
示例#8
0
 def get_function_by_name(self, name):
     name = types.QualifiedName(name)._get_core_struct()
     obj = core.BNGetPlatformFunctionByName(self.handle, name)
     if not obj:
         return None
     return types.Type(obj, platform=self)
示例#9
0
	def get_variable_by_name(self, name):
		name = types.QualifiedName(name)._get_core_struct()
		obj = core.BNGetPlatformVariableByName(self.handle, name)
		if not obj:
			return None
		return types.Type(obj)