/* * Copyright (C) 2015-2017 PÂRIS Quentin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.phoenicis.win32.pe; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.io.IOException; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; public class PEReaderTest { private PEFile peFile; @Before public void setUp() throws IOException { PEReader peReader = new PEReader(); peFile = peReader.parseExecutable(this.getClass().getResourceAsStream("winecfg.exe")); } @Test public void testMagicNumber() { assertEquals(0x5A4D, peFile.imageDOSHeader.eMagic.get()); } @Test public void testPeHeaderSignature() { assertEquals(0x4550, peFile.imageNTHeaders.signature.get()); } @Test public void testMachine() { assertEquals(0x14C, peFile.imageNTHeaders.fileHeader.machine.get()); } @Test public void testNumberOfSections() { assertEquals(3, peFile.imageNTHeaders.fileHeader.numberOfSections.get()); } @Test public void testNumberOfSymbols() { assertEquals(0, peFile.imageNTHeaders.fileHeader.numberOfSymbols.get()); } @Test public void testSizeOfOptionalHeader() { assertEquals(224, peFile.imageNTHeaders.fileHeader.sizeOfOptionalHeader.get()); } @Test public void testCharacteristics() { assertEquals(0x102, peFile.imageNTHeaders.fileHeader.characteristics.get()); } @Test public void testOptionalHeaderMagic() { assertEquals(0x10B, peFile.imageNTHeaders.optionalHeader.magic.get()); } @Test public void testOptionalHeaderLinkerVersion() { assertEquals(0, peFile.imageNTHeaders.optionalHeader.minorLinkerVersion.intValue()); assertEquals(0, peFile.imageNTHeaders.optionalHeader.minorLinkerVersion.intValue()); } @Test public void testOptionalHeaderSizeOfCode() { assertEquals(8, peFile.imageNTHeaders.optionalHeader.sizeOfCode.get()); } @Test public void testOptionalHeaderSizeOfInitializedData() { assertEquals(0, peFile.imageNTHeaders.optionalHeader.sizeOfInitializedData.get()); } @Test public void testOptionalHeaderSizeOfUninitializedData() { assertEquals(0, peFile.imageNTHeaders.optionalHeader.sizeOfUninitializedData.get()); } @Test public void testOptionalHeaderBaseOfCode() { assertEquals(0x1000, peFile.imageNTHeaders.optionalHeader.baseOfCode.get()); } @Test public void testOptionalHeaderImageBase() { assertEquals(0x10000000, peFile.imageNTHeaders.optionalHeader.imageBase.getUnsignedValue()); } @Test public void testOptionalHeaderBaseOfData() { assertEquals(0, peFile.imageNTHeaders.optionalHeader.baseOfData.get()); } @Test public void testOptionalHeaderSizeOfHeaders() { assertEquals(512, peFile.imageNTHeaders.optionalHeader.sizeOfHeaders.getUnsignedValue()); } @Test public void testOptionalHeaderSubsystem() { assertEquals(2, peFile.imageNTHeaders.optionalHeader.subsystem.getUnsignedValue()); } @Test public void testOptionalHeaderDllCharacteristics() { assertEquals(0x100, peFile.imageNTHeaders.optionalHeader.dllCharacteristics.get()); } @Test public void testNumberOfDataDirectoryInOptionalHeader() { assertEquals(16, peFile.imageNTHeaders.optionalHeader.dataDirectory.length); } @Test public void testRealModeStubProgramSize() { assertEquals(96, peFile.imageDOSHeader.eLfanew.intValue()); } @Test public void testSectionHeaderNames() { Assert.assertEquals(".text\u0000\u0000\u0000", new String(peFile.sectionHeaders[0].name)); Assert.assertEquals(".reloc\u0000\u0000", new String(peFile.sectionHeaders[1].name)); Assert.assertEquals(".rsrc\u0000\u0000\u0000", new String(peFile.sectionHeaders[2].name)); } @Test public void testRsrcSizeOfRawData() { assertEquals(0xB8038, peFile.sectionHeaders[2].sizeOfRawData.get()); } @Test public void testRsrcVirtualAddress() { assertEquals(0x00003000, peFile.sectionHeaders[2].virtualAddress.get()); } @Test public void testVirtuaSize() { assertEquals(0x000B9000, peFile.sectionHeaders[2].physicalAddressOrVirtualSize.get()); } @Test public void testCharacteristic() { assertEquals(0x40000040, peFile.sectionHeaders[2].characteristics.get()); } @Test public void testResourceSection() { assertEquals(1, peFile.resourceSection.imageResourceDirectory.numberOfNamedEntries.getUnsignedValue()); assertEquals(4, peFile.resourceSection.imageResourceDirectory.numberOfIdEntries.getUnsignedValue()); } @Test public void testRealModeStubProgram() { assertArrayEquals(java.util.Arrays.copyOf("Wine placeholder DLL".getBytes(), 32), peFile.realModeStubProgram); } }