예제 #1
0
    private static AssemblyDefinition DumpAssembly(GameAssembly runtimeAssembly)
    {
        // Check stack
        if (assemblyDumper.IsOnStack(runtimeAssembly))
        {
            return((AssemblyDefinition)assemblyDumper.GrabFromStack(runtimeAssembly));
        }

        // Generate assembly file
        AssemblyDefinition assembly   = AssemblyDefinition.CreateAssembly(new AssemblyNameDefinition(runtimeAssembly.Name, new Version(3, 7, 1, 6)), runtimeAssembly.Name, ModuleKind.Dll);
        ModuleDefinition   mainModule = assembly.MainModule;

        // Add to stack
        assemblyDumper.PushToStack(runtimeAssembly, assembly);

        // Store dumped classes
        Dictionary <GameClass, TypeDefinition> dumpedClasses = new Dictionary <GameClass, TypeDefinition>();

        // Get classes
        ClassDump classDumper = new ClassDump(runtimeAssembly);

        while (classDumper.HasNext())
        {
            // Get runtime class
            GameClass runtimeClass = classDumper.Next();
            if (runtimeClass == null)
            {
                continue;
            }

            // Dump
            dumpedClasses.Add(runtimeClass, DumpClass(classDumper, mainModule, runtimeClass));
        }

        // Populate classes
        foreach (GameClass runtimeClass in dumpedClasses.Keys)
        {
            // Dump methods
            MethodDump methodDumper = new MethodDump(runtimeClass);
            while (methodDumper.HasNext())
            {
                // Get method
                GameMethod runtimeMethod = methodDumper.Next();
                if (runtimeMethod == null)
                {
                    continue;
                }

                // Dump
                DumpMethod(methodDumper, dumpedClasses[runtimeClass], runtimeMethod);
            }
        }

        // End
        Logger.Log("Dumped assembly: " + runtimeAssembly.Name);
        assembly.Write("AtiRoNya\\Dumps\\" + runtimeAssembly.Name + ".dll");
        return(assembly);
    }
예제 #2
0
    private static TypeDefinition DumpClass(ClassDump dumper, ModuleDefinition target, GameClass runtimeClass)
    {
        // Check stack
        if (dumper.IsOnStack(runtimeClass))
        {
            return((TypeDefinition)dumper.GrabFromStack(runtimeClass));
        }

        // Create type definition
        TypeDefinition type = new TypeDefinition(runtimeClass.Namespace, runtimeClass.Name, runtimeClass.Flags);

        type.MetadataToken = new MetadataToken(runtimeClass.Token);

        // Add to stack
        dumper.PushToStack(runtimeClass, type);

        // Add type to assembly
        if (runtimeClass.Parent != IntPtr.Zero)
        {
            GameClass      parent     = new GameClass(runtimeClass.Parent);
            TypeDefinition parentType = DumpClass(dumper, target, parent);

            if (parentType == null)
            {
                target.Types.Add(type);
            }
            else
            {
                parentType.NestedTypes.Add(type);
            }
        }
        else
        {
            target.Types.Add(type);
        }

        // End
        return(type);
    }