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