public void Init() { html = new Element("html"); head = new Element("head"); html.appendChild(head); document = new Document(html); metadataCreator = new MetadataCreator(); }
public void Init() { html = new XElement("html"); head = new XElement("head"); html.Add(head); document = new XDocument(html); metadataCreator = new MetadataCreator(); }
public static Metadata TryCreateMetadata(RawModuleBytes moduleData, bool isFileLayout) { try { return(MetadataCreator.CreateMetadata(new PEImage((IntPtr)moduleData.Pointer, moduleData.Size, isFileLayout ? ImageLayout.File : ImageLayout.Memory, verify: true))); } catch (IOException) { } catch (BadImageFormatException) { } return(null); }
static void InitializeExeFieldsFrom(IPEImage peImage, out bool isExe, out bool isDll, out DateTime?timestamp, ref string version, out string assemblySimpleName) { isExe = (peImage.ImageNTHeaders.FileHeader.Characteristics & Characteristics.Dll) == 0; isDll = !isExe; // Roslyn sets bit 31 if /deterministic is used (the low 31 bits is not a timestamp) if (peImage.ImageNTHeaders.FileHeader.TimeDateStamp < 0x80000000 && peImage.ImageNTHeaders.FileHeader.TimeDateStamp != 0) { timestamp = Epoch.AddSeconds(peImage.ImageNTHeaders.FileHeader.TimeDateStamp); } else { timestamp = null; } try { if (string.IsNullOrEmpty(version)) { using (var mod = ModuleDefMD.Load(peImage)) { if (string.IsNullOrEmpty(version)) { version = mod.Assembly?.Version.ToString(); } assemblySimpleName = UTF8String.ToSystemString(mod.Assembly?.Name); } } else { using (var md = MetadataCreator.CreateMetadata(peImage)) { if (!md.TablesStream.TryReadAssemblyRow(1, out var row)) { assemblySimpleName = null; } else { assemblySimpleName = md.StringsStream.Read(row.Name); } } } } catch { assemblySimpleName = null; } }
static DmdEcma335MetadataReader Create(DmdModuleImpl module, IPEImage peImage) { var metadata = MetadataCreator.CreateMetadata(peImage); return(new DmdEcma335MetadataReader(module, metadata)); }
public override bool Execute() { if (string.IsNullOrWhiteSpace(IVTString)) { Log.LogMessageFromText(nameof(IVTString) + " is an empty string", MessageImportance.High); return(false); } if (string.IsNullOrWhiteSpace(DestinationDirectory)) { Log.LogMessageFromText(nameof(DestinationDirectory) + " is an empty string", MessageImportance.High); return(false); } var assembliesToFix = new HashSet <string>(StringComparer.OrdinalIgnoreCase); foreach (var tmp in AssembliesToMakePublic.Split(';')) { var asmName = tmp.Trim(); var asmSimpleName = asmName; int index = asmSimpleName.IndexOf(','); if (index >= 0) { asmSimpleName = asmSimpleName.Substring(0, index).Trim(); } if (asmSimpleName.Length == 0) { continue; } assembliesToFix.Add(asmSimpleName); } OutputReferencePath = new ITaskItem[ReferencePath.Length]; byte[] ivtBlob = null; for (int i = 0; i < ReferencePath.Length; i++) { var file = ReferencePath[i]; OutputReferencePath[i] = file; var filename = file.ItemSpec; var fileExt = Path.GetExtension(filename); var asmSimpleName = Path.GetFileNameWithoutExtension(filename); if (!assembliesToFix.Contains(asmSimpleName)) { continue; } if (!File.Exists(filename)) { Log.LogMessageFromText($"File does not exist: {filename}", MessageImportance.High); return(false); } var patchDir = DestinationDirectory; Directory.CreateDirectory(patchDir); var fileInfo = new FileInfo(filename); long filesize = fileInfo.Length; long writeTime = fileInfo.LastWriteTimeUtc.ToBinary(); var extraInfo = $"_{VERSION} {filesize} {writeTime}_"; var patchedFilename = Path.Combine(patchDir, asmSimpleName + extraInfo + fileExt); if (StringComparer.OrdinalIgnoreCase.Equals(patchedFilename, filename)) { continue; } if (!File.Exists(patchedFilename)) { if (ivtBlob == null) { ivtBlob = CreateIVTBlob(IVTString); } var data = File.ReadAllBytes(filename); try { using (var peImage = new PEImage(data, filename, ImageLayout.File, verify: true)) { using (var md = MetadataCreator.CreateMetadata(peImage, verify: true)) { var result = new IVTPatcher(data, md, ivtBlob).Patch(); if (result != IVTPatcherResult.OK) { string errMsg; switch (result) { case IVTPatcherResult.NoCustomAttributes: errMsg = $"Assembly '{asmSimpleName}' has no custom attributes"; break; case IVTPatcherResult.NoIVTs: errMsg = $"Assembly '{asmSimpleName}' has no InternalsVisibleToAttributes"; break; case IVTPatcherResult.IVTBlobTooSmall: errMsg = $"Assembly '{asmSimpleName}' has no InternalsVisibleToAttribute blob that is big enough to store '{IVTString}'. Use a shorter assembly name and/or a shorter public key, or skip PublicKey=xxxx... altogether (if it's a C# assembly)"; break; default: Debug.Fail($"Unknown error result: {result}"); errMsg = "Unknown error"; break; } Log.LogMessageFromText(errMsg, MessageImportance.High); return(false); } try { File.WriteAllBytes(patchedFilename, data); } catch { try { File.Delete(patchedFilename); } catch { } throw; } } } } catch (Exception ex) when(ex is IOException || ex is BadImageFormatException) { Log.LogMessageFromText($"File '{filename}' is not a .NET file", MessageImportance.High); return(false); } var xmlDocFile = Path.ChangeExtension(filename, "xml"); if (File.Exists(xmlDocFile)) { var newXmlDocFile = Path.ChangeExtension(patchedFilename, "xml"); if (File.Exists(newXmlDocFile)) { File.Delete(newXmlDocFile); } File.Copy(xmlDocFile, newXmlDocFile); } } OutputReferencePath[i] = new TaskItem(patchedFilename); } return(true); }