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); }
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); }
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)); }
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); } }
public virtual void Write(ModuleWriter writer) { writer.Write(memberType); writer.Write(memberName); writer.Write(memberFlags); writer.Write(memberSize); writer.Write(memberAttributes); }
public void Write(Stream stream, WriterParameters parameters) { Mixin.CheckStream(stream); Mixin.CheckWriteSeek(stream); Mixin.CheckParameters(parameters); ModuleWriter.WriteModule(this, Disposable.NotOwned(stream), parameters); }
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); }
public void Write(ModuleWriter writer) { writer.Write(functionType); writer.Write(numargs); writer.Write(numlocals); writer.Write(numblocks); writer.Write(numexceptions); writer.Write(vslot); }
public void Write(ModuleWriter writer) { writer.Write(baseStructure); writer.Write(numinterfaces); writer.Write(numfields); writer.Write(numvmethods); writer.Write(numcontracts); writer.Write(nummembers); }
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ı"); } } }
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."); }
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); }
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); }
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); }
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!"); } }
//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()}"); }
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)); }
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()); } }
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)); }
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()); } }
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)); }
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"); }
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)); }
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); }
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()); } }
public void Write(ModuleWriter writer, ChelaModule module) { writer.Write(module.RegisterString(name)); }
/// <inheritdoc /> public override void AddModule(ModuleWriter moduleWriter) { m_importedModules.Add(DScriptWriterUtils.ToRelativePath(moduleWriter.AbsolutePath, AbsolutePath)); }
public override void Write(ModuleWriter writer) { writer.Write((uint)GetModule().RegisterType(GetVariableType())); writer.Write((uint)0); // Local flags. }
/// <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); }
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); }
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; } }
public override void Write(ModuleWriter writer) { throw new ModuleException("Cannot write function group instance " + GetFullName()); }
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."); }
public override void Write(ModuleWriter writer) { throw new ModuleException("Cannot write property instance " + GetFullName()); }
/// <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); }
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); }
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); }