private void UpdateTree() { TreeClassView.Nodes.Clear(); DeObfuscator = new TDeObfuscator(Files); foreach (string fn in Files) { TClassFile ClassFile = new TClassFile(fn); if (!ClassFile.Open()) { TreeClassView.Nodes.Add("Invalid class file: " + fn); continue; } if (ClassFile != null) { TreeNode bigroot; // check if the user wants to rename the class file string original_class_name = ClassFile.ThisClassName + " : " + ClassFile.SuperClassName; string class_name = RenameStore.GetNewClassName(original_class_name); if (class_name == null) { class_name = original_class_name; bigroot = TreeClassView.Nodes.Add(class_name); } else { bigroot = TreeClassView.Nodes.Add(class_name); bigroot.BackColor = Color.DodgerBlue; } bigroot.Tag = original_class_name; TreeNode root = bigroot.Nodes.Add("Constants"); TreeNode methodsroot = root.Nodes.Add("Methods/Interfaces/Fields"); TreeNode methods = methodsroot.Nodes.Add("Methods"); TreeNode interfaces = methodsroot.Nodes.Add("Interfaces"); TreeNode fields = methodsroot.Nodes.Add("Fields"); TreeNode variables = root.Nodes.Add("Values"); TreeNode classes = root.Nodes.Add("Classes"); for (int i = 0; i < ClassFile.ConstantPool.MaxItems(); i++) { ConstantPoolInfo cc = ClassFile.ConstantPool.Item(i); if (cc is ConstantPoolMethodInfo) { if (cc is ConstantMethodrefInfo) { TreeNode temp = methods.Nodes.Add("\"" + ((ConstantMethodrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantMethodrefInfo)cc).NameAndType.Descriptor); temp.Nodes.Add("Parent = " + ((ConstantMethodrefInfo)cc).ParentClass.Name); if (DeObfuscator.DoRename(((ConstantMethodrefInfo)cc).NameAndType.Name)) temp.BackColor = Color.Red; continue; } if (cc is ConstantInterfaceMethodrefInfo) { TreeNode temp = interfaces.Nodes.Add("\"" + ((ConstantInterfaceMethodrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantInterfaceMethodrefInfo)cc).NameAndType.Descriptor); temp.Nodes.Add("Parent = " + ((ConstantInterfaceMethodrefInfo)cc).ParentClass.Name); if (DeObfuscator.DoRename(((ConstantInterfaceMethodrefInfo)cc).NameAndType.Name)) temp.BackColor = Color.Red; continue; } if (cc is ConstantFieldrefInfo) { TreeNode temp = fields.Nodes.Add("\"" + ((ConstantFieldrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantFieldrefInfo)cc).NameAndType.Descriptor); if (((ConstantFieldrefInfo)cc).ParentClass != null) temp.Nodes.Add("Parent = " + ((ConstantFieldrefInfo)cc).ParentClass.Name); if (DeObfuscator.DoRename(((ConstantFieldrefInfo)cc).NameAndType.Name)) temp.BackColor = Color.Red; continue; } } else if (cc is ConstantPoolVariableInfo) { TreeNode temp = variables.Nodes.Add("\"" + ((ConstantPoolVariableInfo)cc).Value.ToString() + "\""); temp.Nodes.Add("References = " + cc.References); } else if (cc is ConstantClassInfo) { TreeNode temp = classes.Nodes.Add("\"" + ((ConstantClassInfo)cc).Name + "\""); temp.Nodes.Add("References = " + cc.References); } } root = bigroot.Nodes.Add("Interfaces"); foreach (InterfaceInfo ii in ClassFile.Interfaces.Items) { root.Nodes.Add(ii.Interface.Name); } root = bigroot.Nodes.Add("Fields"); foreach (FieldInfo fi in ClassFile.Fields.Items) { RenameData rd = RenameStore.GetNewFieldInfo( original_class_name, fi.Descriptor, fi.Name.Value); if (rd != null) { TreeNode temp = root.Nodes.Add(rd.FieldName); temp.Nodes.Add(rd.FieldType); temp.BackColor = Color.DodgerBlue; } else { TreeNode temp = root.Nodes.Add(fi.Name.Value); temp.Nodes.Add(fi.Descriptor); temp.Tag = fi.Name.Value; if (DeObfuscator.DoRename(fi.Name.Value)) temp.BackColor = Color.Red; } } root = bigroot.Nodes.Add("Methods"); foreach (MethodInfo mi in ClassFile.Methods.Items) { RenameData rd = RenameStore.GetNewMethodInfo( original_class_name, mi.Descriptor, mi.Name.Value); if (rd != null) { TreeNode temp = root.Nodes.Add(rd.FieldName); temp.Nodes.Add(rd.FieldType); temp.BackColor = Color.DodgerBlue; } else { TreeNode temp = root.Nodes.Add(mi.Name.Value); temp.Nodes.Add(mi.Descriptor); temp.Tag = mi.Name.Value; //temp.Nodes.Add(String.Format("Offset = {0:X}", mi.Offset)); if (DeObfuscator.DoRename(mi.Name.Value)) temp.BackColor = Color.Red; } } } } }
public ArrayList DeObfuscateAll(RenameDatabase RenameStore) { FClassFiles = new ArrayList(); FInterfaces = new ArrayList(); ArrayList MasterChangeList = new ArrayList(); ArrayList NewFileNameList = new ArrayList(); int curr_progress = 0; // open each class file and add to array foreach (string fn in FFiles) { TClassFile cf = new TClassFile(fn); if (cf != null) { if (cf.Open()) { FClassFiles.Add(cf); } } } // do all the work in memory for (int i = 0; i < FClassFiles.Count; i++) { // this deobfuscates a single class, and keeps a record of all the changes // in an arraylist of ChangeRecords // // we need more here! // // first, if the file we deobfuscated had a parent, we have to add the entire change list // from the parent to the end of the current (recursively), minus the old/new name // note: this duplications of data fixes problems with inheritance // MasterChangeList.Add(DeObfuscateSingleFile(i, RenameStore)); } // iterate through all the class files using the change records saved // after the deobfuscation was done MasterChangeList = FixInheritance(MasterChangeList); // iterate through all the class files using the change records saved // after the deobfuscation was done FixReferences(MasterChangeList); // save all the class files for (int i = 0; i < FClassFiles.Count; i++) { TClassFile cf = (TClassFile)FClassFiles[i]; // extract the actual filename from the path and replace it with the new ClassName string file_name;//= Path.GetDirectoryName(cf.FileName) + Path.DirectorySeparatorChar + Common.GetClassName(cf.ThisClassName) + ".class"; file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + ".class"); if (File.Exists(file_name)) { file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + cf.ThisClassCode + ".class"); } if (File.Exists(file_name)) { file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + ((i * cf.ThisClassCode) + i) + ".class"); } //file_name = file_name.Replace('/', '\\'); //if ((file_name != cf.FileName) && FCleanup) //{ // File.Delete(cf.FileName); //} // if for some reason the directory doesn't exist, create it if (!Directory.Exists(Path.GetDirectoryName(file_name))) Directory.CreateDirectory(Path.GetDirectoryName(file_name)); cf.Save(file_name); // return the new filename so the main gui knows what to reload NewFileNameList.Add(file_name); } return NewFileNameList; }
public ArrayList DeObfuscateAll(RenameDatabase RenameStore) { FClassFiles = new ArrayList(); FInterfaces = new ArrayList(); ArrayList MasterChangeList = new ArrayList(); ArrayList NewFileNameList = new ArrayList(); int curr_progress = 0; Progress(0); // open each class file and add to array foreach (string fn in FFiles) { TClassFile cf = new TClassFile(fn); if (cf != null) { if (cf.Open()) { FClassFiles.Add(cf); Progress(++curr_progress); } } } // do all the work in memory for (int i = 0; i < FClassFiles.Count; i++) { // this deobfuscates a single class, and keeps a record of all the changes // in an arraylist of ChangeRecords // // we need more here! // // first, if the file we deobfuscated had a parent, we have to add the entire change list // from the parent to the end of the current (recursively), minus the old/new name // note: this duplications of data fixes problems with inheritance // MasterChangeList.Add(DeObfuscateSingleFile(i, RenameStore)); Progress(i + 1); } Progress(0); curr_progress = 0; // iterate through all the class files using the change records saved // after the deobfuscation was done MasterChangeList = FixInheritance(MasterChangeList); // iterate through all the class files using the change records saved // after the deobfuscation was done FixReferences(MasterChangeList); // save all the class files for (int i = 0; i < FClassFiles.Count; i++) { TClassFile cf = (TClassFile)FClassFiles[i]; // extract the actual filename from the path and replace it with the new ClassName string file_name;//= Path.GetDirectoryName(cf.FileName) + Path.DirectorySeparatorChar + Common.GetClassName(cf.ThisClassName) + ".class"; file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + ".class"); if (File.Exists(file_name)) { file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + cf.ThisClassCode + ".class"); } if (File.Exists(file_name)) { file_name = Path.Combine(this.OutputDir, Common.GetClassName(cf.ThisClassName) + ((i * cf.ThisClassCode) + i) + ".class"); } //file_name = file_name.Replace('/', '\\'); //if ((file_name != cf.FileName) && FCleanup) //{ // File.Delete(cf.FileName); //} // if for some reason the directory doesn't exist, create it if (!Directory.Exists(Path.GetDirectoryName(file_name))) Directory.CreateDirectory(Path.GetDirectoryName(file_name)); cf.Save(file_name); // return the new filename so the main gui knows what to reload NewFileNameList.Add(file_name); Progress(++curr_progress); } return NewFileNameList; }
private void UpdateTree() { TreeClassView.Nodes.Clear(); DeObfuscator = new TDeObfuscator(Files); foreach (string fn in Files) { TClassFile ClassFile = new TClassFile(fn); if (!ClassFile.Open()) { TreeClassView.Nodes.Add("Invalid class file: " + fn); continue; } if (ClassFile != null) { TreeNode bigroot; // check if the user wants to rename the class file string original_class_name = ClassFile.ThisClassName + " : " + ClassFile.SuperClassName; string class_name = RenameStore.GetNewClassName(original_class_name); if (class_name == null) { class_name = original_class_name; bigroot = TreeClassView.Nodes.Add(class_name); } else { bigroot = TreeClassView.Nodes.Add(class_name); bigroot.BackColor = Color.DodgerBlue; } bigroot.Tag = original_class_name; TreeNode root = bigroot.Nodes.Add("Constants"); TreeNode methodsroot = root.Nodes.Add("Methods/Interfaces/Fields"); TreeNode methods = methodsroot.Nodes.Add("Methods"); TreeNode interfaces = methodsroot.Nodes.Add("Interfaces"); TreeNode fields = methodsroot.Nodes.Add("Fields"); TreeNode variables = root.Nodes.Add("Values"); TreeNode classes = root.Nodes.Add("Classes"); for (int i = 0; i < ClassFile.ConstantPool.MaxItems(); i++) { ConstantPoolInfo cc = ClassFile.ConstantPool.Item(i); if (cc is ConstantPoolMethodInfo) { if (cc is ConstantMethodrefInfo) { TreeNode temp = methods.Nodes.Add("\"" + ((ConstantMethodrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantMethodrefInfo)cc).NameAndType.Descriptor); temp.Nodes.Add("Parent = " + ((ConstantMethodrefInfo)cc).ParentClass.Name); if (DeObfuscator.DoRename(((ConstantMethodrefInfo)cc).NameAndType.Name)) { temp.BackColor = Color.Red; } continue; } if (cc is ConstantInterfaceMethodrefInfo) { TreeNode temp = interfaces.Nodes.Add("\"" + ((ConstantInterfaceMethodrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantInterfaceMethodrefInfo)cc).NameAndType.Descriptor); temp.Nodes.Add("Parent = " + ((ConstantInterfaceMethodrefInfo)cc).ParentClass.Name); if (DeObfuscator.DoRename(((ConstantInterfaceMethodrefInfo)cc).NameAndType.Name)) { temp.BackColor = Color.Red; } continue; } if (cc is ConstantFieldrefInfo) { TreeNode temp = fields.Nodes.Add("\"" + ((ConstantFieldrefInfo)cc).NameAndType.Name + "\""); temp.Nodes.Add("Descriptor = " + ((ConstantFieldrefInfo)cc).NameAndType.Descriptor); if (((ConstantFieldrefInfo)cc).ParentClass != null) { temp.Nodes.Add("Parent = " + ((ConstantFieldrefInfo)cc).ParentClass.Name); } if (DeObfuscator.DoRename(((ConstantFieldrefInfo)cc).NameAndType.Name)) { temp.BackColor = Color.Red; } continue; } } else if (cc is ConstantPoolVariableInfo) { TreeNode temp = variables.Nodes.Add("\"" + ((ConstantPoolVariableInfo)cc).Value.ToString() + "\""); temp.Nodes.Add("References = " + cc.References); } else if (cc is ConstantClassInfo) { TreeNode temp = classes.Nodes.Add("\"" + ((ConstantClassInfo)cc).Name + "\""); temp.Nodes.Add("References = " + cc.References); } } root = bigroot.Nodes.Add("Interfaces"); foreach (InterfaceInfo ii in ClassFile.Interfaces.Items) { root.Nodes.Add(ii.Interface.Name); } root = bigroot.Nodes.Add("Fields"); foreach (FieldInfo fi in ClassFile.Fields.Items) { RenameData rd = RenameStore.GetNewFieldInfo( original_class_name, fi.Descriptor, fi.Name.Value); if (rd != null) { TreeNode temp = root.Nodes.Add(rd.FieldName); temp.Nodes.Add(rd.FieldType); temp.BackColor = Color.DodgerBlue; } else { TreeNode temp = root.Nodes.Add(fi.Name.Value); temp.Nodes.Add(fi.Descriptor); temp.Tag = fi.Name.Value; if (DeObfuscator.DoRename(fi.Name.Value)) { temp.BackColor = Color.Red; } } } root = bigroot.Nodes.Add("Methods"); foreach (MethodInfo mi in ClassFile.Methods.Items) { RenameData rd = RenameStore.GetNewMethodInfo( original_class_name, mi.Descriptor, mi.Name.Value); if (rd != null) { TreeNode temp = root.Nodes.Add(rd.FieldName); temp.Nodes.Add(rd.FieldType); temp.BackColor = Color.DodgerBlue; } else { TreeNode temp = root.Nodes.Add(mi.Name.Value); temp.Nodes.Add(mi.Descriptor); temp.Tag = mi.Name.Value; //temp.Nodes.Add(String.Format("Offset = {0:X}", mi.Offset)); if (DeObfuscator.DoRename(mi.Name.Value)) { temp.BackColor = Color.Red; } } } } } }