def format_vfunc_name(self, ea, current_func_name, proposed_func_name, class_name, parent_class_names): if current_func_name.startswith("j_"): # jump current_func_name = current_func_name.lstrip("j_") if current_func_name.startswith("qword_"): idc.auto_mark_range(ea, ea + 1, idc.AU_CODE) idc.create_insn(ea) idc.add_func(ea) current_func_name = api.get_addr_name(ea) print( "Info: qword in vtbl of {1} at 0x{0:X}, it may be an offset to undefined code" .format(ea, class_name)) # Previously renamed as a vfunc if current_func_name.startswith(class_name): # return the proposed func name in case it was updated since last run current_class_name = current_func_name.rsplit(".", 1)[0] return "{0}.{1}".format(current_class_name, proposed_func_name) # This should have been handled in the parent class if any( current_func_name.startswith(name) for name in parent_class_names): return "" if current_func_name.startswith("sub_"): return "{0}.{1}".format(class_name, proposed_func_name) if current_func_name.startswith("nullsub_"): return "{0}.{1}_nullsub".format(class_name, proposed_func_name) if current_func_name.startswith("loc_"): return "{0}.{1}_loc".format(class_name, proposed_func_name) if current_func_name.startswith("locret_"): return "{0}.{1}_locret".format(class_name, proposed_func_name) # Name it later in a child class when it gets overridden if current_func_name == "_purecall": return "" # Mangled func names, thanks IDA if current_func_name.startswith( "?") or current_func_name.startswith("_"): return "{0}.{1}".format(class_name, proposed_func_name) return None
def auto_make_code(x): return idc.auto_mark_range(x, (x) + 1, AU_CODE)