Exemple #1
0
        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;
                        }
                    }
                }
            }
        }
Exemple #2
0
		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;
		}
Exemple #3
0
        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;
        }
Exemple #4
0
        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;
                            }
                        }
                    }
                }
            }
        }