From ffa61e6a897db3c79075ecca6123d07042964b91 Mon Sep 17 00:00:00 2001 From: de4dot Date: Tue, 10 Apr 2012 15:09:59 +0200 Subject: [PATCH] Move PE code to a common assembly --- {de4dot.code => blocks}/PE/Cor20Header.cs | 4 +-- {de4dot.code => blocks}/PE/DataDirectory.cs | 2 +- {de4dot.code => blocks}/PE/DotNetStream.cs | 2 +- {de4dot.code => blocks}/PE/FileHeader.cs | 4 +-- {de4dot.code => blocks}/PE/IFileLocation.cs | 2 +- {de4dot.code => blocks}/PE/Metadata.cs | 2 +- {de4dot.code => blocks}/PE/MetadataTables.cs | 2 +- {de4dot.code => blocks}/PE/MetadataType.cs | 6 ++-- .../PE/MetadataTypeBuilder.cs | 0 {de4dot.code => blocks}/PE/OptionalHeader.cs | 2 +- {de4dot.code => blocks}/PE/PeImage.cs | 28 +++++++++++++++---- {de4dot.code => blocks}/PE/ResourceData.cs | 2 +- .../PE/ResourceDirectory.cs | 2 +- .../PE/ResourceDirectoryEntry.cs | 2 +- {de4dot.code => blocks}/PE/Resources.cs | 2 +- {de4dot.code => blocks}/PE/SectionHeader.cs | 2 +- blocks/blocks.csproj | 16 +++++++++++ de4dot.code/de4dot.code.csproj | 17 ----------- 18 files changed, 56 insertions(+), 41 deletions(-) rename {de4dot.code => blocks}/PE/Cor20Header.cs (96%) rename {de4dot.code => blocks}/PE/DataDirectory.cs (97%) rename {de4dot.code => blocks}/PE/DotNetStream.cs (96%) rename {de4dot.code => blocks}/PE/FileHeader.cs (95%) rename {de4dot.code => blocks}/PE/IFileLocation.cs (95%) rename {de4dot.code => blocks}/PE/Metadata.cs (98%) rename {de4dot.code => blocks}/PE/MetadataTables.cs (99%) rename {de4dot.code => blocks}/PE/MetadataType.cs (96%) rename {de4dot.code => blocks}/PE/MetadataTypeBuilder.cs (100%) rename {de4dot.code => blocks}/PE/OptionalHeader.cs (98%) rename {de4dot.code => blocks}/PE/PeImage.cs (88%) rename {de4dot.code => blocks}/PE/ResourceData.cs (95%) rename {de4dot.code => blocks}/PE/ResourceDirectory.cs (98%) rename {de4dot.code => blocks}/PE/ResourceDirectoryEntry.cs (97%) rename {de4dot.code => blocks}/PE/Resources.cs (98%) rename {de4dot.code => blocks}/PE/SectionHeader.cs (97%) diff --git a/de4dot.code/PE/Cor20Header.cs b/blocks/PE/Cor20Header.cs similarity index 96% rename from de4dot.code/PE/Cor20Header.cs rename to blocks/PE/Cor20Header.cs index d5b18e96..250357c8 100644 --- a/de4dot.code/PE/Cor20Header.cs +++ b/blocks/PE/Cor20Header.cs @@ -20,7 +20,7 @@ using System.IO; namespace de4dot.code.PE { - class Cor20Header : IFileLocation { + public class Cor20Header : IFileLocation { public uint cb; public ushort majorRuntimeVersion; public ushort minorRuntimeVersion; @@ -70,7 +70,7 @@ namespace de4dot.code.PE { managedNativeHeader.read(reader); } - public void initMetadataTable() { + internal void initMetadataTable() { metadata = new Metadata(reader); } diff --git a/de4dot.code/PE/DataDirectory.cs b/blocks/PE/DataDirectory.cs similarity index 97% rename from de4dot.code/PE/DataDirectory.cs rename to blocks/PE/DataDirectory.cs index e281cbe4..a470e717 100644 --- a/de4dot.code/PE/DataDirectory.cs +++ b/blocks/PE/DataDirectory.cs @@ -20,7 +20,7 @@ using System.IO; namespace de4dot.code.PE { - struct DataDirectory { + public struct DataDirectory { public uint virtualAddress; public uint size; diff --git a/de4dot.code/PE/DotNetStream.cs b/blocks/PE/DotNetStream.cs similarity index 96% rename from de4dot.code/PE/DotNetStream.cs rename to blocks/PE/DotNetStream.cs index 0e64bbde..bd40efe7 100644 --- a/de4dot.code/PE/DotNetStream.cs +++ b/blocks/PE/DotNetStream.cs @@ -20,7 +20,7 @@ using System.IO; namespace de4dot.code.PE { - class DotNetStream : IFileLocation { + public class DotNetStream : IFileLocation { public string name; public uint fileOffset; public uint length; diff --git a/de4dot.code/PE/FileHeader.cs b/blocks/PE/FileHeader.cs similarity index 95% rename from de4dot.code/PE/FileHeader.cs rename to blocks/PE/FileHeader.cs index e693fb99..ee28b5ae 100644 --- a/de4dot.code/PE/FileHeader.cs +++ b/blocks/PE/FileHeader.cs @@ -20,13 +20,13 @@ using System.IO; namespace de4dot.code.PE { - enum Machine : ushort { + public enum Machine : ushort { i386 = 0x14C, ia64 = 0x200, amd64 = 0x8664, } - class FileHeader : IFileLocation { + public class FileHeader : IFileLocation { public Machine machine; public ushort numberOfSections; public uint timeDateStamp; diff --git a/de4dot.code/PE/IFileLocation.cs b/blocks/PE/IFileLocation.cs similarity index 95% rename from de4dot.code/PE/IFileLocation.cs rename to blocks/PE/IFileLocation.cs index 501587d5..b5c239fe 100644 --- a/de4dot.code/PE/IFileLocation.cs +++ b/blocks/PE/IFileLocation.cs @@ -18,7 +18,7 @@ */ namespace de4dot.code.PE { - interface IFileLocation { + public interface IFileLocation { uint Offset { get; } uint Length { get; } } diff --git a/de4dot.code/PE/Metadata.cs b/blocks/PE/Metadata.cs similarity index 98% rename from de4dot.code/PE/Metadata.cs rename to blocks/PE/Metadata.cs index bdc62c55..23947ecb 100644 --- a/de4dot.code/PE/Metadata.cs +++ b/blocks/PE/Metadata.cs @@ -22,7 +22,7 @@ using System.IO; using System.Text; namespace de4dot.code.PE { - class Metadata : IFileLocation { + public class Metadata : IFileLocation { uint magic; ushort majorVersion, minorVersion; uint reserved; diff --git a/de4dot.code/PE/MetadataTables.cs b/blocks/PE/MetadataTables.cs similarity index 99% rename from de4dot.code/PE/MetadataTables.cs rename to blocks/PE/MetadataTables.cs index 8b5f65c3..47e24a31 100644 --- a/de4dot.code/PE/MetadataTables.cs +++ b/blocks/PE/MetadataTables.cs @@ -23,7 +23,7 @@ using System.IO; namespace de4dot.code.PE { using MVT = MetadataVarType; - class MetadataTables { + public class MetadataTables { BinaryReader reader; Metadata metadata; byte heapOffsetSizes; diff --git a/de4dot.code/PE/MetadataType.cs b/blocks/PE/MetadataType.cs similarity index 96% rename from de4dot.code/PE/MetadataType.cs rename to blocks/PE/MetadataType.cs index 107f5374..4fffe34f 100644 --- a/de4dot.code/PE/MetadataType.cs +++ b/blocks/PE/MetadataType.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; namespace de4dot.code.PE { - enum MetadataIndex { + public enum MetadataIndex { iModule = 0, iTypeRef = 1, iTypeDef = 2, @@ -60,7 +60,7 @@ namespace de4dot.code.PE { iGenericParamConstraint = 44, }; - class MetadataType { + public class MetadataType { public uint fileOffset; public uint rows; public uint totalSize; @@ -78,7 +78,7 @@ namespace de4dot.code.PE { } } - struct MetadataField { + public struct MetadataField { public int offset; public int size; diff --git a/de4dot.code/PE/MetadataTypeBuilder.cs b/blocks/PE/MetadataTypeBuilder.cs similarity index 100% rename from de4dot.code/PE/MetadataTypeBuilder.cs rename to blocks/PE/MetadataTypeBuilder.cs diff --git a/de4dot.code/PE/OptionalHeader.cs b/blocks/PE/OptionalHeader.cs similarity index 98% rename from de4dot.code/PE/OptionalHeader.cs rename to blocks/PE/OptionalHeader.cs index 19836141..37c4833d 100644 --- a/de4dot.code/PE/OptionalHeader.cs +++ b/blocks/PE/OptionalHeader.cs @@ -20,7 +20,7 @@ using System.IO; namespace de4dot.code.PE { - class OptionalHeader : IFileLocation { + public class OptionalHeader : IFileLocation { public ushort magic; public byte majorLinkerVersion; public byte minorLinkerVersion; diff --git a/de4dot.code/PE/PeImage.cs b/blocks/PE/PeImage.cs similarity index 88% rename from de4dot.code/PE/PeImage.cs rename to blocks/PE/PeImage.cs index eb9a639a..3eec0b27 100644 --- a/de4dot.code/PE/PeImage.cs +++ b/blocks/PE/PeImage.cs @@ -39,15 +39,15 @@ namespace de4dot.code.PE { get { return (uint)reader.BaseStream.Length; } } - internal Cor20Header Cor20Header { + public Cor20Header Cor20Header { get { return cor20Header; } } - internal Resources Resources { + public Resources Resources { get { return resources; } } - internal SectionHeader[] Sections { + public SectionHeader[] Sections { get { return sectionHeaders; } } @@ -99,7 +99,7 @@ namespace de4dot.code.PE { if (netRva != 0) { seekRva(netRva); cor20Header = new Cor20Header(reader); - dotNetSection = getSectionHeader(netRva); + dotNetSection = getSectionHeaderRva(netRva); seekRva(cor20Header.metadataDirectory.virtualAddress); cor20Header.initMetadataTable(); } @@ -111,7 +111,7 @@ namespace de4dot.code.PE { resources = new Resources(reader, resourceOffset, optionalHeader.dataDirectories[2].size); } - SectionHeader getSectionHeader(uint rva) { + SectionHeader getSectionHeaderRva(uint rva) { for (int i = 0; i < sectionHeaders.Length; i++) { var section = sectionHeaders[i]; if (section.virtualAddress <= rva && rva < section.virtualAddress + Math.Max(section.virtualSize, section.sizeOfRawData)) @@ -120,13 +120,29 @@ namespace de4dot.code.PE { return null; } + SectionHeader getSectionHeaderOffset(uint offset) { + for (int i = 0; i < sectionHeaders.Length; i++) { + var section = sectionHeaders[i]; + if (section.pointerToRawData <= offset && offset < section.pointerToRawData + section.sizeOfRawData) + return section; + } + return null; + } + public uint rvaToOffset(uint rva) { - var section = getSectionHeader(rva); + var section = getSectionHeaderRva(rva); if (section == null) throw new ApplicationException(string.Format("Invalid RVA {0:X8}", rva)); return rva - section.virtualAddress + section.pointerToRawData; } + public uint offsetToRva(uint offset) { + var section = getSectionHeaderOffset(offset); + if (section == null) + throw new ApplicationException(string.Format("Invalid offset {0:X8}", offset)); + return offset - section.pointerToRawData + section.virtualAddress; + } + bool intersect(uint offset1, uint length1, uint offset2, uint length2) { return !(offset1 + length1 <= offset2 || offset2 + length2 <= offset1); } diff --git a/de4dot.code/PE/ResourceData.cs b/blocks/PE/ResourceData.cs similarity index 95% rename from de4dot.code/PE/ResourceData.cs rename to blocks/PE/ResourceData.cs index 1f0afeb5..bc1ce8db 100644 --- a/de4dot.code/PE/ResourceData.cs +++ b/blocks/PE/ResourceData.cs @@ -18,7 +18,7 @@ */ namespace de4dot.code.PE { - class ResourceData : ResourceDirectoryEntry { + public class ResourceData : ResourceDirectoryEntry { uint rva; uint size; diff --git a/de4dot.code/PE/ResourceDirectory.cs b/blocks/PE/ResourceDirectory.cs similarity index 98% rename from de4dot.code/PE/ResourceDirectory.cs rename to blocks/PE/ResourceDirectory.cs index 1d7d6724..559a99b6 100644 --- a/de4dot.code/PE/ResourceDirectory.cs +++ b/blocks/PE/ResourceDirectory.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; namespace de4dot.code.PE { - class ResourceDirectory : ResourceDirectoryEntry { + public class ResourceDirectory : ResourceDirectoryEntry { Resources resources; int offset; List resourceDataList = new List(); diff --git a/de4dot.code/PE/ResourceDirectoryEntry.cs b/blocks/PE/ResourceDirectoryEntry.cs similarity index 97% rename from de4dot.code/PE/ResourceDirectoryEntry.cs rename to blocks/PE/ResourceDirectoryEntry.cs index 920a96fa..9742406f 100644 --- a/de4dot.code/PE/ResourceDirectoryEntry.cs +++ b/blocks/PE/ResourceDirectoryEntry.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; namespace de4dot.code.PE { - abstract class ResourceDirectoryEntry { + public abstract class ResourceDirectoryEntry { protected readonly string name; protected readonly int id; diff --git a/de4dot.code/PE/Resources.cs b/blocks/PE/Resources.cs similarity index 98% rename from de4dot.code/PE/Resources.cs rename to blocks/PE/Resources.cs index 5e39182c..4298388e 100644 --- a/de4dot.code/PE/Resources.cs +++ b/blocks/PE/Resources.cs @@ -21,7 +21,7 @@ using System.IO; using System.Text; namespace de4dot.code.PE { - class Resources { + public class Resources { BinaryReader reader; uint startOffset; uint totalSize; diff --git a/de4dot.code/PE/SectionHeader.cs b/blocks/PE/SectionHeader.cs similarity index 97% rename from de4dot.code/PE/SectionHeader.cs rename to blocks/PE/SectionHeader.cs index 78f28033..aa47ba99 100644 --- a/de4dot.code/PE/SectionHeader.cs +++ b/blocks/PE/SectionHeader.cs @@ -21,7 +21,7 @@ using System.IO; using System.Text; namespace de4dot.code.PE { - class SectionHeader : IFileLocation { + public class SectionHeader : IFileLocation { public byte[] name; public uint virtualSize; public uint virtualAddress; diff --git a/blocks/blocks.csproj b/blocks/blocks.csproj index 06dd36d9..70537397 100644 --- a/blocks/blocks.csproj +++ b/blocks/blocks.csproj @@ -68,6 +68,22 @@ + + + + + + + + + + + + + + + + diff --git a/de4dot.code/de4dot.code.csproj b/de4dot.code/de4dot.code.csproj index 3c210e11..b1175950 100644 --- a/de4dot.code/de4dot.code.csproj +++ b/de4dot.code/de4dot.code.csproj @@ -12,7 +12,6 @@ de4dot.code v2.0 512 - true ..\de4dot.snk @@ -225,22 +224,6 @@ - - - - - - - - - - - - - - - -