diff options
author | Jb Evain <jbevain@gmail.com> | 2017-10-01 19:46:50 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-01 19:46:50 +0300 |
commit | 328ea67d86f01b4061c50571dd864a99f104ba02 (patch) | |
tree | 79402e4f281aaa694b7da7dadf7cf4ff5e80efdd | |
parent | 7dfa7b811adae4c0ac669f9abc116d2551341ad7 (diff) | |
parent | 5cde681b780d56a6734b0b6d510f891933fdc84f (diff) |
Merge pull request #450 from erozenfeld/Win32Resources
Fix win32 resource processing.
-rw-r--r-- | Mono.Cecil.PE/Image.cs | 1 | ||||
-rw-r--r-- | Mono.Cecil.PE/ImageReader.cs | 8 | ||||
-rw-r--r-- | Mono.Cecil.PE/ImageWriter.cs | 22 |
3 files changed, 16 insertions, 15 deletions
diff --git a/Mono.Cecil.PE/Image.cs b/Mono.Cecil.PE/Image.cs index 8160f94..d9d182a 100644 --- a/Mono.Cecil.PE/Image.cs +++ b/Mono.Cecil.PE/Image.cs @@ -39,6 +39,7 @@ namespace Mono.Cecil.PE { public uint Timestamp; public ModuleAttributes Attributes; + public DataDirectory Win32Resources; public DataDirectory Debug; public DataDirectory Resources; public DataDirectory StrongName; diff --git a/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil.PE/ImageReader.cs index f36d2e5..63213f3 100644 --- a/Mono.Cecil.PE/ImageReader.cs +++ b/Mono.Cecil.PE/ImageReader.cs @@ -160,12 +160,18 @@ namespace Mono.Cecil.PE { // ExportTable 8 // ImportTable 8 + + Advance (pe64 ? 56 : 40); + // ResourceTable 8 + + image.Win32Resources = ReadDataDirectory (); + // ExceptionTable 8 // CertificateTable 8 // BaseRelocationTable 8 - Advance (pe64 ? 88 : 72); + Advance (24); // Debug 8 image.Debug = ReadDataDirectory (); diff --git a/Mono.Cecil.PE/ImageWriter.cs b/Mono.Cecil.PE/ImageWriter.cs index 3fc689d..f69e134 100644 --- a/Mono.Cecil.PE/ImageWriter.cs +++ b/Mono.Cecil.PE/ImageWriter.cs @@ -87,21 +87,15 @@ namespace Mono.Cecil.PE { void GetWin32Resources () { - var rsrc = GetImageResourceSection (); - if (rsrc == null) - return; - - win32_resources = module.Image.GetReaderAt (rsrc.VirtualAddress, rsrc.SizeOfRawData, (s, reader) => new ByteBuffer (reader.ReadBytes ((int) s))); - } - - Section GetImageResourceSection () - { if (!module.HasImage) - return null; + return; - const string rsrc_section = ".rsrc"; + DataDirectory win32_resources_directory = module.Image.Win32Resources; + var size = win32_resources_directory.Size; - return module.Image.GetSection (rsrc_section); + if (size > 0) { + win32_resources = module.Image.GetReaderAt (win32_resources_directory.VirtualAddress, size, (s, reader) => new ByteBuffer (reader.ReadBytes ((int) s))); + } } public static ImageWriter CreateWriter (ModuleDefinition module, MetadataBuilder metadata, Disposable<Stream> stream) @@ -846,10 +840,10 @@ namespace Mono.Cecil.PE { void PatchResourceDataEntry (ByteBuffer resources) { - var old_rsrc = GetImageResourceSection (); var rva = resources.ReadUInt32 (); resources.position -= 4; - resources.WriteUInt32 (rva - old_rsrc.VirtualAddress + rsrc.VirtualAddress); + + resources.WriteUInt32 (rva - module.Image.Win32Resources.VirtualAddress + rsrc.VirtualAddress); } } } |