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 MethodDefinition DumpMethod(MethodDump dumper, TypeDefinition type, GameMethod runtimeMethod) { // Check stack if (dumper.IsOnStack(runtimeMethod)) { return((MethodDefinition)dumper.GrabFromStack(runtimeMethod)); } // Create method definition MethodDefinition method = new MethodDefinition(runtimeMethod.Name, runtimeMethod.Flags, type.Module.ImportReference(typeof(void))); method.ImplAttributes = runtimeMethod.IFlags; method.MetadataToken = new MetadataToken(runtimeMethod.Token); type.Methods.Add(method); // Add to stack dumper.PushToStack(runtimeMethod, method); // Setup return type TypeReference returnType = GetTypeReferenceWithByRef(method, runtimeMethod.Return); if (returnType != null) { method.ReturnType = returnType; } else { Logger.Log("Failed to find type for " + runtimeMethod.Name); } // Setup body if (method.HasBody && type.BaseType?.FullName != "System.MulticastDelegate") { // TODO: Make it run what I need ILProcessor il = method.Body.GetILProcessor(); il.Append(Instruction.Create(OpCodes.Nop)); } // Setup parameters /*runtimeMethod.IterateParameters((IntPtr ptrParamType, string name) => * { * IL2CPPType paramType = (IL2CPPType)Marshal.PtrToStructure(ptrParamType, typeof(IL2CPPType)); * TypeReference paramRef = GetTypeReferenceWithByRef(method, ptrParamType); * if (paramRef == null) return; * * ParameterDefinition parameterDefinition = new ParameterDefinition(name, (ParameterAttributes)paramType.attrs, paramRef); * method.Parameters.Add(parameterDefinition); * });*/ // End return(method); }