Example #1
0
def get_data(segs, cpp_in):
    '''[str] -> str -> [c_ast]'''
    def gen(((ti, ea, declstr), node)):
        '''(tinfo_t, ea_t) -> c_ast'''
        # NOTE mutates node
        has_data = ida.seg_name(ea) != '.bss'
        ptr = ida.can_be_off32(ea)
        if ptr not in [ida.BADADDR, 0]:
            ptr_ti = ida.get_or_guess_tinfo(ptr)
            ti_node = cdecl.get_decls(declstr).decls[utils.cpp_decomp_tag][0]
            return gen(((ptr_ti, ptr, ''), ti_node))
        # XXX our data segment has no strings, but that's probably specific to
        # the one binary we're dealing with
        elif ti.is_array():
            ai = ida.array_type_data_t()
            ti.get_array_details(ai)
            item_size = ai.elem_type.get_size()
            typename = get_type_for_c_ast_constant(ai.elem_type)
            length = (ida.item_end(ea) - ida.item_head(ea)) / item_size
            if has_data is True:
                if ai.elem_type.is_char():
                    node.init = ep_ct.constant(typename, c_stringify(
                        ida.get_string(ea)))
                else:
                    items = list(get_item(ea + j * item_size, ti)
                                 for j in xrange(0, length))
                    node.init = ep_ct.initlist(
                        [ep_ct.constant(typename, str(x)) for x in items])
        else:
            if has_data is True:
                typename = get_type_for_c_ast_constant(ti)
                node.init = ep_ct.constant(typename,
                                           str(get_item(ea, ti)))
        return node
Example #2
0
def get_str_literals(segs):
    '''[str] -> {str : str}'''
    # XXX making a bad assumption that we only need a string if it's referred to
    # in .text, but this avoids some junk in .rodata (e.g. jump tables)
    return get_literals(segs, ida.get_string,
                        lambda x: cdecl.is_c_str(ida.guess_type(x)) and
                        '.text' in list(ida.seg_name(y) for y in
                                        (ida.data_refs_to(x))))
Example #3
0
 def has_got_seg_in_data_refs(refs):
     # filter out data not referenced by GOT
     return '.got' in [ida.seg_name(x) for x in refs]