예제 #1
0
 def yacheck_create_struct_in_stack_vars(self):
     sida = yaunit.load("create_struct_in_stack_vars")
     offset = yaunit.load("create_struct_in_stack_vars_offset")
     stype = idc.GetType(idc.GetMemberId(sida, offset))
     self.assertNotEqual(None, stype)
     stype = fix_ptr_type(stype)
     
     self.assertEqual("create_struct_in_stack_vars*", stype)
예제 #2
0
    def yacheck_create_struct_in_stack_vars_with_renaming(self):
        sida = yaunit.load("create_struct_in_stack_vars_with_renaming")
        offset = yaunit.load("create_struct_in_stack_vars_with_renaming_offset")
        self.assertEqual("var1", idc.GetMemberName(sida, offset))

        stype = fix_ptr_type(idc.GetType(idc.GetMemberId(sida, offset)))
        self.assertEqual("create_struct_in_stack_vars_with_renaming*",
                         stype)
예제 #3
0
 def yacheck_reference_views(self):
     addr = yaunit.load('reference_view_addr')
     ti = idaapi.opinfo_t()
     f = idc.GetFlags(addr)
     self.assertTrue(idaapi.get_opinfo(addr, self.operand, f, ti))
     self.assertTrue(ti.ri.type())
     self.assertEqual(ti.ri.base, self.reference_addr)
예제 #4
0
    def yacheck_apply_struct(self):
        addrs = yaunit.load('apply_struct')
        for k in range(-1, 4):
            # retrieve struct id
            addr = addrs[k + 1]
            sid = idc.GetStrucIdByName('apply_struct_%x' % (k + 1))
            self.assertNotEqual(sid, idaapi.BADADDR)

            # begin to check if something is applied
            flags = idaapi.get_flags_novalue(addr)
            self.assertTrue(idaapi.isStroff(flags, 1))
            ti = idaapi.opinfo_t()
            flags = idc.GetFlags(addr)
            self.assertTrue(idaapi.get_opinfo(addr, 1, flags, ti))

            # apply struct only
            if k == -1:
                # check struct is applied
                self.assertEqual(ti.path.ids[0], sid)
                continue

            # check union is selected & applied at target address
            uid = idc.GetStrucIdByName('apply_union_%x' % (k + 1))
            self.assertNotEqual(uid, idaapi.BADADDR)
            fid = idc.GetMemberId(uid, k)
            self.assertNotEqual(fid, -1)

            # check union is applied
            self.assertEqual([x for x in ti.path.ids if x], [sid, fid])
예제 #5
0
    def check_create_struct_complex(self, in_stack):
        ident = yaunit.load('create_struct_complex_%d' % in_stack)

        # get first struct id
        sida = None
        if ident == 'create_struct_complex':
            self.assertFalse(in_stack)
            sida = idc.GetStrucIdByName('create_struct_complex')
        else:
            self.assertTrue(in_stack)
            frame = idaapi.get_frame(ident)
            self.assertIsNotNone(frame)
            sida = frame.id
        self.assertNotEqual(sida, idaapi.BADADDR)

        # get second struct id
        sidb = idc.GetStrucIdByName('create_struct_complex_sub_%d' % in_stack)
        self.assertNotEqual(sidb, idaapi.BADADDR)

        # check second struct
        for offset, name, ftype, strid, count in complex_struc2:
            size = get_size(ftype, strid) if ftype is not None else 1
            name = 'field_%.04X_%s' % (offset, name)
            self.check_field(sidb, ftype, strid, offset, count * size, name)

        # check first struct
        sizeb = idc.GetStrucSize(sidb)
        for offset, name, ftype, strid, count in complex_struc1:
            size = get_size(ftype, strid) if ftype is not None else 1
            if strid == 1:
                size *= sizeb
                strid = sidb
            name = 'field_%.04X_%s' % (offset, name)
            self.check_field(sida, ftype, strid, offset, count * size, name)
예제 #6
0
 def yacheck_function_flags(self):
     addrs = yaunit.load('function_flags')
     for i, k in enumerate(flag_types):
         addr = addrs[i]
         flags = idc.GetFunctionFlags(addr)
         self.assertNotEqual(flags, -1)
         self.assertEqual(flags & k, k)
