Пример #1
0
        public void Write(string fileName, WriterParameters parameters)
        {
            Mixin.CheckParameters(parameters);
            var file = GetFileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);

            ModuleWriter.WriteModule(this, Disposable.Owned(file), parameters);
        }
Пример #2
0
        public override int Execute()
        {
            var hostedScript = new HostedScriptEngine
            {
                CustomConfig = ScriptFileHelper.CustomConfigPath(_path)
            };

            hostedScript.Initialize();
            ScriptFileHelper.OnBeforeScriptRead(hostedScript);
            var source   = hostedScript.Loader.FromFile(_path);
            var compiler = hostedScript.GetCompilerService();

            hostedScript.SetGlobalEnvironment(new DoNothingHost(), source);
            var writer = new ModuleWriter(compiler);

            try
            {
                writer.Write(Console.Out, source);
            }
            catch (ScriptException e)
            {
                Output.WriteLine(e.Message);
                return(1);
            }

            return(0);
        }
Пример #3
0
        private static void CreateAssembly(string assembly, Bitness bitness, Action <ModuleDefMD> modifyAction = null)
        {
            var creationOptions = new ModuleCreationOptions
            {
                Context = ModuleDef.CreateModuleContext(),
                TryToLoadPdbFromDisk = true
            };

            using var module = ModuleDefMD.Load(assembly, creationOptions);

            ChangeBitness(module, bitness);

            modifyAction?.Invoke(module);

            DisableEditAndContinueForModule(module);

            var path         = Path.GetDirectoryName(module.Location);
            var filename     = Path.GetFileNameWithoutExtension(module.Location);
            var extension    = Path.GetExtension(module.Location);
            var saveFilename = $"{filename}.{bitness}{extension}";

            module.Name = saveFilename;

            var moduleWriterOptions = new ModuleWriterOptions(module)
            {
                AddCheckSum = true,
                WritePdb    = true
            };
            var moduleWriter = new ModuleWriter(module, moduleWriterOptions);

            ReplaceMSCOREEReferenceWithIJWHostForNetCoreApp(module, moduleWriter);

            moduleWriter.Write(Path.Combine(path, saveFilename));
        }
Пример #4
0
        public override void Write(ModuleWriter writer)
        {
            // Compute the field size.
            int fieldSize = 8;

            if (initializer != null)
            {
                fieldSize += initializer.GetQualifiedSize();
            }

            // Write the header.
            MemberHeader header = new MemberHeader();

            header.memberType       = (byte)MemberHeaderType.Field;
            header.memberName       = GetModule().RegisterString(GetName());
            header.memberFlags      = (uint)GetFlags();
            header.memberSize       = (uint)fieldSize;
            header.memberAttributes = GetAttributeCount();
            header.Write(writer);

            // Write the attributes.
            WriteAttributes(writer);

            // Write the type and the slot.
            writer.Write((uint)GetModule().RegisterType(GetVariableType()));
            writer.Write((int)slot);

            // Write the initializer.
            if (initializer != null)
            {
                initializer.WriteQualified(GetModule(), writer);
            }
        }
Пример #5
0
 public virtual void Write(ModuleWriter writer)
 {
     writer.Write(memberType);
     writer.Write(memberName);
     writer.Write(memberFlags);
     writer.Write(memberSize);
     writer.Write(memberAttributes);
 }
Пример #6
0
        public void Write(Stream stream, WriterParameters parameters)
        {
            Mixin.CheckStream(stream);
            Mixin.CheckWriteSeek(stream);
            Mixin.CheckParameters(parameters);

            ModuleWriter.WriteModule(this, Disposable.NotOwned(stream), parameters);
        }
Пример #7
0
        public void Write(Stream stream, WriterParameters parameters)
        {
            Root.Code.Libs.Mono.Cecil.Mixin.CheckStream(stream);
            Root.Code.Libs.Mono.Cecil.Mixin.CheckWriteSeek(stream);
            Root.Code.Libs.Mono.Cecil.Mixin.CheckParameters(parameters);

            ModuleWriter.WriteModule(this, Disposable.NotOwned(stream), parameters);
        }
Пример #8
0
 public virtual void Write(ModuleWriter writer)
 {
     writer.Write(memberType);
     writer.Write(memberName);
     writer.Write(memberFlags);
     writer.Write(memberSize);
     writer.Write(memberAttributes);
 }
Пример #9
0
 public void Write(ModuleWriter writer)
 {
     writer.Write(functionType);
     writer.Write(numargs);
     writer.Write(numlocals);
     writer.Write(numblocks);
     writer.Write(numexceptions);
     writer.Write(vslot);
 }
Пример #10
0
 public void Write(ModuleWriter writer)
 {
     writer.Write(functionType);
     writer.Write(numargs);
     writer.Write(numlocals);
     writer.Write(numblocks);
     writer.Write(numexceptions);
     writer.Write(vslot);
 }
Пример #11
0
 public void Write(ModuleWriter writer)
 {
     writer.Write(baseStructure);
     writer.Write(numinterfaces);
     writer.Write(numfields);
     writer.Write(numvmethods);
     writer.Write(numcontracts);
     writer.Write(nummembers);
 }
Пример #12
0
 public void Write(ModuleWriter writer)
 {
     writer.Write(baseStructure);
     writer.Write(numinterfaces);
     writer.Write(numfields);
     writer.Write(numvmethods);
     writer.Write(numcontracts);
     writer.Write(nummembers);
 }
