public static void Erase(NativeModuleWriter writer, ModuleDefMD module)
        {
            if (writer == null || module == null)
            {
                return;
            }

            var sections = new List <Tuple <uint, uint, byte[]> >();
            var s        = new MemoryStream();

            foreach (var origSect in writer.OrigSections)
            {
                var oldChunk = origSect.Chunk;
                var sectHdr  = origSect.PESection;

                s.SetLength(0);
                oldChunk.WriteTo(new DataWriter(s));
                var buf      = s.ToArray();
                var newChunk = new DataReaderChunk(oldChunk.CreateReader());
                newChunk.SetOffset(oldChunk.FileOffset, oldChunk.RVA);

                origSect.Chunk = newChunk;

                sections.Add(Tuple.Create(
                                 sectHdr.PointerToRawData,
                                 sectHdr.PointerToRawData + sectHdr.SizeOfRawData,
                                 buf));
            }

            var md = module.Metadata;

            var row = md.TablesStream.MethodTable.Rows;

            for (uint i = 1; i <= row; i++)
            {
                if (md.TablesStream.TryReadMethodRow(i, out var method))
                {
                    var codeType = ((MethodImplAttributes)method.ImplFlags & MethodImplAttributes.CodeTypeMask);
                    if (codeType == MethodImplAttributes.IL)
                    {
                        Erase(sections, (uint)md.PEImage.ToFileOffset((RVA)method.RVA));
                    }
                }
            }

            var res = md.ImageCor20Header.Resources;

            if (res.Size > 0)
            {
                Erase(sections, (uint)res.StartOffset, res.Size);
            }

            Erase(sections, md.ImageCor20Header);
            Erase(sections, md.MetadataHeader);
            foreach (var stream in md.AllStreams)
            {
                Erase(sections, stream);
            }
        }
Beispiel #2
0
        public static void Erase(NativeModuleWriter writer, ModuleDefMD module)
        {
            if (writer == null || module == null)
            {
                return;
            }

            var sects    = (IList)origSects.GetValue(writer);
            var sections = new List <Tuple <uint, uint, byte[]> >();
            var s        = new MemoryStream();

            foreach (var origSect in sects)
            {
                var oldChunk = (BinaryReaderChunk)chunk.GetValue(origSect);
                var sectHdr  = (ImageSectionHeader)peSection.GetValue(origSect);

                s.SetLength(0);
                oldChunk.WriteTo(new BinaryWriter(s));
                var buf      = s.ToArray();
                var newChunk = new BinaryReaderChunk(MemoryImageStream.Create(buf), oldChunk.GetVirtualSize());
                newChunk.SetOffset(oldChunk.FileOffset, oldChunk.RVA);

                chunk.SetValue(origSect, newChunk);

                sections.Add(Tuple.Create(
                                 sectHdr.PointerToRawData,
                                 sectHdr.PointerToRawData + sectHdr.SizeOfRawData,
                                 buf));
            }

            var md = module.MetaData;

            var row = md.TablesStream.MethodTable.Rows;

            for (uint i = 1; i <= row; i++)
            {
                var method   = md.TablesStream.ReadMethodRow(i);
                var codeType = ((MethodImplAttributes)method.ImplFlags & MethodImplAttributes.CodeTypeMask);
                if (codeType == MethodImplAttributes.IL)
                {
                    Erase(sections, (uint)md.PEImage.ToFileOffset((RVA)method.RVA));
                }
            }

            var res = md.ImageCor20Header.Resources;

            if (res.Size > 0)
            {
                Erase(sections, (uint)res.StartOffset, res.Size);
            }

            Erase(sections, md.ImageCor20Header);
            Erase(sections, md.MetaDataHeader);
            foreach (var stream in md.AllStreams)
            {
                Erase(sections, stream);
            }
        }
Beispiel #3
0
        public static void Erase(NativeModuleWriter writer, ModuleDefMD module)
        {
            if (writer == null || module == null)
            {
                return;
            }
            List <Tuple <uint, uint, byte[]> > sections = new List <Tuple <uint, uint, byte[]> >();
            MemoryStream s = new MemoryStream();

            foreach (NativeModuleWriter.OrigSection origSect in writer.OrigSections)
            {
                var oldChunk = origSect.Chunk;
                ImageSectionHeader sectHdr = origSect.PESection;
                s.SetLength(0L);
                oldChunk.WriteTo(new BinaryWriter(s));
                byte[] buf      = s.ToArray();
                var    newChunk = new BinaryReaderChunk(MemoryImageStream.Create(buf), oldChunk.GetVirtualSize());
                newChunk.SetOffset(oldChunk.FileOffset, oldChunk.RVA);
                origSect.Chunk = newChunk;
                sections.Add(Tuple.Create <uint, uint, byte[]>(sectHdr.PointerToRawData, sectHdr.PointerToRawData + sectHdr.SizeOfRawData, buf));
            }

            var  md  = module.MetaData;
            uint row = md.TablesStream.MethodTable.Rows;

            for (uint i = 1u; i <= row; i += 1u)
            {
                RawMethodRow method = md.TablesStream.ReadMethodRow(i);

                if ((method.ImplFlags & 3) == 0)
                {
                    Erase(sections, (uint)md.PEImage.ToFileOffset((RVA)method.RVA));
                }
            }
            ImageDataDirectory res = md.ImageCor20Header.Resources;

            if (res.Size > 0u)
            {
                Erase(sections, (uint)res.StartOffset, res.Size);
            }
            Erase(sections, md.ImageCor20Header);
            Erase(sections, md.MetaDataHeader);// md.MetadataHeader);
            foreach (DotNetStream stream in md.AllStreams)
            {
                Erase(sections, stream);
            }
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("TrinitySealPatcher.exe <infile>");
                return;
            }

            var runtimepath = Path.GetDirectoryName(typeof(Program).Assembly.Location) + "\\TrinitySeal.dll";
            var runtime     = ModuleDefMD.Load(runtimepath);
            var target      = ModuleDefMD.Load(args[0]);

            var folder = Path.GetDirectoryName(args[0]);

            var ctor = target.GlobalType.FindOrCreateStaticConstructor();

            ctor.Body.Instructions.Insert(0, OpCodes.Call.ToInstruction(new Importer(target).Import(runtime.Find("TrinitySeal.HashPatch", false).FindMethod("ApplyHook"))));

            var writer = new NativeModuleWriter(target, new NativeModuleWriterOptions(target, true));

            writer.Options.MetadataOptions.Flags |= MetadataFlags.PreserveAll | MetadataFlags.KeepOldMaxStack;

            writer.Options.MetadataOptions.PreserveHeapOrder(target, true);

            writer.Write(Path.Combine(folder, $"{Path.GetFileNameWithoutExtension(args[0])}-patched{Path.GetExtension(args[0])}"));

            var trintyDll    = Path.Combine(folder, "TrinitySeal.dll");
            var trintyDllBak = Path.Combine(folder, "TrinitySeal.dll.bak");

            if (File.Exists(trintyDll))
            {
                if (File.Exists(trintyDllBak))
                {
                    File.Delete(trintyDllBak);
                }

                File.Move(trintyDll, trintyDllBak);
            }

            File.Copy(runtimepath, trintyDll);
        }