예제 #7
0
 def yacheck_enums(self):
     values = yaunit.load('enums')
     for flag in flags:
         for prefix, enum_width, is_bitfield, num_fields in tests:
             name, ea, values = str(values[0][0]), values[0][1], values[1:]
             eid = idc.GetEnum(name)
             self.assertNotEqual(eid, idaapi.BADADDR)
             self.assertEqual(idc.GetEnumFlag(eid), flag)
             self.assertEqual(idc.GetEnumName(eid), name)
             self.assertEqual(idc.IsBitfield(eid), is_bitfield)
             self.assertEqual(idc.GetEnumCmt(eid, False), prefix + 'cmt')
             self.assertEqual(idc.GetEnumCmt(eid, True),  prefix + 'rpt')
             if enum_width != 0:
                 self.assertEqual(idc.GetEnumWidth(eid), enum_width)
             n = 0
             for value, bmask in walk_enum(eid):
                 self.assertLessEqual(n, num_fields)
                 v = 1 << n if is_bitfield else n
                 self.assertEqual(value, value, v)
                 cid = idc.GetConstEx(eid, v, 0, bmask)
                 self.assertNotEqual(cid, idaapi.BADADDR)
                 field = '%s_%d' % (name, n)
                 self.assertEqual(idc.GetConstName(cid), field)
                 # FIXME comments are not working
                 #self.assertEqual(idc.GetConstCmt(cid, False), field + 'cmt')
                 #self.assertEqual(idc.GetConstCmt(cid, True),  field + 'rpt')
                 n += 1
             self.assertEqual(n, num_fields)
             if ea != None:
                 self.assertEqual(idaapi.get_enum_id(ea, 1)[0], eid)
예제 #8
0
 def yacheck_function_local_vars(self):
     addr = yaunit.load('function_with_local_vars')
     frame = idaapi.get_frame(addr)
     frame_size = idaapi.get_struc_size(frame.id)
     offset = 0
     last_name = None
     while offset < frame_size and last_name is None:
         last_name = idc.GetMemberName(frame.id, offset)
         offset += 1
     self.assertEqual(last_name, 'local_var')
예제 #9
0
 def yacheck_reference_views(self):
     eas = yaunit.load('reference_views')
     idx = 0
     for ea in eas:
         (operand, is_num, reference) = tests[idx]
         idx += 1
         ti = idaapi.opinfo_t()
         f = idc.GetFlags(ea)
         self.assertTrue(idaapi.get_opinfo(ea, operand, f, ti))
         self.assertTrue(ti.ri.type())
         self.assertEqual(ti.ri.base, reference)
예제 #10
0
 def yacheck_data_comments(self):
     eas = yaunit.load('data_comments')
     i = 0
     for offset in range(0, 3):
         for cmt, rpt, post, ant in tests_data:
             ea = eas[i]
             logger.debug(
                 "checking data comment at 0x%08X : %r, %r, %r, %r" %
                 (ea, cmt, rpt, post, ant))
             i += 1
             self.assertEqual(idc.get_cmt(ea, False), cmt)
             self.assertEqual(idc.get_cmt(ea, True), rpt)
             self.assertEqual(self.get_extra(ea, idc.E_NEXT), post)
             self.assertEqual(self.get_extra(ea, idc.E_PREV), ant)
예제 #11
0
 def yacheck_data_comments(self):
     eas = yaunit.load('data_comments')
     i = 0
     for offset in range(0, 3):
         for cmt, rpt, post, ant in tests_data:
             ea = eas[i]
             logger.debug(
                 "checking data comment at 0x%08X : %r, %r, %r, %r" %
                 (ea, cmt, rpt, post, ant))
             i += 1
             if cmt != None:
                 self.assertEqual(idc.GetCommentEx(ea, False), cmt)
             if rpt != None:
                 self.assertEqual(idc.GetCommentEx(ea, True), rpt)
             if post != None:
                 for j, txt in enumerate(post.split('\n')):
                     self.assertEqual(idc.LineB(ea, j), txt)
             if ant != None:
                 for j, txt in enumerate(ant.split('\n')):
                     self.assertEqual(idc.LineA(ea, j), txt)
예제 #12
0
 def yacheck_bookmarks(self):
     addrs = yaunit.load('bookmarks')
     for i in range(0, 3):
         self.assertTrue(self.has_bookmark('bookmark_%d' % i, addrs[i]))
예제 #13
0
 def yacheck_rename_register(self):
     eas = yaunit.load('registers')
     for ea, op, key in eas:
         self.assertEqual(idc.GetOpnd(ea, op), key)
예제 #14
0
 def yacheck_function_name(self):
     addr = yaunit.load('function_name')
     self.assertEqual('some_new_function_name',
                      idc.NameEx(idaapi.BADADDR, addr))
예제 #15
0
 def yacheck_hiddenareas(self):
     addrs = yaunit.load('hiddenarea')
     for i in range(0, 3):
         self.check_hiddenarea("yatest_hiddenarea_%x" % addrs[i], addrs[i])