From b1a633c1194845b05b4f996788650ab9a7d1bea5 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Thu, 7 Nov 2019 22:53:55 +0000 Subject: [PATCH 1/8] Added badge. --- readme.md | 177 +++++++++++++++++++++++++++--------------------------- 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/readme.md b/readme.md index 0f310c6..3a22c5a 100644 --- a/readme.md +++ b/readme.md @@ -1,89 +1,90 @@ -# Workshell PE Class Library - -[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/Workshell/pe/blob/master/license.txt) -[![NuGet](https://img.shields.io/nuget/v/Workshell.PE.svg)](https://www.nuget.org/packages/Workshell.PE/) - -This is a class library for reading the Portable Executable file format convering all the major data sections including: - -* Core Headers (DOS, File, Optional) -* Section Table -* Debug Directory -* Relocations -* Imports -* Delayed Imports -* Exports -* Resources -* TLS -* Load Configuration -* Certificates -* .NET - -For help getting started please see the wiki. Any suggestions for improvements and ideas welcome. - - -## Installation - -Stable builds are available as NuGet packages. You can install it via the Package Manager or via the Package Manager Console: - -``` -Install-Package Workshell.PE -Install-Package Workshell.PE.Resources -``` - - -## Basic Usage - -You begin by calling `PortableExecutableImage.FromFileAsync(string)` to load the executable image, such as: - -``` -var image = await PortableExecutableImage.FromFileAsync("user32.dll"); -``` - -You can then retireve information from the image. Some information is retrieved in a direct manor, like a lot of the core -header information, for example: - -``` -var imageBase = image.NTHeaders.OptionalHeader.ImageBase; -``` - -And some information is indirect via classes that work on the image. If you wanted all the exports for example: - -``` -var exports = await Exports.GetAsync(image); -``` - -You can then iterate each export: - -``` -foreach(var export in exports) -{ - Console.WriteLine(export.Name); -} -``` - -At present there is no real documentation so the best option is to explore the source code and experiment! - -If you have questions please do get in touch we're always happy to help. - - -## MIT License - -Copyright (c) Workshell Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# Workshell PE Class Library + +[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/Workshell/pe/blob/master/license.txt) +[![NuGet](https://img.shields.io/nuget/v/Workshell.PE.svg)](https://www.nuget.org/packages/Workshell.PE/) +[![Build status](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_apis/build/status/Build)](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_build/latest?definitionId=2) + +This is a class library for reading the Portable Executable file format convering all the major data sections including: + +* Core Headers (DOS, File, Optional) +* Section Table +* Debug Directory +* Relocations +* Imports +* Delayed Imports +* Exports +* Resources +* TLS +* Load Configuration +* Certificates +* .NET + +For help getting started please see the wiki. Any suggestions for improvements and ideas welcome. + + +## Installation + +Stable builds are available as NuGet packages. You can install it via the Package Manager or via the Package Manager Console: + +``` +Install-Package Workshell.PE +Install-Package Workshell.PE.Resources +``` + + +## Basic Usage + +You begin by calling `PortableExecutableImage.FromFileAsync(string)` to load the executable image, such as: + +``` +var image = await PortableExecutableImage.FromFileAsync("user32.dll"); +``` + +You can then retireve information from the image. Some information is retrieved in a direct manor, like a lot of the core +header information, for example: + +``` +var imageBase = image.NTHeaders.OptionalHeader.ImageBase; +``` + +And some information is indirect via classes that work on the image. If you wanted all the exports for example: + +``` +var exports = await Exports.GetAsync(image); +``` + +You can then iterate each export: + +``` +foreach(var export in exports) +{ + Console.WriteLine(export.Name); +} +``` + +At present there is no real documentation so the best option is to explore the source code and experiment! + +If you have questions please do get in touch we're always happy to help. + + +## MIT License + +Copyright (c) Workshell Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From 12ace49b2523b95cc90db3f611e2e81e68a1c1c9 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Thu, 7 Nov 2019 23:17:49 +0000 Subject: [PATCH 2/8] Changed name...again. --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 3a22c5a..25db3c0 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/Workshell/pe/blob/master/license.txt) [![NuGet](https://img.shields.io/nuget/v/Workshell.PE.svg)](https://www.nuget.org/packages/Workshell.PE/) -[![Build status](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_apis/build/status/Build)](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_build/latest?definitionId=2) +[![Build status](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_apis/build/status/Build%20Master)](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_build/latest?definitionId=2) This is a class library for reading the Portable Executable file format convering all the major data sections including: From c6558a05ed656c0efdef58c10bb855df9d841677 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Thu, 7 Nov 2019 23:31:48 +0000 Subject: [PATCH 3/8] Added initial test project. --- dotNET PE.sln | 80 ++++++++++--------- tests/Workshell.PE.Tests/UnitTest1.cs | 18 +++++ .../Workshell.PE.Tests.csproj | 15 ++++ 3 files changed, 76 insertions(+), 37 deletions(-) create mode 100644 tests/Workshell.PE.Tests/UnitTest1.cs create mode 100644 tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj diff --git a/dotNET PE.sln b/dotNET PE.sln index 3bd440f..9aff616 100644 --- a/dotNET PE.sln +++ b/dotNET PE.sln @@ -1,37 +1,43 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2042 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Workshell.PE", "src\Workshell.PE\Workshell.PE.csproj", "{2DF6E85A-7269-46C6-9032-1C3A8F029AE3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Workshell.PE.Resources", "src\Workshell.PE.Resources\Workshell.PE.Resources.csproj", "{DBED9C9E-0B8C-46B5-AE1D-865722B68E44}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{85C1A49C-0316-4C2D-B2E3-17B1F8200EE7}" - ProjectSection(SolutionItems) = preProject - src\CommonAssemblyInfo.cs = src\CommonAssemblyInfo.cs - readme.md = readme.md - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Release|Any CPU.Build.0 = Release|Any CPU - {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D281E078-262D-4616-9157-CE1C42C0026C} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29503.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Workshell.PE", "src\Workshell.PE\Workshell.PE.csproj", "{2DF6E85A-7269-46C6-9032-1C3A8F029AE3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Workshell.PE.Resources", "src\Workshell.PE.Resources\Workshell.PE.Resources.csproj", "{DBED9C9E-0B8C-46B5-AE1D-865722B68E44}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{85C1A49C-0316-4C2D-B2E3-17B1F8200EE7}" + ProjectSection(SolutionItems) = preProject + src\CommonAssemblyInfo.cs = src\CommonAssemblyInfo.cs + readme.md = readme.md + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Workshell.PE.Tests", "tests\Workshell.PE.Tests\Workshell.PE.Tests.csproj", "{8A5FC684-11D6-4902-B0E0-7FEBC36BA21F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DF6E85A-7269-46C6-9032-1C3A8F029AE3}.Release|Any CPU.Build.0 = Release|Any CPU + {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBED9C9E-0B8C-46B5-AE1D-865722B68E44}.Release|Any CPU.Build.0 = Release|Any CPU + {8A5FC684-11D6-4902-B0E0-7FEBC36BA21F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A5FC684-11D6-4902-B0E0-7FEBC36BA21F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A5FC684-11D6-4902-B0E0-7FEBC36BA21F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A5FC684-11D6-4902-B0E0-7FEBC36BA21F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D281E078-262D-4616-9157-CE1C42C0026C} + EndGlobalSection +EndGlobal diff --git a/tests/Workshell.PE.Tests/UnitTest1.cs b/tests/Workshell.PE.Tests/UnitTest1.cs new file mode 100644 index 0000000..aab0118 --- /dev/null +++ b/tests/Workshell.PE.Tests/UnitTest1.cs @@ -0,0 +1,18 @@ +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + public class Tests + { + [SetUp] + public void Setup() + { + } + + [Test] + public void Test1() + { + Assert.Pass(); + } + } +} \ No newline at end of file diff --git a/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj new file mode 100644 index 0000000..9675578 --- /dev/null +++ b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp3.0 + + false + + + + + + + + + From 5991516ff1dda2a60d7aa840a3793fe25351c05a Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Fri, 8 Nov 2019 00:47:58 +0000 Subject: [PATCH 4/8] Started adding unit tests! --- tests/Workshell.PE.Tests/DOSHeaderTests.cs | 64 ++++++ tests/Workshell.PE.Tests/FileHeaderTests.cs | 98 +++++++++ .../Workshell.PE.Tests/Files/clrtest.any.dll | Bin 0 -> 4096 bytes .../Workshell.PE.Tests/Files/clrtest.x64.dll | Bin 0 -> 3584 bytes .../Workshell.PE.Tests/Files/clrtest.x86.dll | Bin 0 -> 4096 bytes tests/Workshell.PE.Tests/Files/license.txt | 19 ++ .../Files/nativetest.x64.dll | Bin 0 -> 286815 bytes .../Files/nativetest.x86.dll | Bin 0 -> 242608 bytes tests/Workshell.PE.Tests/GeneralTests.cs | 189 ++++++++++++++++++ .../Workshell.PE.Tests/OptionalHeaderTests.cs | 47 +++++ tests/Workshell.PE.Tests/UnitTest1.cs | 18 -- tests/Workshell.PE.Tests/Utils.cs | 41 ++++ .../Workshell.PE.Tests.csproj | 25 ++- 13 files changed, 482 insertions(+), 19 deletions(-) create mode 100644 tests/Workshell.PE.Tests/DOSHeaderTests.cs create mode 100644 tests/Workshell.PE.Tests/FileHeaderTests.cs create mode 100644 tests/Workshell.PE.Tests/Files/clrtest.any.dll create mode 100644 tests/Workshell.PE.Tests/Files/clrtest.x64.dll create mode 100644 tests/Workshell.PE.Tests/Files/clrtest.x86.dll create mode 100644 tests/Workshell.PE.Tests/Files/license.txt create mode 100644 tests/Workshell.PE.Tests/Files/nativetest.x64.dll create mode 100644 tests/Workshell.PE.Tests/Files/nativetest.x86.dll create mode 100644 tests/Workshell.PE.Tests/GeneralTests.cs create mode 100644 tests/Workshell.PE.Tests/OptionalHeaderTests.cs delete mode 100644 tests/Workshell.PE.Tests/UnitTest1.cs create mode 100644 tests/Workshell.PE.Tests/Utils.cs diff --git a/tests/Workshell.PE.Tests/DOSHeaderTests.cs b/tests/Workshell.PE.Tests/DOSHeaderTests.cs new file mode 100644 index 0000000..d51ad05 --- /dev/null +++ b/tests/Workshell.PE.Tests/DOSHeaderTests.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class DOSHeaderTests + { + [TestCase("clrtest.any.dll", 0x0090)] + [TestCase("clrtest.x86.dll", 0x0090)] + [TestCase("clrtest.x64.dll", 0x0090)] + [TestCase("nativetest.x86.dll", 0x0050)] + [TestCase("nativetest.x64.dll", 0x0050)] + public void Bytes_On_Last_Page_Of_File_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.DOSHeader.BytesOnLastPage; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x0040)] + [TestCase("clrtest.x86.dll", 0x0040)] + [TestCase("clrtest.x64.dll", 0x0040)] + [TestCase("nativetest.x86.dll", 0x0040)] + [TestCase("nativetest.x64.dll", 0x0040)] + public void File_Address_Relocation_Table_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.DOSHeader.FileAddressRelocationTable; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00000080)] + [TestCase("clrtest.x86.dll", 0x00000080)] + [TestCase("clrtest.x64.dll", 0x00000080)] + [TestCase("nativetest.x86.dll", 0x00000100)] + [TestCase("nativetest.x64.dll", 0x00000100)] + public void File_Address_New_Header_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.DOSHeader.FileAddressNewHeader; + + value.Should().Be(expectedValue); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/FileHeaderTests.cs b/tests/Workshell.PE.Tests/FileHeaderTests.cs new file mode 100644 index 0000000..d798121 --- /dev/null +++ b/tests/Workshell.PE.Tests/FileHeaderTests.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class FileHeaderTests + { + [TestCase("clrtest.any.dll", 0x014C)] + [TestCase("clrtest.x86.dll", 0x014C)] + [TestCase("clrtest.x64.dll", 0x8664)] + [TestCase("nativetest.x86.dll", 0x014C)] + [TestCase("nativetest.x64.dll", 0x8664)] + public void Machine_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.FileHeader.Machine; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x0003)] + [TestCase("clrtest.x86.dll", 0x0003)] + [TestCase("clrtest.x64.dll", 0x0002)] + [TestCase("nativetest.x86.dll", 0x000B)] + [TestCase("nativetest.x64.dll", 0x000B)] + public void NumberOfSections_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.FileHeader.NumberOfSections; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0xD8FCD8BF)] + [TestCase("clrtest.x86.dll", 0xC404A333)] + [TestCase("clrtest.x64.dll", 0xE88B9424)] + [TestCase("nativetest.x86.dll", 0x5DC4ACFF)] + [TestCase("nativetest.x64.dll", 0x5DC4AD3D)] + public void TimeDateStamp_Is_Correct(string fileName, long expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.FileHeader.TimeDateStamp; + + value.Should().Be(Convert.ToUInt32(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00E0)] + [TestCase("clrtest.x86.dll", 0x00E0)] + [TestCase("clrtest.x64.dll", 0x00F0)] + [TestCase("nativetest.x86.dll", 0x00E0)] + [TestCase("nativetest.x64.dll", 0x00F0)] + public void SizeOfOptionalHeader_Is_Correct(string fileName, long expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.FileHeader.SizeOfOptionalHeader; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x2022)] + [TestCase("clrtest.x86.dll", 0x2102)] + [TestCase("clrtest.x64.dll", 0x2022)] + [TestCase("nativetest.x86.dll", 0xA18E)] + [TestCase("nativetest.x64.dll", 0x2022)] + public void Characteristics_Is_Correct(string fileName, long expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.FileHeader.Characteristics; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/Files/clrtest.any.dll b/tests/Workshell.PE.Tests/Files/clrtest.any.dll new file mode 100644 index 0000000000000000000000000000000000000000..9e017e605f7bd977d3305a4b0eddfa981ab24264 GIT binary patch literal 4096 zcmeHJO>9(E6h60q45d`CKmZeXw1B1POG^<2QKs#*Q0*U`p`bLjZ)R?%58k{tx$h0o zn2>HHF)@UNF=1h%(YPYUs4<{1#DxZpEHo}~VWK-tNW`5XhWed5?=ds2urP6jXXc!H z&pG#=zx(%wU%WuIL{tY{SRlHLmLaa`{mDGk&6_`MrjM6j-*QzvD&4Os#mxeaU&A~o+|K{RbDUuD4Q*y8ALqK&``h$DJa zNyo!Lj+Lf?Y^xbq0db<<3RZUuTvq_cRzvkPYY^Rn55dBJ0UH%&7CJT>-z+2QXsu~q z!QpmLZ}Pcb5nAOKPwh54&F;?buD$G}o*dA3F}3Y1)(5fQ;(jtvwwv>L1n0dTP1}(q ztw*1iwC&)L!35fN@Yk5{b-XlM2AB{B*SsZ`Gjm&X)4Ebl>>E10=MkDNCFjaAM(#5b z9T%mxfxe@QqJi23)17oqJVaNZYM=?~fuvEmpdS)bPt(^l{X^3Ontm^G+E~dV*FlI? zbWQvsy0}kc275dgYo$%#j)q(#wSs%8#I2u)eL>4<9&xP(ZJ-UHjkE)F6?JL4SJNI% z2Q@vc=?j`#pbccw3ZO|X^d#sb$ik#HngZQPZ-92wJD^X~`=EXF8R+v`o&>Ey1Vr2M zF*19^aSwv@@5ogGzDAQZP4w+ee=E)XAme2W&@9Nafp} zyHq*o&Uh+s1yEYfJxBFnrDL7ZJ-@7vA|6x7I}5c3N3# zj@P{9C{Bl>ljPGZNt|~+@kGV*@7=8Lywm&k@%=ZG4J#X|&JZG2Ymlf%XZ31kn`7U; z+_G@}@t+Pu-VBV@wxeyQSWM`9lV}s4qEyYgqsl6bcy9lhj4W`TsafTn_65c*(`Rpw zpbh3oe<~U7vd6-@J#%W8*$E5HYwm8IgzXm`Yff*$Cd?1ZiYr4 z*A%j8N*?Oj^~4?ueSP_L=!^5&@X4Q}y%(=`7!Tk6AsfCO9O7B-8{At8(Hm3JO!avx z;W)#V?NZ*)cuGpWRav{R4K^01z0~0UlK-dzLKh$J?0mHYK3zoE<4fc`j=vp_#j&?} zqla**W;c2hl*G$2LH#t2-XOlTM!*k(4wSyS=<~YY?^M3J(Hn9gw1cO;>J4FW0w`eB z!hJG;ljYz(86=lxaKkWc)gMVIXe~&6=q(B`4zIJ;6MazEgjfY)3NXrsJogWlenrv( zSx3L!l;#=$W03d3UY-it#~d=Uz)5XC1CI)pC4BQY-cx#f6lp@sGum&VDz3%zN`9hw z6PTx9v7AR2-saA`$bOm-7gvIPE3_6ODMwaq-=r+Gd<(au!h(h{C#Pp{W(Atl5$14P za}EYDuI-P8a;_TNkK$vlRDpZ>DdjVU`5t^1DFe&p=m>mu-8%7&g>R#(@r$cau0d4i n9@NN3E_tk$gDec}lt(rMndWY^1ZhuiJsyna#{B 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 literal 0 HcmV?d00001 diff --git a/tests/Workshell.PE.Tests/Files/license.txt b/tests/Workshell.PE.Tests/Files/license.txt new file mode 100644 index 0000000..8f22406 --- /dev/null +++ b/tests/Workshell.PE.Tests/Files/license.txt @@ -0,0 +1,19 @@ +Copyright (c) Workshell Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/tests/Workshell.PE.Tests/Files/nativetest.x64.dll b/tests/Workshell.PE.Tests/Files/nativetest.x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..25d7f4923395fb81436442e564da94305cdce0c8 GIT binary patch literal 286815 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