Пример #13
0
        private void OnOpenAssembly(object sender, RoutedEventArgs e)
        {
            OpenFileDialog d = new OpenFileDialog();
            d.DefaultExt = "Assembly files (*.dll) | *.dll;";

            if (d.ShowDialog() == true)
            {
                try
                {
                    Assembly asm = Assembly.UnsafeLoadFrom(d.FileName);

                    StringBuilder text = new StringBuilder();
                    ModuleWriter mw = new ModuleWriter();
                    mw.Write(text, asm);

                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.FileName = "Entities.ts";
                    if (sfd.ShowDialog() == true)
                    {
                        string code = text.ToString();

                        using (Stream fs = new FileStream(sfd.FileName, FileMode.Create, FileAccess.Write))
                        {
                            using (TextWriter sw = new StreamWriter(fs))
                            {
                                sw.WriteLine(code);
                            }
                        }
                    }
                }
                catch (ReflectionTypeLoadException ex)
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (Exception exSub in ex.LoaderExceptions)
                    {
                        sb.AppendLine(exSub.Message);
                        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
                        if (exFileNotFound != null)
                        {
                            if (!string.IsNullOrEmpty(exFileNotFound.FusionLog))
                            {
                                sb.AppendLine("Assembly Yüklenemedi:");
                                sb.AppendLine(exFileNotFound.FusionLog);
                            }
                        }
                        sb.AppendLine();
                    }
                    string errorMessage = sb.ToString();
                    MessageBox.Show(errorMessage);
                }
                catch
                {
                    MessageBox.Show("Assembly Okunamadı");
                }
            }
        }
Пример #14
0
        internal static void Main(string[] args)
        {
            WriteStartupHeader();

            if (!IsValidSyntax(args))
            {
                ColoredOutput.WriteInformation($"Usage: {GetExecutingFileName()} <-t (--target) Assembly-CSharp.dll> [options]");
                ColoredOutput.WriteInformation("  Options:");
                ColoredOutput.WriteInformation("    -t [--target]+: Specify the target Distance DLL you want to patch.");
                ColoredOutput.WriteInformation("    -s [--source]+: Specify the source DLL you want to cross-reference.");
                ColoredOutput.WriteInformation("    -p [--patch]+:  Run only patch with the specified name.");
                ErrorHandler.TerminateWithError("Invalid syntax provided.");
            }

            ParseArguments(args);

            if (string.IsNullOrEmpty(_distanceAssemblyFilename))
            {
                ErrorHandler.TerminateWithError("Target DLL name not specified.");
            }
            if ((args.Contains("-p") || args.Contains("--patch")) && string.IsNullOrEmpty(_requestedPatchName))
            {
                ErrorHandler.TerminateWithError("Patch name not specified.");
            }
            if ((args.Contains("-s") || args.Contains("--source")) && string.IsNullOrEmpty(_bootstrapAssemblyFilename))
            {
                ErrorHandler.TerminateWithError("Source DLL name not specified.");
            }

            if (!DistanceFileExists())
            {
                ErrorHandler.TerminateWithError("Specified TARGET DLL not found.");
            }

            if (!BootstrapFileExists() && (args.Contains("-s") || args.Contains("--source")))
            {
                ErrorHandler.TerminateWithError("Specified SOURCE DLL not found.");
            }

            CreateBackup();
            PreparePatches();
            RunPatches();
            ModuleWriter.SavePatchedFile(_distanceAssemblyDefinition, _distanceAssemblyFilename);

            // Run decapsulation after all other configured patches.
            _patcher.AddPatch(new DecapsulationPatch());
            _patcher.RunSpecific("Decapsulation");

            var devDllFileName = $"{Path.GetFileNameWithoutExtension(_distanceAssemblyFilename)}.dev.dll";

            ModuleWriter.SavePatchedFile(_distanceAssemblyDefinition, devDllFileName);
            ColoredOutput.WriteSuccess($"Saved decapsulated development DLL to {devDllFileName}");

            ColoredOutput.WriteSuccess("Patch process completed.");
        }
Пример #15
0
        public void Write(Stream stream, WriterParameters parameters)
        {
            CheckStream(stream);
            if (!stream.CanWrite || !stream.CanSeek)
            {
                throw new ArgumentException();
            }
            Mixin.CheckParameters(parameters);

            ModuleWriter.WriteModuleTo(this, stream, parameters);
        }
Пример #16
0
        private void EncryptSection(ModuleWriter writer)
        {
            Stream stream = writer.DestinationStream;
            var    reader = new BinaryReader(writer.DestinationStream);

            stream.Position = 0x3C;
            stream.Position = reader.ReadUInt32();

            stream.Position += 6;
            ushort sections = reader.ReadUInt16();

            stream.Position += 0xc;
            ushort optSize = reader.ReadUInt16();

            stream.Position += 2 + optSize;

            uint encLoc = 0, encSize = 0;

            for (int i = 0; i < sections; i++)
            {
                uint nameHash = reader.ReadUInt32() * reader.ReadUInt32();
                stream.Position += 8;
                if (nameHash == name1 * name2)
                {
                    encSize = reader.ReadUInt32();
                    encLoc  = reader.ReadUInt32();
                }
                else if (nameHash != 0)
                {
                    uint sectSize = reader.ReadUInt32();
                    uint sectLoc  = reader.ReadUInt32();
                    Hash(stream, reader, sectLoc, sectSize);
                }
                stream.Position += 16;
            }

            uint[] key = DeriveKey();
            encSize       >>= 2;
            stream.Position = encLoc;
            var result = new uint[encSize];

            for (uint i = 0; i < encSize; i++)
            {
                uint data = reader.ReadUInt32();
                result[i]    = data ^ key[i & 0xf];
                key[i & 0xf] = (key[i & 0xf] ^ data) + 0x3dbb2819;
            }
            var byteResult = new byte[encSize << 2];

            Buffer.BlockCopy(result, 0, byteResult, 0, byteResult.Length);
            stream.Position = encLoc;
            stream.Write(byteResult, 0, byteResult.Length);
        }
