Beispiel #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);
    }
Beispiel #2
0
    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);
    }