import argparse p = argparse.ArgumentParser() p.add_argument("--api-695", required=True, help="Path to the 6.95 API desc file") p.add_argument("--api-700", required=True, help="Path to the 7.00 API desc file") args = p.parse_args() with open(args.api_695, "r") as fin: api_695 = eval(fin.read()) with open(args.api_700, "r") as fin: api_700 = eval(fin.read()) renamed_modules = { "ida_area" : "ida_range", "ida_queue" : "ida_problems", "ida_srarea" : "ida_segregs", "ida_queue" : "ida_problems", } renamed_symbols = { "ida_area" : { "AREACB_TYPE_FUNC" : "RANGE_KIND_FUNC", "AREACB_TYPE_FUNC" : "RANGE_KIND_FUNC", "AREACB_TYPE_HIDDEN_AREA" : "RANGE_KIND_HIDDEN_RANGE", "AREACB_TYPE_SEGMENT" : "RANGE_KIND_SEGMENT", "AREACB_TYPE_UNKNOWN" : "RANGE_KIND_UNKNOWN", "area_t_print(*args)" : "range_t_print(*args)", "areavec_t" : "rangevec_t", }, "ida_auto" : { "analyze_area" : "plan_and_wait", "autoCancel" : "auto_cancel", "autoIsOk" : "auto_is_ok", "autoMark" : "auto_mark", "autoUnmark" : "auto_unmark", "autoWait" : "auto_wait", }, "ida_bytes" : { "doExtra(_)" : "doExtra(_, *args)", "noExtra(_)" : "noExtra(_, *args)", "do3byte(*args)" : "do3byte(_, *args)", "f_is3byte(*args)" : "f_is3byte(_, *args)", "get_3byte(*args)" : "get_3byte(_, *args)", "is3byte(*args)" : "is3byte(_, *args)", }, "ida_dbg" : { "get_tev_reg_mem_ea(*args)" : "get_tev_reg_mem_ea(_, _)", "get_tev_reg_mem_qty(*args)" : "get_tev_reg_mem_qty(_)", "get_tev_reg_val(*args)" : "get_tev_reg_val(_, _)", }, "ida_frame" : { "ida_area" : "ida_range", }, "ida_funcs" : { "ida_area" : "ida_range", }, "ida_gdl" : { "ida_area" : "ida_range", }, "ida_hexrays" : { "call_helper(*args)" : "call_helper(_, _, *rest)", "dereference(*args)" : "dereference(_, _, =False)", "lnot(*args)" : "lnot(_)", "make_ref(*args)" : "make_ref(_)", "new_block(*args)" : "new_block()", }, "ida_ida" : { "ansi2idb(*args)" : "ansi2idb(_, _)", "idb2scr(*args)" : "idb2scr(_, _)", "scr2idb(*args)" : "scr2idb(_, _)", }, "ida_kernwin" : { "TODO" : [ "Choose", "EMPTY_SEL", "END_SEL", "START_SEL", ], "askident(*args)" : "askident(_, _)", }, "ida_segment" : { "ida_area" : "ida_range", }, "ida_srarea" : { "ida_area" : "ida_range", "is_segreg_locked(*args)" : "is_segreg_locked(_, *args)", }, "ida_typeinf" : { "callregs_init_regs(*args)" : "callregs_init_regs(_, *args)", "print_type3(*args)" : "print_type", }, "idc" : { "Fatal(_)" : "Fatal(*args)", "Warning(_)" : "Warning(*args)", }, } removed_symbols = { "ida_allins" : [ "NN_vmovntsd", "NN_vmovntss", ], "ida_area" : [ "AREACB_TYPE_SRAREA", "area_visitor2_t", "areacb_t", "lock_area", ], "ida_auto" : [ "autoGetName", "autoStep", ], "ida_bytes" : [ "cvar", # the following have been removed "doVar", "f_isUnknown", "getRadixEA", "get_data_type_size", "get_typeinfo", "ida_area", "isVar", "lowbits", "noImmd", "power2", "setFlags", "set_typeinfo", ], "ida_dbg" : [ "SRCIT_REGVAR", "SRCIT_RRLVAR", "SRCIT_STKVAR", ], "ida_diskio" : [ "call_system", "echsize", "echsize64", "ecreate", "ecreateT", "enumerate_system_files", "eseek", "eseek64", "getdspace", "openM", "openR", "openRT", "qfsize", "qfsize64", "qlgetz64", "qlseek64", "qlsize64", "qltell64", ], "ida_enum" : [ "const_visitor_t", "for_all_consts", "get_bmask_node", "ENUM_FLAGS_FROMTIL", "ENUM_FLAGS_GHOST", "ENUM_FLAGS_WIDTH", ], "ida_expr" : [ "call_idc_method", "call_script_method", "compile_script_file", "compile_script_func", "extlang_call_method_exists", "extlang_compile_file_exists", "extlang_run_statements_exists", "extlang_set_attr_exists", "extlang_unload_procmod", "get_extlang_fileext", "get_idcpath", "install_extlang", "remove_extlang", "run_statements", "select_extlang", "VarAssign", "find_extlang_by_ext", "find_extlang_by_name", "_IDCFUNC_CB_T", "call_idc_func__", ], "ida_fixup" : [ "FIXUP_MASK", "FIXUP_SELFREL", "FIXUP_UNUSED", "FIXUP_VHIGH", "FIXUP_VLOW", "get_fixup_base", "get_fixup_extdef_ea", "get_fixup_segdef_sel", "set_custom_fixup_ex", "set_fixup_ex", ], "ida_frame" : [ "add_stkvar2", "add_stkvar3", ], "ida_funcs" : [ "a2funcoff", "get_sig_filename", "std_gen_func_header", ], "ida_gdl" : [ "display_complex_call_chart", "display_flow_graph", "display_simple_call_chart", "ida_area", ], "ida_graph" : [ "pyg_add_command", ], "ida_hexrays" : [ "add_custom_viewer_popup_item", "vcall_helper", "vcreate_helper", ], "ida_ida" : [ "IDAPLACE_HEXDUMP", "LFLG_UNUSED", "PREF_VARMARK", "text_options_t", "dto_copy_from_inf", "dto_copy_to_inf", "dto_init", ], "ida_idd" : [ "BPT_OLD_EXEC", "idd_opinfo_old_t", ], "ida_idp" : [ "create_custom_fixup", "deleting_enum_const", "enum_const_created", "enum_const_deleted", "gen_abssym", "gen_comvar", "gen_extern", "gen_spcdef", "intel_data", "ph_get_high_fixup_bits", ], "ida_kernwin" : [ "CHOOSER_HOTKEY", "add_chooser_command", "add_menu_item", "add_output_popup", "choose2_add_command", "choose_choose", "create_ea_viewer", "create_tform", "del_menu_item", "enable_menu_item", "get_tform_idaview", "obsolete_msg_popup", "obsolete_view_popup", "py_menu_item_callback", "pyscv_add_popup_menu", "pyscv_clear_popup_menu", "set_menu_item_icon", "vumsg", "choose_enter", "choose_getl", "choose_segreg", "choose_sizer", "askfile2_cv", "vaskqstr", # ctypes vars "DEFAULT_MODE", "RTLD_GLOBAL", "RTLD_LOCAL", ], "ida_lines" : [ "ExtraFree", "MakeBorder", "MakeLine", "MakeNull", "MakeSolidBorder", "gen_cmt_line", "gen_collapsed_line", "generate_big_comment", "generate_many_lines", "printf_line", ], "ida_loader" : [ "load_loader_module", ], "ida_moves" : [ "CURLOC_SISTACK_ITEMS", "UNHID_AREA", "curloc", "location_t", ], "ida_nalt" : [ "SWI_SHIFT1", "del_jumptable_info", "get_auto_plugins", "get_jumptable_info", "ids_array", "jumptable_info_t", "set_auto_plugins", "set_jumptable_info", "switch_info_t_get_regdtyp", "switch_info_t_set_regdtyp", ], "ida_name" : [ "append_struct_fields2", "gen_name_decl", ], "ida_pro" : [ "convert_encoding", # wasn't usable (bytevec_t not exposed) "init_process", "qsplitpath", # wasn't usable (char **) "replace_tabs", # wasn't usable (wasn't returning the string) "vinterr", # wasn't usable (va_list) "expand_argv", "free_argv", "qwait", "qwait_timed", ], "ida_queue" : [ "QueueMark", ], "ida_segment" : [ "std_gen_segm_footer", ], "ida_srarea" : [ "get_srarea", "get_srareas_qty", "getn_srarea", "segreg_t", ], "ida_strlist" : [ "set_strlist_options", ], "ida_struct" : [ "get_member_ti", "set_member_ti", "get_or_guess_member_type", ], "ida_typeinf" : [ "ARGLOC_REG", "ARGLOC_REG2", "BAD_VARLOC", "append_complex_n", "append_da", "append_de", "append_dt", "append_name", "append_varloc", "apply_once_type_and_name", "apply_type2", "apply_type_to_stkarg", "build_array_type", "build_func_type", "build_func_type2", "build_funcarg_info", "calc_argloc_info", "calc_func_nargs", "calc_max_children_qty", "calc_max_number_of_children", "calc_varloc_info", "check_skip_type", "convert_argloc_to_varloc", "convert_varloc_to_argloc", "create_numbered_type_reference", "extract_and_convert_old_argloc", "extract_old_argloc", "for_all_types", "func_type_info_t", "funcarg_info_t", "get_argloc_r1", "get_argloc_r2", "get_complex_n", "get_enum_base_type", "get_func_cc", "get_func_cvtarg_map", "get_func_nargs", "get_func_rettype", "get_funcarg_size", "get_idainfo_by_type2", "get_name_of_named_type", "get_ptr_object_size", "get_referred_ordinal", "get_scattered_varloc", "get_spoil_cnt", "get_stkarg_offset", "get_strmem", "get_strmem2", "get_strmem_by_name", "get_strmem_t", "get_tilpath", "get_type_sign", "get_type_size0", "guess_func_tinfo", "is_castable2", "is_reg2_argloc", "is_reg_argloc", "cleanup_varloc", "copy_varloc", "is_resolved_type_struni", "is_restype_array", "is_restype_bitfld", "is_restype_complex", "is_restype_const", "is_restype_floating", "is_restype_func", "is_restype_ptr", "is_restype_union", "is_stack_argloc", "is_type_only_size", "is_type_resolvable", "is_type_scalar2", "is_type_unk", "is_type_void_obsolete", "is_type_voiddef", "is_valid_full_type", "make_array_type", "make_old_argloc", "parse_types2", "print_type_to_qstring", "remove_type_pointer", "rename_named_type", "replace_subtypes", "replace_subtypes2", "resolve_complex_type2", "set_complex_n", "set_named_type64", "set_scattered_varloc", "set_spoils", "skip_spoiled_info", "skip_varloc", "split_old_argloc", "til2idb", "type_mapper_t", "type_pair_t", "type_pair_vec_t", "type_visitor_t", "valstrs_deprecated2_t", "valstrs_deprecated_t", ], "ida_ua" : [ "OutBadInstruction", "OutChar", "OutImmChar", "OutLine", "OutLong", "OutMnem", "OutValue", "cmd", # can't simulate those; they rely on cmd "dataSeg", "dataSeg_op", "dataSeg_opreg", "init_output_buffer", "out_addr_tag", "out_colored_register_line", "out_keyword", "out_line", "out_long", "out_name_expr", "out_one_operand", "out_register", "out_symbol", "out_tagoff", "out_tagon", "py_get_global_cmd_link", "term_output_buffer", "ua_add_off_drefs2", "ua_ana0", "ua_code", "ua_dodata2", "ua_outop", "ua_outop2", "ua_next_byte", "ua_next_word", "ua_next_long", "ua_next_qword", # these guys are now handled by SWiG (no more c-link stuff.) "insn_t_assign", "insn_t_create", "insn_t_destroy", "insn_t_get_auxpref", "insn_t_get_canon_feature", "insn_t_get_canon_mnem", "insn_t_get_cs", "insn_t_get_ea", "insn_t_get_flags", "insn_t_get_insnpref", "insn_t_get_ip", "insn_t_get_itype", "insn_t_get_op_link", "insn_t_get_segpref", "insn_t_get_size", "insn_t_is_canon_insn", "insn_t_set_auxpref", "insn_t_set_cs", "insn_t_set_ea", "insn_t_set_flags", "insn_t_set_insnpref", "insn_t_set_ip", "insn_t_set_itype", "insn_t_set_segpref", "insn_t_set_size", "op_t_assign", "op_t_create", "op_t_destroy", "op_t_get_addr", "op_t_get_dtyp", "op_t_get_flags", "op_t_get_n", "op_t_get_offb", "op_t_get_offo", "op_t_get_reg_phrase", "op_t_get_specflag1", "op_t_get_specflag2", "op_t_get_specflag3", "op_t_get_specflag4", "op_t_get_specval", "op_t_get_type", "op_t_get_value", "op_t_set_addr", "op_t_set_dtyp", "op_t_set_flags", "op_t_set_n", "op_t_set_offb", "op_t_set_offo", "op_t_set_reg_phrase", "op_t_set_specflag1", "op_t_set_specflag2", "op_t_set_specflag3", "op_t_set_specflag4", "op_t_set_specval", "op_t_set_type", "op_t_set_value", ], "idc" : [ "ida_srarea", "ASCSTR_LAST", "FIXUP_MASK", "GetOpnd", "MakeCustomDataEx", "SW_MICRO", "SetFlags", "SetHiddenArea", "FF_VAR", "INFFL_LZERO", "INF_WIDE_HIGH_BYTE_FIRST", "INF_ABINAME", "INF_ASCIIFLAGS", "INF_ASCIIPREF", "INF_ASCIISERNUM", "INF_ASCIIZEROES", "INF_ASCII_BREAK", "INF_ASSUME", "INF_AUTO", "INF_BEGIN_EA", "INF_CHECKARG", "INF_CORESTART", "INF_ENTAB", "INF_FCORESIZ", "INF_MF", "INF_NAMELEN", "INF_NULL", "INF_ORG", "INF_PACKBASE", "INF_PREFSEG", "INF_SHOWAUTO", "INF_SHOWBADS", "INF_SHOWPREF", "INF_START_AF", "INF_VOIDS", "REF_VHIGH", "REF_VLOW", "_invoke_idc_setprm", "byteValue", "isFop0", "isFop1", "isVar", "Tabs", "o_fpreg_arm", ], } for modname in sorted(api_695.keys()): m6 = api_695[modname] new_modname = modname m7 = api_700[renamed_modules.get(modname, modname)] for symbol in m6: symbol_root = symbol params = "" paren_idx = symbol_root.find("(") if paren_idx > -1: symbol_root, params = symbol_root[0:paren_idx], symbol_root[paren_idx:] removed_set = removed_symbols.get(modname, []) if symbol_root in removed_set: continue renamed_set = renamed_symbols.get(modname, {}) if symbol_root in renamed_set.get("TODO", []): continue target_symbol = renamed_set.get(symbol_root, symbol_root) if target_symbol not in m7: # try looking for a full prototype then target_symbol = renamed_set.get(symbol, symbol) if target_symbol not in m7: add = "" is_redef = False if params: # search for something that might correspond x = "%s(" % symbol_root for s in m7: if s.startswith(x): # print ("Candidate for '%s': '%s'" % (x, s)) if s.endswith("bc695redef"): is_redef = True # symbol was redefined, and marked as such. We assume we know what we're doing break else: add = " => %s" % s if not is_redef: print("Missing: '%s.%s'%s" % (modname, symbol, add))