Пример #17
0
        private void SaveProtectedAssembly() //Saves the protected assembly to disk.
        {
            string file = Path.Combine(Path.GetDirectoryName(MainClass.Settings.AssemblyPath), Path.GetFileNameWithoutExtension(MainClass.Settings.AssemblyPath) + "_protected" + ".dll");

            if (File.Exists(file))
            {
                File.Delete(file);
            }
            ModuleWriter w = new ModuleWriter(MainClass.MainModule, new ModuleWriterOptions(MainClass.MainModule, DummyModuleWriterListener.Instance));

            w.Options.ModuleKind = ModuleKind.Dll;
            w.Options.Logger     = DummyLogger.NoThrowInstance;
            MainClass.MainModule.Write(file, w.Options);
        }
Пример #18
0
        private void btnConvert_Click(object sender, EventArgs e)
        {
            string sourcePath = tbSource.Text;
            string destPath   = AppDomain.CurrentDomain.BaseDirectory + @"\" + tbDestination.Text;

            try
            {
                Assembly asm = Assembly.UnsafeLoadFrom(sourcePath);

                StringBuilder text = new StringBuilder();
                ModuleWriter  mw   = new ModuleWriter();
                mw.Write(text, asm);

                string code = text.ToString();

                using (Stream fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
                {
                    using (TextWriter sw = new StreamWriter(fs))
                    {
                        sw.WriteLine(code);
                    }
                }
                MessageBox.Show("Entity was successfully created in the path : " + destPath);
            }
            catch (ReflectionTypeLoadException ex)
            {
                StringBuilder sb = new StringBuilder();
                foreach (Exception exSub in ex.LoaderExceptions)
                {
                    sb.AppendLine(exSub.Message);
                    FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
                    if (exFileNotFound != null)
                    {
                        if (!string.IsNullOrEmpty(exFileNotFound.FusionLog))
                        {
                            sb.AppendLine("Assembly cannot be loaded:");
                            sb.AppendLine(exFileNotFound.FusionLog);
                        }
                    }
                    sb.AppendLine();
                }
                string errorMessage = sb.ToString();
                Console.WriteLine(errorMessage);
            }
            catch
            {
                Console.WriteLine("Assembly can not be read!");
            }
        }
Пример #19
0
        //Here we replace the AssemblyRef entry for TrinitySeal with Unitas.Runtime
        //With this, we not only hijack all library calls
        //But we also bypass the hash check
        static void ProcessAssembly(string vars)
        {
            Console.WriteLine("Processing assembly...");
            var opts = new ModuleWriterOptions(_mod)
            {
                Logger = DummyLogger.NoThrowInstance
            };
            var writer = new ModuleWriter(_mod, opts);

            foreach (var asmref in _mod.GetAssemblyRefs())
            {
                if (asmref.Name != "TrinitySeal")
                {
                    continue;
                }

                Console.WriteLine("Replacing reference");
                asmref.Name = "Unitas.Runtime";
            }

            Console.WriteLine("Fixing namespaces...");
            foreach (var typeref in _mod.GetTypeRefs())
            {
                if (typeref.Namespace == "TrinitySeal" && typeref.DefinitionAssembly.Name == "Unitas.Runtime")
                {
                    typeref.Namespace = "Unitas.Runtime";
                }
            }

            //Preserve EVERYTHING
            opts.MetadataOptions.PreserveHeapOrder(_mod, true);
            opts.MetadataOptions.Flags |= MetadataFlags.PreserveRids | MetadataFlags.KeepOldMaxStack;

            var runtime = Path.Combine(Path.GetDirectoryName(_mod.Location), "Unitas.Runtime.dll");

            File.Copy(typeof(Seal).Assembly.Location, runtime, true);
            if (vars != null)
            {
                AddServerVariables(vars, runtime);
            }

            writer.Write(GetNewName());
            Console.WriteLine($"Bypassed assembly saved at: {GetNewName()}");
        }
Пример #20
0
        private int AddFile(ModuleBuilder manifestModule, string fileName, int flags)
        {
            SHA1Managed hash     = new SHA1Managed();
            string      fullPath = fileName;

            if (dir != null)
            {
                fullPath = Path.Combine(dir, fileName);
            }
            using (FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
            {
                using (CryptoStream cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write))
                {
                    byte[] buf = new byte[8192];
                    ModuleWriter.HashChunk(fs, cs, buf, (int)fs.Length);
                }
            }
            return(manifestModule.__AddModule(flags, Path.GetFileName(fileName), hash.Hash));
        }
Пример #21
0
        public override void Write(ModuleWriter writer)
        {
            // Create the member header.
            MemberHeader mheader = new MemberHeader();

            mheader.memberFlags      = (uint)GetFlags();
            mheader.memberName       = 0;
            mheader.memberAttributes = 0;

            ChelaModule module = GetModule();

            if (factory != null)
            {
                // This is a member instance.
                mheader.memberType = (byte)MemberHeaderType.MemberInstance;
                mheader.memberSize = (uint)8;

                // Write the member header.
                mheader.Write(writer);

                // Write the template.
                writer.Write(module.RegisterMember(template));

                // Write the factory id.
                writer.Write(module.RegisterMember(factory));
            }
            else
            {
                // This is a function instance
                mheader.memberType = (byte)MemberHeaderType.FunctionInstance;
                mheader.memberSize = (uint)(4 + genericInstance.GetSize());

                // Write the member header.
                mheader.Write(writer);

                // Write the template id.
                writer.Write(module.RegisterMember(template));

                // Write the template parameters.
                genericInstance.Write(writer, GetModule());
            }
        }
Пример #22
0
        public override void Write(ModuleWriter writer)
        {
            // Create the member header.
            MemberHeader mheader = new MemberHeader();
            mheader.memberType = (byte) MemberHeaderType.MemberInstance;
            mheader.memberFlags = (uint) GetFlags();
            mheader.memberName = 0;
            mheader.memberSize = 8;
            mheader.memberAttributes = 0;

            // Write the header.
            mheader.Write(writer);

            // Write the template.
            ChelaModule module = GetModule();
            writer.Write(module.RegisterMember(template));

            // Write the factory.
            writer.Write(module.RegisterMember(factory));
        }
Пример #23
0
        public override void Write(ModuleWriter writer)
        {
            // Create the member header.
            MemberHeader mheader = new MemberHeader();
            mheader.memberFlags = (uint) GetFlags();
            mheader.memberName = 0;
            mheader.memberAttributes = 0;

            ChelaModule module = GetModule();
            if(factory != null)
            {
                // This is a member instance.
                mheader.memberType = (byte)MemberHeaderType.MemberInstance;
                mheader.memberSize = (uint)8;

                // Write the member header.
                mheader.Write(writer);

                // Write the template.
                writer.Write(module.RegisterMember(template));

                // Write the factory id.
                writer.Write(module.RegisterMember(factory));
            }
            else
            {
                // This is a function instance
                mheader.memberType = (byte)MemberHeaderType.FunctionInstance;
                mheader.memberSize = (uint)(4 + genericInstance.GetSize());

                // Write the member header.
                mheader.Write(writer);

                // Write the template id.
                writer.Write(module.RegisterMember(template));

                // Write the template parameters.
                genericInstance.Write(writer, GetModule());
            }
        }
Пример #24
0
        public override void Write(ModuleWriter writer)
        {
            // Create the member header.
            MemberHeader mheader = new MemberHeader();

            mheader.memberType       = (byte)MemberHeaderType.MemberInstance;
            mheader.memberFlags      = (uint)GetFlags();
            mheader.memberName       = 0;
            mheader.memberSize       = 8;
            mheader.memberAttributes = 0;

            // Write the header.
            mheader.Write(writer);

            // Write the template.
            ChelaModule module = GetModule();

            writer.Write(module.RegisterMember(template));

            // Write the factory.
            writer.Write(module.RegisterMember(factory));
        }
Пример #25
0
        public void WriteOutput(string outputFile)
        {
            // Set the module filename data used by debugging.
            ChelaModule module = moduleNode.GetModule();

            module.SetFileName(outputFile);
            module.SetWorkDirectory(System.Environment.CurrentDirectory);

            // Create the output file.
            FileStream output = new FileStream(outputFile, FileMode.Create);

            // Write the module.
            ModuleWriter writer = new ModuleWriter(output);

            Benchmark.Begin();
            module.Write(writer);

            // Close the output file.
            output.Flush();
            output.Close();
            Benchmark.End("Write module");
        }
Пример #26
0
        private int AddFile(ModuleBuilder manifestModule, string fileName, int flags)
        {
            SHA1Managed hash     = new SHA1Managed();
            string      fullPath = fileName;

            if (dir != null)
            {
                fullPath = Path.Combine(dir, fileName);
            }
            using (FileStream fs = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
            {
                using (CryptoStream cs = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write))
                {
                    byte[] buf = new byte[8192];
                    ModuleWriter.HashChunk(fs, cs, buf, (int)fs.Length);
                }
            }
            FileTable.Record file = new FileTable.Record();
            file.Flags     = flags;
            file.Name      = manifestModule.Strings.Add(fileName);
            file.HashValue = manifestModule.Blobs.Add(ByteBuffer.Wrap(hash.Hash));
            return(0x26000000 + manifestModule.File.AddRecord(file));
        }
Пример #27
0
        private void SaveImpl(string assemblyFileName, Stream streamOrNull, PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
        {
            ModuleBuilder manifestModule = null;

            foreach (ModuleBuilder moduleBuilder in modules)
            {
                moduleBuilder.SetIsSaved();
                moduleBuilder.PopulatePropertyAndEventTables();

                if (manifestModule == null &&
                    string.Compare(moduleBuilder.fileName, assemblyFileName, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    manifestModule = moduleBuilder;
                }
            }

            if (manifestModule == null)
            {
                manifestModule = DefineDynamicModule("RefEmit_OnDiskManifestModule", assemblyFileName, false);
            }

            AssemblyTable.Record assemblyRecord = new AssemblyTable.Record();
            assemblyRecord.HashAlgId      = (int)hashAlgorithm;
            assemblyRecord.Name           = manifestModule.Strings.Add(name);
            assemblyRecord.MajorVersion   = majorVersion;
            assemblyRecord.MinorVersion   = minorVersion;
            assemblyRecord.BuildNumber    = buildVersion;
            assemblyRecord.RevisionNumber = revisionVersion;
            if (publicKey != null)
            {
                assemblyRecord.PublicKey = manifestModule.Blobs.Add(ByteBuffer.Wrap(publicKey));
                assemblyRecord.Flags     = (int)(flags | AssemblyNameFlags.PublicKey);
            }
            else
            {
                assemblyRecord.Flags = (int)(flags & ~AssemblyNameFlags.PublicKey);
            }
            if (culture != null)
            {
                assemblyRecord.Culture = manifestModule.Strings.Add(culture);
            }
            manifestModule.AssemblyTable.AddRecord(assemblyRecord);

            ResourceSection unmanagedResources = versionInfo != null || win32icon != null || win32manifest != null || win32resources != null
                                ? new ResourceSection()
                                : null;

            if (versionInfo != null)
            {
                versionInfo.SetName(GetName());
                versionInfo.SetFileName(assemblyFileName);
                foreach (CustomAttributeBuilder cab in customAttributes)
                {
                    // .NET doesn't support copying blob custom attributes into the version info
                    if (!cab.HasBlob || universe.DecodeVersionInfoAttributeBlobs)
                    {
                        versionInfo.SetAttribute(this, cab);
                    }
                }
                ByteBuffer versionInfoData = new ByteBuffer(512);
                versionInfo.Write(versionInfoData);
                unmanagedResources.AddVersionInfo(versionInfoData);
            }

            if (win32icon != null)
            {
                unmanagedResources.AddIcon(win32icon);
            }

            if (win32manifest != null)
            {
                unmanagedResources.AddManifest(win32manifest, fileKind == PEFileKinds.Dll ? (ushort)2 : (ushort)1);
            }

            if (win32resources != null)
            {
                unmanagedResources.ExtractResources(win32resources);
            }

            foreach (CustomAttributeBuilder cab in customAttributes)
            {
                // we intentionally don't filter out the version info (pseudo) custom attributes (to be compatible with .NET)
                manifestModule.SetCustomAttribute(0x20000001, cab);
            }

            manifestModule.AddDeclarativeSecurity(0x20000001, declarativeSecurity);

            foreach (TypeForwarder fwd in typeForwarders)
            {
                manifestModule.AddTypeForwarder(fwd.Type, fwd.IncludeNested);
            }

            foreach (ResourceFile resfile in resourceFiles)
            {
#if !CORECLR
                if (resfile.Writer != null)
                {
                    resfile.Writer.Generate();
                    resfile.Writer.Close();
                }
#endif
                int fileToken = AddFile(manifestModule, resfile.FileName, 1 /*ContainsNoMetaData*/);
                ManifestResourceTable.Record rec = new ManifestResourceTable.Record();
                rec.Offset         = 0;
                rec.Flags          = (int)resfile.Attributes;
                rec.Name           = manifestModule.Strings.Add(resfile.Name);
                rec.Implementation = fileToken;
                manifestModule.ManifestResource.AddRecord(rec);
            }

            int entryPointToken = 0;

            foreach (ModuleBuilder moduleBuilder in modules)
            {
                moduleBuilder.FillAssemblyRefTable();
                moduleBuilder.EmitResources();
                if (moduleBuilder != manifestModule)
                {
                    int fileToken;
                    if (entryPoint != null && entryPoint.Module == moduleBuilder)
                    {
                        ModuleWriter.WriteModule(null, null, moduleBuilder, fileKind, portableExecutableKind, imageFileMachine, moduleBuilder.unmanagedResources, entryPoint.MetadataToken);
                        entryPointToken = fileToken = AddFile(manifestModule, moduleBuilder.fileName, 0 /*ContainsMetaData*/);
                    }
                    else
                    {
                        ModuleWriter.WriteModule(null, null, moduleBuilder, fileKind, portableExecutableKind, imageFileMachine, moduleBuilder.unmanagedResources, 0);
                        fileToken = AddFile(manifestModule, moduleBuilder.fileName, 0 /*ContainsMetaData*/);
                    }
                    moduleBuilder.ExportTypes(fileToken, manifestModule);
                }
                moduleBuilder.CloseResources();
            }

            foreach (Module module in addedModules)
            {
                int fileToken = AddFile(manifestModule, module.FullyQualifiedName, 0 /*ContainsMetaData*/);
                module.ExportTypes(fileToken, manifestModule);
            }

            if (entryPointToken == 0 && entryPoint != null)
            {
                entryPointToken = entryPoint.MetadataToken;
            }

            // finally, write the manifest module
            ModuleWriter.WriteModule(keyPair, publicKey, manifestModule, fileKind, portableExecutableKind, imageFileMachine, unmanagedResources ?? manifestModule.unmanagedResources, entryPointToken, streamOrNull);
        }
Пример #28
0
    public void Execute()
    {
        try
        {

            var referenceFinder = new AssemblyReferenceFinder(this, Logger);
            referenceFinder.Execute();
            var assemblyResolver = new AssemblyResolver(referenceFinder);
            var reader = new ModuleReader
                             {
                                 AssemblyResolver = assemblyResolver,
                                 InnerWeaver = this,
                                 Logger = Logger
                             };
            reader.Execute();

            var weaverInitialiser = new WeaverInitialiser
                                        {
                                            ModuleDefinition = reader.ModuleDefinition,
                                            AssemblyResolver = assemblyResolver,
                                            InnerWeaver = this,
                                            Logger = Logger
                                        };
            weaverInitialiser.Execute();

            var weaverRunner = new ModuleWeaverRunner
                                   {
                                       Logger = Logger,
                                   };
            Logger.LogInfo("");
            foreach (var weaverInstance in weaverInitialiser.WeaverInstances)
            {
                var weaverName = ObjectTypeName.GetAssemblyName(weaverInstance);
                Logger.SetCurrentWeaverName(weaverName);
                try
                {
                    weaverRunner.Execute(weaverInstance);
                }
                catch (Exception exception)
                {
                    Logger.LogError(exception.ToFriendlyString());
                    return;
                }
                finally
                {
                    Logger.ClearWeaverName();
                }
            }

            var keyFinder = new StrongNameKeyFinder
                {
                    InnerWeaver = this,
                    Logger = Logger,
                    ModuleDefinition = reader.ModuleDefinition
                };
            keyFinder.Execute();
            var moduleWriter = new ModuleWriter
                                   {
                                       InnerWeaver = this,
                                       Logger = Logger,
                                       ModuleDefinition = reader.ModuleDefinition,
                                       StrongNameKeyFinder = keyFinder,
                                   };
            moduleWriter.Execute();

        }
        catch (Exception exception)
        {
            Logger.LogError(exception.ToFriendlyString());
        }
    }
Пример #29
0
 public void Write(ModuleWriter writer, ChelaModule module)
 {
     writer.Write(module.RegisterString(name));
 }
Пример #30
0
 /// <inheritdoc />
 public override void AddModule(ModuleWriter moduleWriter)
 {
     m_importedModules.Add(DScriptWriterUtils.ToRelativePath(moduleWriter.AbsolutePath, AbsolutePath));
 }
Пример #31
0
 public override void Write(ModuleWriter writer)
 {
     writer.Write((uint)GetModule().RegisterType(GetVariableType()));
     writer.Write((uint)0); // Local flags.
 }
Пример #32
0
        /// <summary>
        /// Writes the module to a stream.
        /// </summary>
        /// <param name="dest">Destination stream</param>
        /// <param name="options">Writer options</param>
        public void Write(Stream dest, ModuleWriterOptions options)
        {
            var writer = new ModuleWriter(this, options ?? new ModuleWriterOptions(this));

            writer.Write(dest);
        }
Пример #33
0
        public void Save(string assemblyFileName, PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
        {
            ModuleBuilder manifestModule = null;

            foreach (ModuleBuilder moduleBuilder in modules)
            {
                if (string.Compare(moduleBuilder.fileName, assemblyFileName, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    manifestModule = moduleBuilder;
                    break;
                }
            }

            if (manifestModule == null)
            {
                manifestModule = DefineDynamicModule("RefEmit_OnDiskManifestModule", assemblyFileName, false);
            }

            if (hashAlgorithm != AssemblyHashAlgorithm.SHA1)
            {
                throw new NotImplementedException();
            }
            AssemblyTable.Record assemblyRecord = new AssemblyTable.Record();
            assemblyRecord.HashAlgId      = (int)hashAlgorithm;
            assemblyRecord.Name           = manifestModule.Strings.Add(name);
            assemblyRecord.MajorVersion   = majorVersion;
            assemblyRecord.MinorVersion   = minorVersion;
            assemblyRecord.BuildNumber    = buildVersion;
            assemblyRecord.RevisionNumber = revisionVersion;
            if (publicKey != null)
            {
                assemblyRecord.PublicKey = manifestModule.Blobs.Add(ByteBuffer.Wrap(publicKey));
                assemblyRecord.Flags     = (int)(flags | AssemblyNameFlags.PublicKey);
            }
            else
            {
                assemblyRecord.Flags = (int)(flags & ~AssemblyNameFlags.PublicKey);
            }
            if (culture != null)
            {
                assemblyRecord.Culture = manifestModule.Strings.Add(culture);
            }
            int token = 0x20000000 + manifestModule.AssemblyTable.AddRecord(assemblyRecord);

#pragma warning disable 618
            // this values are obsolete, but we already know that so we disable the warning
            System.Security.Permissions.SecurityAction requestMinimum  = System.Security.Permissions.SecurityAction.RequestMinimum;
            System.Security.Permissions.SecurityAction requestOptional = System.Security.Permissions.SecurityAction.RequestOptional;
            System.Security.Permissions.SecurityAction requestRefuse   = System.Security.Permissions.SecurityAction.RequestRefuse;
#pragma warning restore 618
            if (requiredPermissions != null)
            {
                manifestModule.AddDeclarativeSecurity(token, requestMinimum, requiredPermissions);
            }
            if (optionalPermissions != null)
            {
                manifestModule.AddDeclarativeSecurity(token, requestOptional, optionalPermissions);
            }
            if (refusedPermissions != null)
            {
                manifestModule.AddDeclarativeSecurity(token, requestRefuse, refusedPermissions);
            }

            ByteBuffer versionInfoData = null;
            if (versionInfo != null)
            {
                versionInfo.SetName(GetName());
                versionInfo.SetFileName(assemblyFileName);
                foreach (CustomAttributeBuilder cab in customAttributes)
                {
                    // .NET doesn't support copying blob custom attributes into the version info
                    if (!cab.HasBlob)
                    {
                        versionInfo.SetAttribute(cab);
                    }
                }
                versionInfoData = new ByteBuffer(512);
                versionInfo.Write(versionInfoData);
            }

            foreach (CustomAttributeBuilder cab in customAttributes)
            {
                // we intentionally don't filter out the version info (pseudo) custom attributes (to be compatible with .NET)
                manifestModule.SetCustomAttribute(0x20000001, cab);
            }

            manifestModule.AddDeclarativeSecurity(0x20000001, declarativeSecurity);

            foreach (Type type in typeForwarders)
            {
                manifestModule.AddTypeForwarder(type);
            }

            foreach (ResourceFile resfile in resourceFiles)
            {
                int fileToken = AddFile(manifestModule, resfile.FileName, 1 /*ContainsNoMetaData*/);
                ManifestResourceTable.Record rec = new ManifestResourceTable.Record();
                rec.Offset         = 0;
                rec.Flags          = (int)resfile.Attributes;
                rec.Name           = manifestModule.Strings.Add(resfile.Name);
                rec.Implementation = fileToken;
                manifestModule.ManifestResource.AddRecord(rec);
            }

            int entryPointToken = 0;

            foreach (ModuleBuilder moduleBuilder in modules)
            {
                moduleBuilder.FillAssemblyRefTable();
                if (moduleBuilder != manifestModule)
                {
                    int fileToken;
                    if (entryPoint != null && entryPoint.Module == moduleBuilder)
                    {
                        ModuleWriter.WriteModule(null, null, moduleBuilder, fileKind, portableExecutableKind, imageFileMachine, null, moduleBuilder.unmanagedResources, entryPoint.MetadataToken);
                        entryPointToken = fileToken = AddFile(manifestModule, moduleBuilder.fileName, 0 /*ContainsMetaData*/);
                    }
                    else
                    {
                        ModuleWriter.WriteModule(null, null, moduleBuilder, fileKind, portableExecutableKind, imageFileMachine, null, moduleBuilder.unmanagedResources, 0);
                        fileToken = AddFile(manifestModule, moduleBuilder.fileName, 0 /*ContainsMetaData*/);
                    }
                    moduleBuilder.ExportTypes(fileToken, manifestModule);
                }
            }

            if (entryPointToken == 0 && entryPoint != null)
            {
                entryPointToken = entryPoint.MetadataToken;
            }

            // finally, write the manifest module
            ModuleWriter.WriteModule(keyPair, publicKey, manifestModule, fileKind, portableExecutableKind, imageFileMachine, versionInfoData, unmanagedResources ?? manifestModule.unmanagedResources, entryPointToken);
        }
Пример #34
0
    public void Execute()
    {
        try
        {
            var referenceFinder = new AssemblyReferenceFinder(this, Logger);
            referenceFinder.Execute();
            var assemblyResolver = new AssemblyResolver(referenceFinder);
            var reader           = new ModuleReader
            {
                AssemblyResolver = assemblyResolver,
                InnerWeaver      = this,
                Logger           = Logger
            };
            reader.Execute();

            var weaverInitialiser = new WeaverInitialiser
            {
                ModuleDefinition = reader.ModuleDefinition,
                AssemblyResolver = assemblyResolver,
                InnerWeaver      = this,
                Logger           = Logger
            };
            weaverInitialiser.Execute();

            var weaverRunner = new ModuleWeaverRunner
            {
                Logger = Logger,
            };
            Logger.LogInfo("");
            foreach (var weaverInstance in weaverInitialiser.WeaverInstances)
            {
                var weaverName = ObjectTypeName.GetAssemblyName(weaverInstance);
                Logger.SetCurrentWeaverName(weaverName);
                try
                {
                    weaverRunner.Execute(weaverInstance);
                }
                catch (Exception exception)
                {
                    Logger.LogError(exception.ToFriendlyString());
                    return;
                }
                finally
                {
                    Logger.ClearWeaverName();
                }
            }

            var keyFinder = new StrongNameKeyFinder
            {
                InnerWeaver      = this,
                Logger           = Logger,
                ModuleDefinition = reader.ModuleDefinition
            };
            keyFinder.Execute();
            var moduleWriter = new ModuleWriter
            {
                InnerWeaver         = this,
                Logger              = Logger,
                ModuleDefinition    = reader.ModuleDefinition,
                StrongNameKeyFinder = keyFinder,
            };
            moduleWriter.Execute();
        }
        catch (Exception exception)
        {
            Logger.LogError(exception.ToFriendlyString());
        }
    }
Пример #35
0
        private static void ReplaceMSCOREEReferenceWithIJWHostForNetCoreApp(ModuleDefMD module, ModuleWriter moduleWriter)
        {
            module.Assembly.TryGetOriginalTargetFrameworkAttribute(out var framework, out var version, out var profile);

            if (framework == ".NETCoreApp")
            {
                moduleWriter.Options.WriterEvent += OnWriterEvent;
            }
        }
Пример #36
0
 public override void Write(ModuleWriter writer)
 {
     throw new ModuleException("Cannot write function group instance " + GetFullName());
 }
Пример #37
0
        internal static void Main(string[] args)
        {
            WriteStartupHeader();

            if (!IsValidSyntax(args))
            {
                ColoredOutput.WriteInformation($"Usage: {GetExecutingFileName()} <(-t | --target) target_assembly.dll> [options]");
                ColoredOutput.WriteInformation("  Options:");
                ColoredOutput.WriteInformation("    -t [--target]+: Specify the target assembly you want to patch.");
                ColoredOutput.WriteInformation("    -s [--source]+: Specify the source DLL you want to source the init code from.");
                ColoredOutput.WriteInformation("    -p [--patch]+:  Run only the patch with the specified name.");
                ColoredOutput.WriteInformation("    -h [--hash]: Generate a .md5 file of the patched assembly.");
                ColoredOutput.WriteInformation("    -d [--decap-only]: Only decapsulate the target DLL. Invalidates -s -p and -h.");

                ErrorHandler.TerminateWithError("Invalid syntax provided.", TerminationReason.InvalidSyntax);
            }

            ParseArguments(args);

            if (string.IsNullOrEmpty(_gameAssemblyFilename))
            {
                ErrorHandler.TerminateWithError("Target DLL name not specified.", TerminationReason.TargetDllNotProvided);
            }
            if ((args.Contains("-p") || args.Contains("--patch")) && string.IsNullOrEmpty(_requestedPatchName))
            {
                ErrorHandler.TerminateWithError("Patch name not specified.", TerminationReason.PatchNameNotProvided);
            }
            if ((args.Contains("-s") || args.Contains("--source")) && string.IsNullOrEmpty(_bootstrapAssemblyFilename))
            {
                ErrorHandler.TerminateWithError("Source DLL name not specified.", TerminationReason.SourceDllNotProvided);
            }

            if (!BootstrapFileExists() && (args.Contains("-s") || args.Contains("--source")))
            {
                ErrorHandler.TerminateWithError("Specified SOURCE DLL not found.", TerminationReason.SourceDllNonexistant);
            }

            if (!GameFileExists())
            {
                ErrorHandler.TerminateWithError("Specified TARGET DLL not found.", TerminationReason.TargetDllNonexistant);
            }

            PreparePatches();

            if (!_decapOnly)
            {
                CreateBackup();
                RunPatches();

                ModuleWriter.SavePatchedFile(_gameAssemblyDefinition, _gameAssemblyFilename, false);

                if (_generateHashFile)
                {
                    GenerateHashFile();
                }
            }
            else
            {
                ColoredOutput.WriteInformation("Attention! Decap-only run requested.");
            }

            _patcher.AddPatch(new DecapsulationPatch());
            _patcher.RunSpecific("Decapsulation");

            var devDllFileName = $"{Path.GetFileNameWithoutExtension(_gameAssemblyFilename)}.dev.dll";

            ModuleWriter.SavePatchedFile(_gameAssemblyDefinition, devDllFileName, true);
            ColoredOutput.WriteSuccess($"Saved decapsulated development DLL to {devDllFileName}");

            ColoredOutput.WriteSuccess("Patch process completed.");
        }
Пример #38
0
 public override void Write(ModuleWriter writer)
 {
     throw new ModuleException("Cannot write property instance " + GetFullName());
 }
Пример #39
0
 public override void Write(ModuleWriter writer)
 {
     throw new ModuleException("Cannot write property instance " + GetFullName());
 }
Пример #40
0
        /// <summary>
        /// Writes the module to a file on disk. If the file exists, it will be truncated.
        /// </summary>
        /// <param name="filename">Filename</param>
        /// <param name="options">Writer options</param>
        public void Write(string filename, ModuleWriterOptions options)
        {
            var writer = new ModuleWriter(this, options ?? new ModuleWriterOptions(this));

            writer.Write(filename);
        }
Пример #41
0
        public override void Write(ModuleWriter writer)
        {
            // Compute the field size.
            int fieldSize = 8;
            if(initializer != null)
                fieldSize += initializer.GetQualifiedSize();

            // Write the header.
            MemberHeader header = new MemberHeader();
            header.memberType = (byte) MemberHeaderType.Field;
            header.memberName = GetModule().RegisterString(GetName());
            header.memberFlags = (uint) GetFlags();
            header.memberSize = (uint)fieldSize;
            header.memberAttributes = GetAttributeCount();
            header.Write(writer);

            // Write the attributes.
            WriteAttributes(writer);

            // Write the type and the slot.
            writer.Write((uint)GetModule().RegisterType(GetVariableType()));
            writer.Write((int)slot);

            // Write the initializer.
            if(initializer != null)
                initializer.WriteQualified(GetModule(), writer);
        }
Пример #42
0
 public override void Write(ModuleWriter writer)
 {
     writer.Write((uint)GetModule().RegisterType(GetVariableType()));
     writer.Write((uint)0);             // Local flags.
 }
Пример #43
0
        public override void Write(ModuleWriter writer)
        {
            // Write the header.
            MemberHeader header = new MemberHeader();
            header.memberType = (byte) MemberHeaderType.Event;
            header.memberName = GetModule().RegisterString(GetName());
            header.memberFlags = (uint) GetFlags();
            header.memberSize = 12;
            header.Write(writer);

            // Write the type and accessors..
            writer.Write((uint)GetModule().RegisterType(GetVariableType()));
            if(addModifier != null)
                writer.Write((uint)addModifier.GetSerialId());
            else
                writer.Write((uint)0);

            if(removeModifier != null)
                writer.Write((uint)removeModifier.GetSerialId());
            else
                writer.Write((uint)0);
        }