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); }
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); }