def get_class_def(class_name): h = class_name + ".h" if h in proj.header_files(): hfile = hparser.HFile(h) if class_name in hfile.struct_list(): return hfile.get(class_name) else: for h in proj.header_files(): hfile = hparser.HFile(h) if class_name in hfile.struct_list(): return hfile.get(class_name) return None
def __init__(self): super(Ui_RenameClassDialog, self).__init__() self.d = QtGui.QDialog() self.setupUi(self.d) self.old_name = "" self.new_name = "" self.text_items = [] self.functions = [] self.header_files = [] self.ok_btn.clicked.connect(self.ok_btn_clicked) self.cancel_btn.clicked.connect(self.cancel_btn_clicked) self.class_cb.editTextChanged.connect(self.oldname_changed) self.new_name_edit.textChanged.connect(self.newname_changed) self.include_all_cb.stateChanged.connect(self.all_state_changed) visual_style.set(self.d) self.structname_to_file_table = {} self.field_to_struct_table = {} for h in proj.header_files(): hfile = hparser.HFile(h) for name in hfile.struct_list(): self.structname_to_file_table[name] = h # for field in hfile.get(name).names(): # l = self.field_to_struct_table.get(field, []) # l.append(name) # self.field_to_struct_table[field] = l self.struct_completer = QtGui.QCompleter( self.structname_to_file_table.keys(), self.d) self.struct_completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.class_cb.setCompleter(self.struct_completer)
def __init__(self): super(Ui_RenameVarDialog, self).__init__() self.d = QtGui.QDialog() self.setupUi(self.d) self.old_name = "" self.new_name = "" self.vars = [] self.functions = [] self.ok_btn.clicked.connect(self.ok_btn_clicked) self.cancel_btn.clicked.connect(self.cancel_btn_clicked) self.old_name_edit.textChanged.connect(self.oldname_changed) self.new_name_edit.textChanged.connect(self.newname_changed) visual_style.set(self.d) self.structname_to_file_table = {} self.field_to_struct_table = {} for h in proj.header_files(): hfile = hparser.HFile(h) for name in hfile.struct_list(): self.structname_to_file_table[name] = h for field in hfile.get(name).names(): l = self.field_to_struct_table.get(field, []) l.append(name) self.field_to_struct_table[field] = l
def rename(self): if not self.new_name_ok() or not self.old_name: return False found = False for i, a in enumerate(self.vars): item = self.occurences_lit.item(i) if item.checkState() == QtCore.Qt.Checked: clname = a["classname"] filename = self.structname_to_file_table[clname] hfile = hparser.HFile(filename) struct = hfile.get(clname) struct.rename_var(self.old_name, self.new_name) hfile.update(struct) hfile.save() idc.ParseTypes(filename, idc.PT_FILE | idc.PT_PAKDEF) found = True for i, a in enumerate(self.functions): item = self.occurences_lit.item(i + len(self.vars)) if item.checkState() == QtCore.Qt.Checked: ea = a["ea"] func_name = a["func_name"] if func_name.demangled: if not gui.ask( "Function %s is mangled. If you wish to rename it, mangling will dissapear. Continue?" % func_name.signature()): continue old_name = func_name.fullname() func_name.set_base_name(self.new_name) print ea, func_name.fullname(), idc.SN_NOCHECK idc.MakeNameEx(ea, str(func_name.fullname()), idc.SN_NOCHECK) print "FunctionName %s is replaced to %s" % ( old_name, func_name.fullname()) found = True return found
def scan_headers(self): h = self.class_name + ".h" if h in proj.header_files(): hfile = hparser.HFile(h) if self.class_name in hfile.struct_list(): self.class_def = hfile.get(self.class_name) else: for h in proj.header_files(): hfile = hparser.HFile(h) if self.class_name in hfile.struct_list(): self.class_def = hfile.get(self.class_name) break for h in proj.header_files(): hfile = hparser.HFile(h) for name in hfile.struct_list(): self.structname_to_file_table[name] = h
def save(self): if not self.new_struct: gui.critical("Insertion process failed. Cant save") return filename = self.structname_to_file_table[self.new_struct.name] shutil.copy(filename,filename+".bak") hfile = hparser.HFile(filename) hfile.update(self.new_struct) hfile.save() idc.ParseTypes(filename, idc.PT_FILE | idc.PT_PAKDEF)
def get_oldclass_data(self): self.old_struct_text = "" self.old_struct = None class_name = self.class_cb.currentText() if class_name in self.structname_to_file_table.keys(): filename = self.structname_to_file_table[class_name] hfile = hparser.HFile(filename) self.old_struct = hfile.get(class_name) bounds = hfile.bounds(class_name) f = open(filename) text = f.read() f.close() self.old_struct_text = text[bounds[0]:bounds[1]]
def __init__(self): super(Ui_CreateVarDialog,self).__init__() self.d = QtGui.QDialog() self.setupUi(self.d) self.save_btn.clicked.connect(self.ok_btn_clicked) self.cancel_btn.clicked.connect(self.cancel_btn_clicked) visual_style.set(self.d) self.success = False self.structname_to_file_table = {} self.field_to_struct_table = {} for h in proj.header_files(): hfile = hparser.HFile(h) for name in hfile.struct_list(): self.structname_to_file_table[name] = h for field in hfile.get(name).names(): l = self.field_to_struct_table.get(field,[]) l.append(name) self.field_to_struct_table[field] = l self.class_cb.editTextChanged.connect(self.on_class_name_changed) self.old_var_name_edit.textChanged.connect(self.on_old_var_changed) self.array_index_edit.textChanged.connect(self.on_editors_changed) self.newvar_name_edit.textChanged.connect(self.on_editors_changed) self.verticalScrollBar.valueChanged.connect(self.on_scrolled) self.dest_text_edit.verticalScrollBar().valueChanged.connect(self.on_scrolled) self.source_text_edit.verticalScrollBar().valueChanged.connect(self.on_scrolled) self.old_struct_text = "" self.new_struct_text = "" self.old_struct = None self.new_struct = None self.struct_completer = QtGui.QCompleter(self.structname_to_file_table.keys(),self.d) self.struct_completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.class_cb.setCompleter(self.struct_completer) self.fill_structname_list()
def prepare_class_def(self): if "m_vptr" in self.class_def.names(): mvptr = self.class_def.field("m_vptr") typ = mvptr.typ if typ in self.structname_to_file_table.keys(): hfile = hparser.HFile(self.structname_to_file_table[typ]) virtual_table = hfile.get(typ) self.virtual_funcs = virtual_table.names() for ea, func_name in self.funcs: decl = self.func_declaration(ea) print "func name = %s virtual funcs = %s" % (func_name, ";".join( self.virtual_funcs)) if func_name.basename in self.virtual_funcs: decl = "virtual " + decl for render in [ self.remove_deconstructor, self.remove_calltype, self.remove_deconstructor, self.remove_classname ]: decl = render(decl) self.class_def.append_func_decl(decl)
def renew_filter(self): self.vars = [] self.functions = [] if not self.old_name: return #find variables l = self.field_to_struct_table.get(self.old_name, []) for clname in l: filename = self.structname_to_file_table[clname] h = hparser.HFile(filename) struct = h.get(clname) field = struct.field(self.old_name) a = {"classname": clname, "name": field.name, "decl": str(field)} self.vars.append(a) #find function names for ea in idautils.Functions(): func_name = FunctionName(idc.GetFunctionName(ea)) if func_name.basename == self.old_name or \ rename.remove_operator_symbols(func_name.basename) == self.old_name: a = {"ea": ea, "func_name": func_name} self.functions.append(a)