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)
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)
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)
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])
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)
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)
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)
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')
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)
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)
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)
def yacheck_bookmarks(self): addrs = yaunit.load('bookmarks') for i in range(0, 3): self.assertTrue(self.has_bookmark('bookmark_%d' % i, addrs[i]))
def yacheck_rename_register(self): eas = yaunit.load('registers') for ea, op, key in eas: self.assertEqual(idc.GetOpnd(ea, op), key)
def yacheck_function_name(self): addr = yaunit.load('function_name') self.assertEqual('some_new_function_name', idc.NameEx(idaapi.BADADDR, addr))
def yacheck_hiddenareas(self): addrs = yaunit.load('hiddenarea') for i in range(0, 3): self.check_hiddenarea("yatest_hiddenarea_%x" % addrs[i], addrs[i])