j>nc_O)K|oXvWGP*Hc%{Vc%ZslH=$!of>I5C` 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�MB0G*#` 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 literal 0 HcmV?d00001 diff --git a/tests/Workshell.PE.Tests/GeneralTests.cs b/tests/Workshell.PE.Tests/GeneralTests.cs new file mode 100644 index 0000000..81b931c --- /dev/null +++ b/tests/Workshell.PE.Tests/GeneralTests.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class GeneralTests + { + [Test] + public void IsValid_With_Text_File_Returns_False() + { + var file = Utils.GetFileFromResources("license.txt"); + var isValid = PortableExecutableImage.IsValid(file); + + isValid.Should().BeFalse(); + } + + [Test] + public void IsValid_With_Executable_File_Returns_True() + { + var file = Utils.GetFileFromResources("clrtest.any.dll"); + var isValid = PortableExecutableImage.IsValid(file); + + isValid.Should().BeTrue(); + } + + [Test] + public void GetStream_Returns_Successfully() + { + var file = Utils.GetFileFromResources("clrtest.any.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var stream = image.GetStream(); + + stream.Should().NotBeNull(); + } + } + + [Test] + public void GetCalculator_Returns_Successfully() + { + var file = Utils.GetFileFromResources("clrtest.any.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var calc = image.GetCalculator(); + + calc.Should().NotBeNull(); + } + } + + [Test] + public void Is32Bit_With_32Bit_Image_Returns_True() + { + var file = Utils.GetFileFromResources("clrtest.x86.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Is32Bit.Should().BeTrue(); + } + } + + [Test] + public void Is32Bit_With_64Bit_Image_Returns_False() + { + var file = Utils.GetFileFromResources("clrtest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Is32Bit.Should().BeFalse(); + } + } + + [Test] + public void Is64Bit_With_64Bit_Image_Returns_True() + { + var file = Utils.GetFileFromResources("clrtest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Is64Bit.Should().BeTrue(); + } + } + + [Test] + public void Is64Bit_With_32Bit_Image_Returns_False() + { + var file = Utils.GetFileFromResources("clrtest.x86.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Is64Bit.Should().BeFalse(); + } + } + + [Test] + public void IsCLR_With_CLR_Image_Returns_True() + { + var file = Utils.GetFileFromResources("clrtest.any.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.IsCLR.Should().BeTrue(); + } + } + + [Test] + public void IsCLR_With_Native_Image_Returns_False() + { + var file = Utils.GetFileFromResources("nativetest.x86.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.IsCLR.Should().BeFalse(); + } + } + + [Test] + public void IsSigned_Returns_False() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.IsSigned.Should().BeFalse(); + } + } + + [Test] + public void DOSHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.DOSHeader.Should().NotBeNull(); + } + } + + [Test] + public void DOSStub_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.DOSStub.Should().NotBeNull(); + } + } + + [Test] + public void NTHeaders_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.Should().NotBeNull(); + } + } + + [Test] + public void FileHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.FileHeader.Should().NotBeNull(); + } + } + + [Test] + public void OptionalHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.OptionalHeader.Should().NotBeNull(); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/OptionalHeaderTests.cs b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs new file mode 100644 index 0000000..a1baedd --- /dev/null +++ b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class OptionalHeaderTests + { + [TestCase("clrtest.any.dll", typeof(OptionalHeader32))] + [TestCase("clrtest.x86.dll", typeof(OptionalHeader32))] + [TestCase("clrtest.x64.dll", typeof(OptionalHeader64))] + [TestCase("nativetest.x86.dll", typeof(OptionalHeader32))] + [TestCase("nativetest.x64.dll", typeof(OptionalHeader64))] + public void Type_Is_Correct(string fileName, Type type) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader; + + value.Should().BeOfType(type); + } + } + + [TestCase("clrtest.any.dll", 0x0090)] + [TestCase("clrtest.x86.dll", 0x0090)] + [TestCase("clrtest.x64.dll", 0x0090)] + [TestCase("nativetest.x86.dll", 0x0050)] + [TestCase("nativetest.x64.dll", 0x0050)] + public void Magic_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.Magic; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/UnitTest1.cs b/tests/Workshell.PE.Tests/UnitTest1.cs deleted file mode 100644 index aab0118..0000000 --- a/tests/Workshell.PE.Tests/UnitTest1.cs +++ /dev/null @@ -1,18 +0,0 @@ -using NUnit.Framework; - -namespace Workshell.PE.Tests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void Test1() - { - Assert.Pass(); - } - } -} \ No newline at end of file diff --git a/tests/Workshell.PE.Tests/Utils.cs b/tests/Workshell.PE.Tests/Utils.cs new file mode 100644 index 0000000..ded12c4 --- /dev/null +++ b/tests/Workshell.PE.Tests/Utils.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace Workshell.PE.Tests +{ + internal static class Utils + { + private static readonly string[] _testFilenames = new string[] + { + "clrtest.any.dll", + "clrtest.x86.dll", + "clrtest.x64.dll", + "nativetest.x86.dll", + "nativetest.x64.dll" + }; + private static readonly Random _random = new Random(); + + #region Methods + + public static Stream GetFileFromResources(string fileName) + { + var path = $"Workshell.PE.Tests.Files.{fileName}"; + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(path); + + return stream; + } + + public static string GetRandomTestFilename() + { + var idx = _random.Next(0, _testFilenames.Length - 1); + + return _testFilenames[idx]; + } + + #endregion + } +} diff --git a/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj index 9675578..20cf79b 100644 --- a/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj +++ b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj @@ -1,15 +1,38 @@ - netcoreapp3.0 + netcoreapp2.0 false + + + + + + + + + + + + + + + + + + + + + + + From ebe1265a21e96122e122a8ff993c88773db43124 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Fri, 8 Nov 2019 12:21:18 +0000 Subject: [PATCH 5/8] Lots and lots of unit tests. --- readme.md | 2 +- tests/Workshell.PE.Tests/DOSHeaderTests.cs | 11 + .../Workshell.PE.Tests/DataDirectoryTests.cs | 319 ++++++++++++++++++ tests/Workshell.PE.Tests/FileHeaderTests.cs | 11 + tests/Workshell.PE.Tests/GeneralTests.cs | 44 --- tests/Workshell.PE.Tests/NTHeadersTests.cs | 24 ++ .../Workshell.PE.Tests/OptionalHeaderTests.cs | 256 +++++++++++++- 7 files changed, 617 insertions(+), 50 deletions(-) create mode 100644 tests/Workshell.PE.Tests/DataDirectoryTests.cs create mode 100644 tests/Workshell.PE.Tests/NTHeadersTests.cs diff --git a/readme.md b/readme.md index 25db3c0..567cd0f 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/Workshell/pe/blob/master/license.txt) [![NuGet](https://img.shields.io/nuget/v/Workshell.PE.svg)](https://www.nuget.org/packages/Workshell.PE/) -[![Build status](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_apis/build/status/Build%20Master)](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_build/latest?definitionId=2) +[![Build Status](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_apis/build/status/Build%20Master?branchName=master)](https://dev.azure.com/Workshell-DevOps/Workshell%20PE/_build/latest?definitionId=2&branchName=master) This is a class library for reading the Portable Executable file format convering all the major data sections including: diff --git a/tests/Workshell.PE.Tests/DOSHeaderTests.cs b/tests/Workshell.PE.Tests/DOSHeaderTests.cs index d51ad05..b3a33c7 100644 --- a/tests/Workshell.PE.Tests/DOSHeaderTests.cs +++ b/tests/Workshell.PE.Tests/DOSHeaderTests.cs @@ -10,6 +10,17 @@ namespace Workshell.PE.Tests [TestFixture] public sealed class DOSHeaderTests { + [Test] + public void DOSHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.DOSHeader.Should().NotBeNull(); + } + } + [TestCase("clrtest.any.dll", 0x0090)] [TestCase("clrtest.x86.dll", 0x0090)] [TestCase("clrtest.x64.dll", 0x0090)] diff --git a/tests/Workshell.PE.Tests/DataDirectoryTests.cs b/tests/Workshell.PE.Tests/DataDirectoryTests.cs new file mode 100644 index 0000000..6379524 --- /dev/null +++ b/tests/Workshell.PE.Tests/DataDirectoryTests.cs @@ -0,0 +1,319 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class DataDirectoryTests + { + [Test] + public void DataDirectory_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.DataDirectories.Should().NotBeNull(); + } + } + + [Test] + public void DataDirectory_Is_Not_Empty() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.DataDirectories.Count.Should().BeGreaterThan(0); + } + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_ExportTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.ExportTable, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_ImportTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.ImportTable, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", true)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_ResourceTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.ResourceTable, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_ExceptionTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.ExceptionTable, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_CertificateTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.CertificateTable, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_RelocationTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.BaseRelocationTable, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", true)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_DebugDirectory_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.Debug, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_Architecture_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.Architecture, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_GlobalPtr_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.GlobalPtr, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_TLSTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.TLSTable, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_LoadConfigTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.LoadConfigTable, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_BoundImportTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.BoundImport, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_ImportAddressTable_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.ImportAddressTable, expectedValue); + } + + [TestCase("clrtest.any.dll", false)] + [TestCase("clrtest.x86.dll", false)] + [TestCase("clrtest.x64.dll", false)] + [TestCase("nativetest.x86.dll", true)] + [TestCase("nativetest.x64.dll", true)] + public void DataDirectory_DelayImportDescriptors_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.DelayImportDescriptor, expectedValue); + } + + [TestCase("clrtest.any.dll", true)] + [TestCase("clrtest.x86.dll", true)] + [TestCase("clrtest.x64.dll", true)] + [TestCase("nativetest.x86.dll", false)] + [TestCase("nativetest.x64.dll", false)] + public void DataDirectory_CLR_Exists_Or_Not(string fileName, bool expectedValue) + { + DataDirectory_Exists(fileName, DataDirectoryType.CLRRuntimeHeader, expectedValue); + } + + [Test] + public void DataDirectory_ExportTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.ExportTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x00019000U); + directory.Size.Should().Be(0x0000008FU); + } + } + + [Test] + public void DataDirectory_ImportTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.ImportTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x00017000U); + directory.Size.Should().Be(0x0000054AU); + } + } + + [Test] + public void DataDirectory_ResourceTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.ResourceTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x0001D000U); + directory.Size.Should().Be(0x00000400U); + } + } + + [Test] + public void DataDirectory_ExceptionTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.ExceptionTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x0001C000U); + directory.Size.Should().Be(0x00000E10U); + } + } + + [Test] + public void DataDirectory_RelocationTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.BaseRelocationTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x0001B000U); + directory.Size.Should().Be(0x00000590U); + } + } + + [Test] + public void DataDirectory_DebugDirectory_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.Debug); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x0001E000U); + directory.Size.Should().Be(0x00000001U); + } + } + + [Test] + public void DataDirectory_ImportAddressTable_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.ImportAddressTable); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x00017180U); + directory.Size.Should().Be(0x00000140U); + } + } + + [Test] + public void DataDirectory_DelayImportDescriptors_RVA_And_Size_Is_Correct() + { + var file = Utils.GetFileFromResources("nativetest.x64.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var directory = image.NTHeaders.DataDirectories.FirstOrDefault(e => e.DirectoryType == DataDirectoryType.DelayImportDescriptor); + + directory.Should().NotBeNull(); + directory.VirtualAddress.Should().Be(0x00018000U); + directory.Size.Should().Be(0x00000180U); + } + } + + + private static void DataDirectory_Exists(string fileName, DataDirectoryType type, bool expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.DataDirectories.ExistsAndNotEmpty(type); + + value.Should().Be(expectedValue); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/FileHeaderTests.cs b/tests/Workshell.PE.Tests/FileHeaderTests.cs index d798121..dc3240d 100644 --- a/tests/Workshell.PE.Tests/FileHeaderTests.cs +++ b/tests/Workshell.PE.Tests/FileHeaderTests.cs @@ -10,6 +10,17 @@ namespace Workshell.PE.Tests [TestFixture] public sealed class FileHeaderTests { + [Test] + public void FileHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.FileHeader.Should().NotBeNull(); + } + } + [TestCase("clrtest.any.dll", 0x014C)] [TestCase("clrtest.x86.dll", 0x014C)] [TestCase("clrtest.x64.dll", 0x8664)] diff --git a/tests/Workshell.PE.Tests/GeneralTests.cs b/tests/Workshell.PE.Tests/GeneralTests.cs index 81b931c..63cf263 100644 --- a/tests/Workshell.PE.Tests/GeneralTests.cs +++ b/tests/Workshell.PE.Tests/GeneralTests.cs @@ -131,17 +131,6 @@ public void IsSigned_Returns_False() } } - [Test] - public void DOSHeader_Is_Not_Null() - { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); - - using (var image = PortableExecutableImage.FromStream(file)) - { - image.DOSHeader.Should().NotBeNull(); - } - } - [Test] public void DOSStub_Is_Not_Null() { @@ -152,38 +141,5 @@ public void DOSStub_Is_Not_Null() image.DOSStub.Should().NotBeNull(); } } - - [Test] - public void NTHeaders_Is_Not_Null() - { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); - - using (var image = PortableExecutableImage.FromStream(file)) - { - image.NTHeaders.Should().NotBeNull(); - } - } - - [Test] - public void FileHeader_Is_Not_Null() - { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); - - using (var image = PortableExecutableImage.FromStream(file)) - { - image.NTHeaders.FileHeader.Should().NotBeNull(); - } - } - - [Test] - public void OptionalHeader_Is_Not_Null() - { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); - - using (var image = PortableExecutableImage.FromStream(file)) - { - image.NTHeaders.OptionalHeader.Should().NotBeNull(); - } - } } } diff --git a/tests/Workshell.PE.Tests/NTHeadersTests.cs b/tests/Workshell.PE.Tests/NTHeadersTests.cs new file mode 100644 index 0000000..dd4fada --- /dev/null +++ b/tests/Workshell.PE.Tests/NTHeadersTests.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class NTHeadersTests + { + [Test] + public void NTHeaders_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.Should().NotBeNull(); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/OptionalHeaderTests.cs b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs index a1baedd..7f47640 100644 --- a/tests/Workshell.PE.Tests/OptionalHeaderTests.cs +++ b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs @@ -10,6 +10,17 @@ namespace Workshell.PE.Tests [TestFixture] public sealed class OptionalHeaderTests { + [Test] + public void OptionalHeader_Is_Not_Null() + { + var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.NTHeaders.OptionalHeader.Should().NotBeNull(); + } + } + [TestCase("clrtest.any.dll", typeof(OptionalHeader32))] [TestCase("clrtest.x86.dll", typeof(OptionalHeader32))] [TestCase("clrtest.x64.dll", typeof(OptionalHeader64))] @@ -27,11 +38,11 @@ public void Type_Is_Correct(string fileName, Type type) } } - [TestCase("clrtest.any.dll", 0x0090)] - [TestCase("clrtest.x86.dll", 0x0090)] - [TestCase("clrtest.x64.dll", 0x0090)] - [TestCase("nativetest.x86.dll", 0x0050)] - [TestCase("nativetest.x64.dll", 0x0050)] + [TestCase("clrtest.any.dll", 0x010B)] + [TestCase("clrtest.x86.dll", 0x010B)] + [TestCase("clrtest.x64.dll", 0x020B)] + [TestCase("nativetest.x86.dll", 0x010B)] + [TestCase("nativetest.x64.dll", 0x020B)] public void Magic_Is_Correct(string fileName, int expectedValue) { var file = Utils.GetFileFromResources(fileName); @@ -43,5 +54,240 @@ public void Magic_Is_Correct(string fileName, int expectedValue) value.Should().Be(Convert.ToUInt16(expectedValue)); } } + + [TestCase("clrtest.any.dll", 0x30)] + [TestCase("clrtest.x86.dll", 0x30)] + [TestCase("clrtest.x64.dll", 0x30)] + [TestCase("nativetest.x86.dll", 0x02)] + [TestCase("nativetest.x64.dll", 0x08)] + public void MajorLinkerVersion_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.MajorLinkerVersion; + + value.Should().Be(Convert.ToByte(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00)] + [TestCase("clrtest.x86.dll", 0x00)] + [TestCase("clrtest.x64.dll", 0x00)] + [TestCase("nativetest.x86.dll", 0x19)] + [TestCase("nativetest.x64.dll", 0x00)] + public void MinorLinkerVersion_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.MinorLinkerVersion; + + value.Should().Be(Convert.ToByte(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00000800)] + [TestCase("clrtest.x86.dll", 0x00000800)] + [TestCase("clrtest.x64.dll", 0x00000800)] + [TestCase("nativetest.x86.dll", 0x00008000)] + [TestCase("nativetest.x64.dll", 0x0000C800)] + public void SizeOfCode_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.SizeOfCode; + + value.Should().Be(Convert.ToUInt32(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x0000268E)] + [TestCase("clrtest.x86.dll", 0x0000268E)] + [TestCase("clrtest.x64.dll", 0x00000000)] + [TestCase("nativetest.x86.dll", 0x000090E8)] + [TestCase("nativetest.x64.dll", 0x0000CE10)] + public void AddressOfEntryPoint_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.AddressOfEntryPoint; + + value.Should().Be(Convert.ToUInt32(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00002000)] + [TestCase("clrtest.x86.dll", 0x00002000)] + [TestCase("clrtest.x64.dll", 0x00002000)] + [TestCase("nativetest.x86.dll", 0x00001000)] + [TestCase("nativetest.x64.dll", 0x00001000)] + public void BaseOfCode_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.BaseOfCode; + + value.Should().Be(Convert.ToUInt32(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x00004000)] + [TestCase("clrtest.x86.dll", 0x00004000)] + [TestCase("clrtest.x64.dll", 0x00000000)] + [TestCase("nativetest.x86.dll", 0x0000A000)] + [TestCase("nativetest.x64.dll", 0x00000000)] + public void BaseOfData_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.BaseOfData; + + value.Should().Be(Convert.ToUInt32(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x10000000UL)] + [TestCase("clrtest.x86.dll", 0x10000000UL)] + [TestCase("clrtest.x64.dll", 0x0000000180000000UL)] + [TestCase("nativetest.x86.dll", 0x00400000UL)] + [TestCase("nativetest.x64.dll", 0x0000000000400000UL)] + public void ImageBase_Is_Correct(string fileName, ulong expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.ImageBase; + + value.Should().Be(expectedValue); + } + } + + [TestCase("clrtest.any.dll", 0x00002000U)] + [TestCase("clrtest.x86.dll", 0x00002000U)] + [TestCase("clrtest.x64.dll", 0x00002000U)] + [TestCase("nativetest.x86.dll", 0x00001000U)] + [TestCase("nativetest.x64.dll", 0x00001000U)] + public void SectionAlignment_Is_Correct(string fileName, uint expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.SectionAlignment; + + value.Should().Be(expectedValue); + } + } + + [TestCase("clrtest.any.dll", 0x00000200U)] + [TestCase("clrtest.x86.dll", 0x00000200U)] + [TestCase("clrtest.x64.dll", 0x00000200U)] + [TestCase("nativetest.x86.dll", 0x00000200U)] + [TestCase("nativetest.x64.dll", 0x00000200U)] + public void FileAlignment_Is_Correct(string fileName, uint expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.FileAlignment; + + value.Should().Be(expectedValue); + } + } + + [TestCase("clrtest.any.dll", 0x00008000U)] + [TestCase("clrtest.x86.dll", 0x00008000U)] + [TestCase("clrtest.x64.dll", 0x00006000U)] + [TestCase("nativetest.x86.dll", 0x00046000U)] + [TestCase("nativetest.x64.dll", 0x00054000U)] + public void SizeOfImage_Is_Correct(string fileName, uint expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.SizeOfImage; + + value.Should().Be(expectedValue); + } + } + + [TestCase("clrtest.any.dll", 0x00000200U)] + [TestCase("clrtest.x86.dll", 0x00000200U)] + [TestCase("clrtest.x64.dll", 0x00000200U)] + [TestCase("nativetest.x86.dll", 0x00000400U)] + [TestCase("nativetest.x64.dll", 0x00000400U)] + public void SizeOfHeaders_Is_Correct(string fileName, uint expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.SizeOfHeaders; + + value.Should().Be(expectedValue); + } + } + + [TestCase("clrtest.any.dll", 0x0003)] + [TestCase("clrtest.x86.dll", 0x0003)] + [TestCase("clrtest.x64.dll", 0x0003)] + [TestCase("nativetest.x86.dll", 0x0002)] + [TestCase("nativetest.x64.dll", 0x0002)] + public void Subsystem_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.Subsystem; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [TestCase("clrtest.any.dll", 0x8540)] + [TestCase("clrtest.x86.dll", 0x8540)] + [TestCase("clrtest.x64.dll", 0x8540)] + [TestCase("nativetest.x86.dll", 0x0000)] + [TestCase("nativetest.x64.dll", 0x0000)] + public void DllCharacteristics_Is_Correct(string fileName, int expectedValue) + { + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.DllCharacteristics; + + value.Should().Be(Convert.ToUInt16(expectedValue)); + } + } + + [Test] + public void NumberOfRVA_Is_Correct() + { + var fileName = Utils.GetRandomTestFilename(); + var file = Utils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var value = image.NTHeaders.OptionalHeader.NumberOfRvaAndSizes; + + value.Should().Be(16); + } + } } } From c4c0eb8f3703c8d30ae9937226f0b9162beb3051 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Fri, 8 Nov 2019 12:21:58 +0000 Subject: [PATCH 6/8] Minor tweak. --- tests/Workshell.PE.Tests/DataDirectoryTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Workshell.PE.Tests/DataDirectoryTests.cs b/tests/Workshell.PE.Tests/DataDirectoryTests.cs index 6379524..fce3b4f 100644 --- a/tests/Workshell.PE.Tests/DataDirectoryTests.cs +++ b/tests/Workshell.PE.Tests/DataDirectoryTests.cs @@ -303,7 +303,6 @@ public void DataDirectory_DelayImportDescriptors_RVA_And_Size_Is_Correct() } } - private static void DataDirectory_Exists(string fileName, DataDirectoryType type, bool expectedValue) { var file = Utils.GetFileFromResources(fileName); From 81699fb4a0add5b3850a53420f3b0c0e93435287 Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Fri, 8 Nov 2019 15:06:37 +0000 Subject: [PATCH 7/8] More tests for sections, also the Utils class. --- Src/Workshell.PE/Utils.cs | 8 +- src/Workshell.PE/Properties/AssemblyInfo.cs | 2 + tests/Workshell.PE.Tests/DOSHeaderTests.cs | 8 +- .../Workshell.PE.Tests/DataDirectoryTests.cs | 22 +- tests/Workshell.PE.Tests/FileHeaderTests.cs | 12 +- tests/Workshell.PE.Tests/GeneralTests.cs | 24 +- .../LocationCalculatorTests.cs | 10 + tests/Workshell.PE.Tests/NTHeadersTests.cs | 2 +- .../Workshell.PE.Tests/OptionalHeaderTests.cs | 36 +-- tests/Workshell.PE.Tests/SectionTableTests.cs | 89 ++++++ tests/Workshell.PE.Tests/SectionTests.cs | 82 ++++++ .../{Utils.cs => TestingUtils.cs} | 2 +- tests/Workshell.PE.Tests/UtilsTests.cs | 265 ++++++++++++++++++ .../Workshell.PE.Tests.csproj | 9 +- 14 files changed, 513 insertions(+), 58 deletions(-) create mode 100644 tests/Workshell.PE.Tests/LocationCalculatorTests.cs create mode 100644 tests/Workshell.PE.Tests/SectionTableTests.cs create mode 100644 tests/Workshell.PE.Tests/SectionTests.cs rename tests/Workshell.PE.Tests/{Utils.cs => TestingUtils.cs} (92%) create mode 100644 tests/Workshell.PE.Tests/UtilsTests.cs diff --git a/Src/Workshell.PE/Utils.cs b/Src/Workshell.PE/Utils.cs index c26abf5..f81a79d 100644 --- a/Src/Workshell.PE/Utils.cs +++ b/Src/Workshell.PE/Utils.cs @@ -98,6 +98,7 @@ public static ulong ReadUInt64(byte[] bytes) return BitConverter.ToUInt64(bytes,0); } + /* public static void Write(sbyte value, Stream stream) { var buffer = BitConverter.GetBytes(value); @@ -153,6 +154,7 @@ public static void Write(ulong value, Stream stream) Write(buffer, stream); } + */ public static void Write(byte[] bytes, Stream stream) { @@ -165,8 +167,8 @@ public static void Write(T structure, byte[] buffer, int startIndex, int coun try { - Marshal.StructureToPtr(structure,ptr,false); - Marshal.Copy(ptr,buffer,startIndex,count); + Marshal.StructureToPtr(structure, ptr, false); + Marshal.Copy(ptr, buffer, startIndex, count); } finally { @@ -178,7 +180,7 @@ public static void Write(T structure, Stream stream) where T : struct { var size = Utils.SizeOf(); - Write(structure,stream,size); + Write(structure, stream, size); } public static void Write(T structure, Stream stream, int size) where T : struct diff --git a/src/Workshell.PE/Properties/AssemblyInfo.cs b/src/Workshell.PE/Properties/AssemblyInfo.cs index d484aea..d93503e 100644 --- a/src/Workshell.PE/Properties/AssemblyInfo.cs +++ b/src/Workshell.PE/Properties/AssemblyInfo.cs @@ -25,8 +25,10 @@ #if !SIGNED [assembly: InternalsVisibleTo("Workshell.PE.Resources")] +[assembly: InternalsVisibleTo("Workshell.PE.Tests")] #else [assembly: InternalsVisibleTo("Workshell.PE.Resources, PublicKey=0024000004800000940000000602000000240000525341310004000001000100259ed23116da6a496f873182c31284a428d040b37885524e9b53049cd99d5cc84feb00dbe77278afda8ebc9def14111b20b561f8d958e3f4aea2d492fed946245c528b16cad6ee785995ccfd7e6b7b34fe4be452a651069b2c0bbcf668bfb1dd9b99a7f30ab10d289525d61e82fd45e1ebcc11fc3d286e6096a1ee7edeee6091")] +[assembly: InternalsVisibleTo("Workshell.PE.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100259ed23116da6a496f873182c31284a428d040b37885524e9b53049cd99d5cc84feb00dbe77278afda8ebc9def14111b20b561f8d958e3f4aea2d492fed946245c528b16cad6ee785995ccfd7e6b7b34fe4be452a651069b2c0bbcf668bfb1dd9b99a7f30ab10d289525d61e82fd45e1ebcc11fc3d286e6096a1ee7edeee6091")] #endif [assembly: AssemblyTitle("Workshell.PE")] diff --git a/tests/Workshell.PE.Tests/DOSHeaderTests.cs b/tests/Workshell.PE.Tests/DOSHeaderTests.cs index b3a33c7..643f57d 100644 --- a/tests/Workshell.PE.Tests/DOSHeaderTests.cs +++ b/tests/Workshell.PE.Tests/DOSHeaderTests.cs @@ -13,7 +13,7 @@ public sealed class DOSHeaderTests [Test] public void DOSHeader_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -28,7 +28,7 @@ public void DOSHeader_Is_Not_Null() [TestCase("nativetest.x64.dll", 0x0050)] public void Bytes_On_Last_Page_Of_File_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -45,7 +45,7 @@ public void Bytes_On_Last_Page_Of_File_Is_Correct(string fileName, int expectedV [TestCase("nativetest.x64.dll", 0x0040)] public void File_Address_Relocation_Table_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -62,7 +62,7 @@ public void File_Address_Relocation_Table_Is_Correct(string fileName, int expect [TestCase("nativetest.x64.dll", 0x00000100)] public void File_Address_New_Header_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/DataDirectoryTests.cs b/tests/Workshell.PE.Tests/DataDirectoryTests.cs index fce3b4f..8c691f6 100644 --- a/tests/Workshell.PE.Tests/DataDirectoryTests.cs +++ b/tests/Workshell.PE.Tests/DataDirectoryTests.cs @@ -14,7 +14,7 @@ public sealed class DataDirectoryTests [Test] public void DataDirectory_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -25,7 +25,7 @@ public void DataDirectory_Is_Not_Null() [Test] public void DataDirectory_Is_Not_Empty() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -186,7 +186,7 @@ public void DataDirectory_CLR_Exists_Or_Not(string fileName, bool expectedValue) [Test] public void DataDirectory_ExportTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -201,7 +201,7 @@ public void DataDirectory_ExportTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_ImportTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -216,7 +216,7 @@ public void DataDirectory_ImportTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_ResourceTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -231,7 +231,7 @@ public void DataDirectory_ResourceTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_ExceptionTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -246,7 +246,7 @@ public void DataDirectory_ExceptionTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_RelocationTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -261,7 +261,7 @@ public void DataDirectory_RelocationTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_DebugDirectory_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -276,7 +276,7 @@ public void DataDirectory_DebugDirectory_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_ImportAddressTable_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -291,7 +291,7 @@ public void DataDirectory_ImportAddressTable_RVA_And_Size_Is_Correct() [Test] public void DataDirectory_DelayImportDescriptors_RVA_And_Size_Is_Correct() { - var file = Utils.GetFileFromResources("nativetest.x64.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -305,7 +305,7 @@ public void DataDirectory_DelayImportDescriptors_RVA_And_Size_Is_Correct() private static void DataDirectory_Exists(string fileName, DataDirectoryType type, bool expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/FileHeaderTests.cs b/tests/Workshell.PE.Tests/FileHeaderTests.cs index dc3240d..c9671de 100644 --- a/tests/Workshell.PE.Tests/FileHeaderTests.cs +++ b/tests/Workshell.PE.Tests/FileHeaderTests.cs @@ -13,7 +13,7 @@ public sealed class FileHeaderTests [Test] public void FileHeader_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -28,7 +28,7 @@ public void FileHeader_Is_Not_Null() [TestCase("nativetest.x64.dll", 0x8664)] public void Machine_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -45,7 +45,7 @@ public void Machine_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x000B)] public void NumberOfSections_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -62,7 +62,7 @@ public void NumberOfSections_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x5DC4AD3D)] public void TimeDateStamp_Is_Correct(string fileName, long expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -79,7 +79,7 @@ public void TimeDateStamp_Is_Correct(string fileName, long expectedValue) [TestCase("nativetest.x64.dll", 0x00F0)] public void SizeOfOptionalHeader_Is_Correct(string fileName, long expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -96,7 +96,7 @@ public void SizeOfOptionalHeader_Is_Correct(string fileName, long expectedValue) [TestCase("nativetest.x64.dll", 0x2022)] public void Characteristics_Is_Correct(string fileName, long expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/GeneralTests.cs b/tests/Workshell.PE.Tests/GeneralTests.cs index 63cf263..efa41e1 100644 --- a/tests/Workshell.PE.Tests/GeneralTests.cs +++ b/tests/Workshell.PE.Tests/GeneralTests.cs @@ -13,7 +13,7 @@ public sealed class GeneralTests [Test] public void IsValid_With_Text_File_Returns_False() { - var file = Utils.GetFileFromResources("license.txt"); + var file = TestingUtils.GetFileFromResources("license.txt"); var isValid = PortableExecutableImage.IsValid(file); isValid.Should().BeFalse(); @@ -22,7 +22,7 @@ public void IsValid_With_Text_File_Returns_False() [Test] public void IsValid_With_Executable_File_Returns_True() { - var file = Utils.GetFileFromResources("clrtest.any.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.any.dll"); var isValid = PortableExecutableImage.IsValid(file); isValid.Should().BeTrue(); @@ -31,7 +31,7 @@ public void IsValid_With_Executable_File_Returns_True() [Test] public void GetStream_Returns_Successfully() { - var file = Utils.GetFileFromResources("clrtest.any.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.any.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -44,7 +44,7 @@ public void GetStream_Returns_Successfully() [Test] public void GetCalculator_Returns_Successfully() { - var file = Utils.GetFileFromResources("clrtest.any.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.any.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -57,7 +57,7 @@ public void GetCalculator_Returns_Successfully() [Test] public void Is32Bit_With_32Bit_Image_Returns_True() { - var file = Utils.GetFileFromResources("clrtest.x86.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.x86.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -68,7 +68,7 @@ public void Is32Bit_With_32Bit_Image_Returns_True() [Test] public void Is32Bit_With_64Bit_Image_Returns_False() { - var file = Utils.GetFileFromResources("clrtest.x64.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -79,7 +79,7 @@ public void Is32Bit_With_64Bit_Image_Returns_False() [Test] public void Is64Bit_With_64Bit_Image_Returns_True() { - var file = Utils.GetFileFromResources("clrtest.x64.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.x64.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -90,7 +90,7 @@ public void Is64Bit_With_64Bit_Image_Returns_True() [Test] public void Is64Bit_With_32Bit_Image_Returns_False() { - var file = Utils.GetFileFromResources("clrtest.x86.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.x86.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -101,7 +101,7 @@ public void Is64Bit_With_32Bit_Image_Returns_False() [Test] public void IsCLR_With_CLR_Image_Returns_True() { - var file = Utils.GetFileFromResources("clrtest.any.dll"); + var file = TestingUtils.GetFileFromResources("clrtest.any.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -112,7 +112,7 @@ public void IsCLR_With_CLR_Image_Returns_True() [Test] public void IsCLR_With_Native_Image_Returns_False() { - var file = Utils.GetFileFromResources("nativetest.x86.dll"); + var file = TestingUtils.GetFileFromResources("nativetest.x86.dll"); using (var image = PortableExecutableImage.FromStream(file)) { @@ -123,7 +123,7 @@ public void IsCLR_With_Native_Image_Returns_False() [Test] public void IsSigned_Returns_False() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -134,7 +134,7 @@ public void IsSigned_Returns_False() [Test] public void DOSStub_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/LocationCalculatorTests.cs b/tests/Workshell.PE.Tests/LocationCalculatorTests.cs new file mode 100644 index 0000000..be45cc0 --- /dev/null +++ b/tests/Workshell.PE.Tests/LocationCalculatorTests.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Workshell.PE.Tests +{ + public sealed class LocationCalculatorTests + { + } +} diff --git a/tests/Workshell.PE.Tests/NTHeadersTests.cs b/tests/Workshell.PE.Tests/NTHeadersTests.cs index dd4fada..0b2dc81 100644 --- a/tests/Workshell.PE.Tests/NTHeadersTests.cs +++ b/tests/Workshell.PE.Tests/NTHeadersTests.cs @@ -13,7 +13,7 @@ public sealed class NTHeadersTests [Test] public void NTHeaders_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/OptionalHeaderTests.cs b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs index 7f47640..cd3d8c1 100644 --- a/tests/Workshell.PE.Tests/OptionalHeaderTests.cs +++ b/tests/Workshell.PE.Tests/OptionalHeaderTests.cs @@ -13,7 +13,7 @@ public sealed class OptionalHeaderTests [Test] public void OptionalHeader_Is_Not_Null() { - var file = Utils.GetFileFromResources(Utils.GetRandomTestFilename()); + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); using (var image = PortableExecutableImage.FromStream(file)) { @@ -28,7 +28,7 @@ public void OptionalHeader_Is_Not_Null() [TestCase("nativetest.x64.dll", typeof(OptionalHeader64))] public void Type_Is_Correct(string fileName, Type type) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -45,7 +45,7 @@ public void Type_Is_Correct(string fileName, Type type) [TestCase("nativetest.x64.dll", 0x020B)] public void Magic_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -62,7 +62,7 @@ public void Magic_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x08)] public void MajorLinkerVersion_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -79,7 +79,7 @@ public void MajorLinkerVersion_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x00)] public void MinorLinkerVersion_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -96,7 +96,7 @@ public void MinorLinkerVersion_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x0000C800)] public void SizeOfCode_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -113,7 +113,7 @@ public void SizeOfCode_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x0000CE10)] public void AddressOfEntryPoint_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -130,7 +130,7 @@ public void AddressOfEntryPoint_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x00001000)] public void BaseOfCode_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -147,7 +147,7 @@ public void BaseOfCode_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x00000000)] public void BaseOfData_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -164,7 +164,7 @@ public void BaseOfData_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x0000000000400000UL)] public void ImageBase_Is_Correct(string fileName, ulong expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -181,7 +181,7 @@ public void ImageBase_Is_Correct(string fileName, ulong expectedValue) [TestCase("nativetest.x64.dll", 0x00001000U)] public void SectionAlignment_Is_Correct(string fileName, uint expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -198,7 +198,7 @@ public void SectionAlignment_Is_Correct(string fileName, uint expectedValue) [TestCase("nativetest.x64.dll", 0x00000200U)] public void FileAlignment_Is_Correct(string fileName, uint expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -215,7 +215,7 @@ public void FileAlignment_Is_Correct(string fileName, uint expectedValue) [TestCase("nativetest.x64.dll", 0x00054000U)] public void SizeOfImage_Is_Correct(string fileName, uint expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -232,7 +232,7 @@ public void SizeOfImage_Is_Correct(string fileName, uint expectedValue) [TestCase("nativetest.x64.dll", 0x00000400U)] public void SizeOfHeaders_Is_Correct(string fileName, uint expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -249,7 +249,7 @@ public void SizeOfHeaders_Is_Correct(string fileName, uint expectedValue) [TestCase("nativetest.x64.dll", 0x0002)] public void Subsystem_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -266,7 +266,7 @@ public void Subsystem_Is_Correct(string fileName, int expectedValue) [TestCase("nativetest.x64.dll", 0x0000)] public void DllCharacteristics_Is_Correct(string fileName, int expectedValue) { - var file = Utils.GetFileFromResources(fileName); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { @@ -279,8 +279,8 @@ public void DllCharacteristics_Is_Correct(string fileName, int expectedValue) [Test] public void NumberOfRVA_Is_Correct() { - var fileName = Utils.GetRandomTestFilename(); - var file = Utils.GetFileFromResources(fileName); + var fileName = TestingUtils.GetRandomTestFilename(); + var file = TestingUtils.GetFileFromResources(fileName); using (var image = PortableExecutableImage.FromStream(file)) { diff --git a/tests/Workshell.PE.Tests/SectionTableTests.cs b/tests/Workshell.PE.Tests/SectionTableTests.cs new file mode 100644 index 0000000..5b9ff51 --- /dev/null +++ b/tests/Workshell.PE.Tests/SectionTableTests.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class SectionTableTests + { + [Test] + public void SectionTable_Is_Not_Null() + { + var file = TestingUtils.GetFileFromResources(TestingUtils.GetRandomTestFilename()); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.SectionTable.Should().NotBeNull(); + } + } + + [TestCase("clrtest.any.dll", new [] { ".text", ".rsrc", ".reloc" })] + [TestCase("clrtest.x86.dll", new [] { ".text", ".rsrc", ".reloc" })] + [TestCase("clrtest.x64.dll", new [] { ".text", ".rsrc" })] + [TestCase("nativetest.x86.dll", new [] { ".text", ".itext", ".data", ".bss", ".idata", ".didata", ".edata", ".rdata", ".reloc", ".rsrc", ".debug" })] + [TestCase("nativetest.x64.dll", new[] { ".text", ".data", ".bss", ".idata", ".didata", ".edata", ".rdata", ".reloc", ".pdata", ".rsrc", ".debug" })] + public void SectionTable_Is_Has_Correct_Sections_Count(string fileName, string[] expectedSections) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.SectionTable.Count.Should().Be(expectedSections.Length); + } + } + + [TestCase("clrtest.any.dll", new[] { ".text", ".rsrc", ".reloc" })] + [TestCase("clrtest.x86.dll", new[] { ".text", ".rsrc", ".reloc" })] + [TestCase("clrtest.x64.dll", new[] { ".text", ".rsrc" })] + [TestCase("nativetest.x86.dll", new[] { ".text", ".itext", ".data", ".bss", ".idata", ".didata", ".edata", ".rdata", ".reloc", ".rsrc", ".debug" })] + [TestCase("nativetest.x64.dll", new[] { ".text", ".data", ".bss", ".idata", ".didata", ".edata", ".rdata", ".reloc", ".pdata", ".rsrc", ".debug" })] + public void SectionTable_Is_Has_Expected_Sections(string fileName, string[] expectedSections) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var sections = image.SectionTable.Select(s => s.Name) + .OrderBy(s => s) + .ToArray(); + var sortedExpectedSections = expectedSections.OrderBy(s => s) + .ToArray(); + + sections.Should().BeEquivalentTo(sortedExpectedSections); + } + } + + [TestCase(".text", 0x00007DC0U, 0x00001000U, 0x00007E00U, 0x00000400U, 0x60000020U)] + [TestCase(".itext", 0x00000100U, 0x00009000U, 0x00000200U, 0x00008200U, 0x60000020U)] + [TestCase(".data", 0x0000083CU, 0x0000A000U, 0x00000A00U, 0x00008400U, 0xC0000040U)] + [TestCase(".bss", 0x0000358CU, 0x0000B000U, 0x00000000U, 0x00000000U, 0xC0000000U)] + [TestCase(".idata", 0x000003F0U, 0x0000F000U, 0x00000400U, 0x00008E00U, 0xC0000040U)] + [TestCase(".didata", 0x00000124U, 0x00010000U, 0x00000200U, 0x00009200U, 0xC0000040U)] + [TestCase(".edata", 0x0000008FU, 0x00011000U, 0x00000200U, 0x00009400U, 0x40000040U)] + [TestCase(".rdata", 0x00000045U, 0x00012000U, 0x00000200U, 0x00009600U, 0x40000040U)] + [TestCase(".reloc", 0x00000988U, 0x00013000U, 0x00000A00U, 0x00009800U, 0x42000040U)] + [TestCase(".rsrc", 0x00000400U, 0x00014000U, 0x00000400U, 0x0000A200U, 0x40000040U)] + [TestCase(".debug", 0x00030DB0U, 0x00015000U, 0x0030DB0U, 0x0000A600U, 0x40000040U)] + public void SectionTable_Entry_Has_Expected_Values(string sectionName, uint virtualSize, uint rva, uint sizeRaw, uint pointerRaw, uint characteristics) + { + var file = TestingUtils.GetFileFromResources("nativetest.x86.dll"); + + using (var image = PortableExecutableImage.FromStream(file)) + { + var section = image.SectionTable.FirstOrDefault(s => string.Compare(sectionName, s.Name, StringComparison.OrdinalIgnoreCase) == 0); + + section.Should().NotBeNull(); + section.VirtualSizeOrPhysicalAddress.Should().Be(virtualSize); + section.VirtualAddress.Should().Be(rva); + section.SizeOfRawData.Should().Be(sizeRaw); + section.PointerToRawData.Should().Be(pointerRaw); + section.Characteristics.Should().Be(characteristics); + } + } + } +} diff --git a/tests/Workshell.PE.Tests/SectionTests.cs b/tests/Workshell.PE.Tests/SectionTests.cs new file mode 100644 index 0000000..5aaddab --- /dev/null +++ b/tests/Workshell.PE.Tests/SectionTests.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class SectionTests + { + [TestCase("clrtest.any.dll")] + [TestCase("clrtest.x86.dll")] + [TestCase("clrtest.x64.dll")] + [TestCase("nativetest.x86.dll")] + [TestCase("nativetest.x64.dll")] + public void Sections_Is_Not_Null(string fileName) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Sections.Should().NotBeNull(); + } + } + + [TestCase("clrtest.any.dll")] + [TestCase("clrtest.x86.dll")] + [TestCase("clrtest.x64.dll")] + [TestCase("nativetest.x86.dll")] + [TestCase("nativetest.x64.dll")] + public void Sections_Has_Expected_Count(string fileName) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + image.Sections.Count.Should().Be(image.SectionTable.Count); + } + } + + [TestCase("clrtest.any.dll")] + [TestCase("clrtest.x86.dll")] + [TestCase("clrtest.x64.dll")] + [TestCase("nativetest.x86.dll")] + [TestCase("nativetest.x64.dll")] + public void Section_Has_Expected_Offset(string fileName) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + foreach (var section in image.Sections) + { + section.Location.FileOffset.Should().Be(section.TableEntry.PointerToRawData); + } + } + } + + [TestCase("clrtest.any.dll")] + [TestCase("clrtest.x86.dll")] + [TestCase("clrtest.x64.dll")] + [TestCase("nativetest.x86.dll")] + [TestCase("nativetest.x64.dll")] + public void Section_Has_Expected_Size(string fileName) + { + var file = TestingUtils.GetFileFromResources(fileName); + + using (var image = PortableExecutableImage.FromStream(file)) + { + foreach (var section in image.Sections) + { + var buffer = section.GetBytes(); + + buffer.LongLength.Should().Be(Convert.ToInt64(section.TableEntry.SizeOfRawData)); + } + } + } + } +} diff --git a/tests/Workshell.PE.Tests/Utils.cs b/tests/Workshell.PE.Tests/TestingUtils.cs similarity index 92% rename from tests/Workshell.PE.Tests/Utils.cs rename to tests/Workshell.PE.Tests/TestingUtils.cs index ded12c4..19b08bb 100644 --- a/tests/Workshell.PE.Tests/Utils.cs +++ b/tests/Workshell.PE.Tests/TestingUtils.cs @@ -6,7 +6,7 @@ namespace Workshell.PE.Tests { - internal static class Utils + internal static class TestingUtils { private static readonly string[] _testFilenames = new string[] { diff --git a/tests/Workshell.PE.Tests/UtilsTests.cs b/tests/Workshell.PE.Tests/UtilsTests.cs new file mode 100644 index 0000000..49f02a0 --- /dev/null +++ b/tests/Workshell.PE.Tests/UtilsTests.cs @@ -0,0 +1,265 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +using FluentAssertions; +using NUnit.Framework; + +namespace Workshell.PE.Tests +{ + [TestFixture] + public sealed class UtilsTests + { + [Test] + public void SizeOf_Returns_Correct_Size() + { + var output = Utils.SizeOf(); + + output.Should().Be(sizeof(uint)); + } + + [Test] + public void Read_Returns_Correct_Result() + { + var input = 0x1000U; + var bytes = BitConverter.GetBytes(input); + var output = Utils.Read(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadByte_Returns_Correct_Result() + { + byte input = 0x21; + var output = Utils.ReadByte(new byte[] {0x00, 0x01, 0x03, 0x07, 0x21, 0x15}, 4); + + output.Should().Be(input); + } + + [Test] + public void ReadInt16_Returns_Correct_Result() + { + short input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadInt16(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadInt32_Returns_Correct_Result() + { + int input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadInt32(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadInt64_Returns_Correct_Result() + { + long input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadInt64(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadUInt16_Returns_Correct_Result() + { + ushort input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadUInt16(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadUInt32_Returns_Correct_Result() + { + uint input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadUInt32(bytes); + + output.Should().Be(input); + } + + [Test] + public void ReadUInt64_Returns_Correct_Result() + { + ulong input = 32000; + var bytes = BitConverter.GetBytes(input); + var output = Utils.ReadUInt64(bytes); + + output.Should().Be(input); + } + + [Test] + public void Write_To_Stream_Succeeds() + { + using (var mem = new MemoryStream()) + { + var buffer = new byte[ushort.MaxValue]; + + using (var rng = new RNGCryptoServiceProvider()) + { + rng.GetBytes(buffer); + } + + mem.Write(buffer, 0, buffer.Length); + + mem.Length.Should().Be(ushort.MaxValue); + } + } + + [Test] + public void Write_Structure_To_Buffer_Succeeds() + { + uint input = 0x1000; + var buffer = new byte[sizeof(uint)]; + + Utils.Write(input, buffer, 0, sizeof(uint)); + + var output = BitConverter.ToUInt32(buffer, 0); + + output.Should().Be(input); + } + + [Test] + public void Write_Structure_To_Stream_Succeeds() + { + using (var mem = new MemoryStream()) + { + uint input = 0x1000; + + Utils.Write(input, mem, sizeof(uint)); + + var output = BitConverter.ToUInt32(mem.ToArray(), 0); + + output.Should().Be(input); + } + } + + [TestCase(0U, "1970-01-01T00:00:00")] + [TestCase(1573219373U, "2019-11-08T13:22:53")] + public void ConvertTimeDateStamp_Returns_Correct_DateTime(uint input, string expectedValue) + { + var parsedExpectedValue = DateTime.ParseExact(expectedValue, "yyyy-MM-ddTHH:mm:ss", null); + var output = Utils.ConvertTimeDateStamp(input); + + output.Should().Be(parsedExpectedValue); + } + + [TestCase((byte)7, true)] + [TestCase((sbyte)-21, true)] + [TestCase((ushort)7, true)] + [TestCase((short)-21, true)] + [TestCase((uint)7, true)] + [TestCase((int)-21, true)] + [TestCase((ulong)7, true)] + [TestCase((long)-21, true)] + [TestCase((float)7.21, true)] + [TestCase((double)-21.7, true)] + [TestCase("Not numeric", false)] + [TestCase(true, false)] + public void IsNumeric_Returns_Correct_For_Given_Value(object input, bool expectedOutput) + { + var output = Utils.IsNumeric(input); + + output.Should().Be(expectedOutput); + } + + [TestCase((byte)7, "0x07")] + [TestCase((sbyte)-21, "0xEB")] + [TestCase((ushort)7, "0x0007")] + [TestCase((short)-21, "0xFFEB")] + [TestCase((uint)7, "0x00000007")] + [TestCase((int)-21, "0xFFFFFFEB")] + [TestCase((ulong)7, "0x0000000000000007")] + [TestCase((long)-21, "0xFFFFFFFFFFFFFFEB")] + public void IntToHex_Returns_Correct_For_Given_Value(object input, string expectedOutput) + { + var output = Utils.IntToHex(input); + + output.Should().Be(expectedOutput); + } + + [TestCase((float)7.21)] + [TestCase((double)-21.7)] + [TestCase("Not numeric")] + [TestCase(true)] + public void IntToHex_Throws_Exception_For_Invalid_Value(object input) + { + Assert.Throws(() => Utils.IntToHex(input)); + } + + [Test] + public void HiByte_Returns_Correct_Value() + { + ushort input = 0x8664; + var output = Utils.HiByte(input); + + output.Should().Be(0x86); + } + + [Test] + public void LoByte_Returns_Correct_Value() + { + ushort input = 0x8664; + var output = Utils.LoByte(input); + + output.Should().Be(0x64); + } + + [Test] + public void HiWord_Returns_Correct_Value() + { + uint input = 0x12344321; + var output = Utils.HiWord(input); + + output.Should().Be(0x1234); + } + + [Test] + public void LoWord_Returns_Correct_Value() + { + uint input = 0x12344321; + var output = Utils.LoWord(input); + + output.Should().Be(0x4321); + } + + [Test] + public void HiDWord_Returns_Correct_Value() + { + ulong input = 0x1234432156788765; + var output = Utils.HiDWord(input); + + output.Should().Be(0x12344321); + } + + [Test] + public void LoDWord_Returns_Correct_Value() + { + ulong input = 0x1234432156788765; + var output = Utils.LoDWord(input); + + output.Should().Be(0x56788765); + } + + [Test] + public void MakeUInt64_Returns_Correct_Value() + { + var inputMS = 0x12344321U; + var inputLS = 0x56788765U; + var output = Utils.MakeUInt64(inputMS, inputLS); + + output.Should().Be(0x1234432156788765); + } + } +} diff --git a/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj index 20cf79b..ca43165 100644 --- a/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj +++ b/tests/Workshell.PE.Tests/Workshell.PE.Tests.csproj @@ -1,9 +1,14 @@ - + netcoreapp2.0 - false + false + Workshell.PE.snk + + + + TRACE;SIGNED From 687072889324c460c72850c3e36bddb25a743d3d Mon Sep 17 00:00:00 2001 From: Lloyd Kinsella Date: Fri, 8 Nov 2019 15:51:43 +0000 Subject: [PATCH 8/8] Started calculator tests. --- .../LocationCalculatorTests.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/Workshell.PE.Tests/LocationCalculatorTests.cs b/tests/Workshell.PE.Tests/LocationCalculatorTests.cs index be45cc0..75242f5 100644 --- a/tests/Workshell.PE.Tests/LocationCalculatorTests.cs +++ b/tests/Workshell.PE.Tests/LocationCalculatorTests.cs @@ -2,9 +2,28 @@ using System.Collections.Generic; using System.Text; +using NUnit.Framework; + namespace Workshell.PE.Tests { + [TestFixture] public sealed class LocationCalculatorTests { + private PortableExecutableImage _image; + private LocationCalculator _calc; + + [OneTimeSetUp] + public void SetUp() + { + _image = PortableExecutableImage.FromStream(TestingUtils.GetFileFromResources("nativetest.x64.dll")); + _calc = _image.GetCalculator(); + } + + [OneTimeTearDown] + public void TearDown() + { + _calc = null; + _image.Dispose(); + } } }