Example #1
0
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
Example #2
0
    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)
Example #3
0
    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
Example #4
0
 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
Example #5
0
    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
Example #6
0
    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)
Example #7
0
    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]]
Example #8
0
    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()
Example #9
0
    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)
Example #10
0
    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)