net.jsign.pe.PEFileTest.java Source code

Java tutorial

Introduction

Here is the source code for net.jsign.pe.PEFileTest.java

Source

/**
 * Copyright 2012 Emmanuel Bourg
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.jsign.pe;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;

import junit.framework.TestCase;
import net.jsign.DigestAlgorithm;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.util.encoders.Hex;

public class PEFileTest extends TestCase {

    public void testLoad() throws Exception {
        PEFile file = new PEFile(new File("target/test-classes/wineyes.exe"));

        assertEquals(MachineType.I386, file.getMachineType());
        assertEquals(4, file.getNumberOfSections());
        assertEquals(0, file.getPointerToSymbolTable());
        assertEquals(0, file.getNumberOfSymbols());
        assertEquals(224, file.getSizeOfOptionalHeader());
        assertEquals(PEFormat.PE32, file.getFormat());
        assertEquals(24576, file.getSizeOfCode());
        assertEquals(20480, file.getSizeOfInitializedData());
        assertEquals(0, file.getSizeOfUninitializedData());
        assertEquals(0x400000, file.getImageBase());
        assertEquals(4096, file.getSectionAlignment());
        assertEquals(4096, file.getFileAlignment());
        assertEquals(4, file.getMajorOperatingSystemVersion());
        assertEquals(0, file.getMinorOperatingSystemVersion());
        assertEquals(4, file.getMajorSubsystemVersion());
        assertEquals(0, file.getMinorSubsystemVersion());
        assertEquals(0, file.getWin32VersionValue());
        assertEquals(49152, file.getSizeOfImage());
        assertEquals(4096, file.getSizeOfHeaders());
        assertEquals(Subsystem.WINDOWS_GUI, file.getSubsystem());
        assertEquals(0, file.getLoaderFlags());
        assertEquals(16, file.getNumberOfRvaAndSizes());
    }

    public void testLoadNonExecutable() throws Exception {
        try {
            new PEFile(new File("pom.xml"));
            fail("No exception thrown");
        } catch (IOException e) {
            assertEquals("Exception message", "DOS header signature not found", e.getMessage());
        }
    }

    /**
     * Attempts to open a DOS executable that isn't a Portable Executable
     */
    public void testDosExecutable() throws Exception {
        try {
            new PEFile(new File("target/test-classes/MORE.EXE")); // MORE.EXE comes from FreeDOS and is GPL licensed
            fail("No exception thrown");
        } catch (IOException e) {
            if (!e.getMessage().contains("PE signature not found as expected")) {
                throw e;
            }
        }
    }

    public void testGetSections() throws Exception {
        PEFile file = new PEFile(new File("target/test-classes/wineyes.exe"));

        List<Section> sections = file.getSections();
        assertNotNull(sections);
        assertFalse("No section found", sections.isEmpty());
        for (Section section : file.getSections()) {
            assertNotNull("null section found", section);
            assertEquals(0, section.getPointerToRelocations());
            assertEquals(0, section.getPointerToLineNumbers());
            assertEquals(0, section.getNumberOfRelocations());
            assertEquals(0, section.getNumberOfLineNumbers());
        }
    }

    public void testPrintInfo() throws Exception {
        PEFile file = new PEFile(new File("target/test-classes/wineyes.exe"));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        file.printInfo(out);

        assertNotNull(out.toString());
        assertFalse(out.toString().isEmpty());

        System.out.println(out);
    }

    public void testPadNoOp() throws Exception {
        File testFile = new File("target/test-classes/wineyes.exe");
        File testFilePadded = new File("target/test-classes/wineyes-padded.exe");
        FileUtils.copyFile(testFile, testFilePadded);

        PEFile file = new PEFile(testFilePadded);
        file.pad(8);
        file.close();

        assertEquals("Padded file size", testFile.length(), testFilePadded.length());
    }

    public void testPad() throws Exception {
        File testFile = new File("target/test-classes/wineyes.exe");
        File testFilePadded = new File("target/test-classes/wineyes-padded.exe");
        FileUtils.copyFile(testFile, testFilePadded);

        PEFile file = new PEFile(testFilePadded);
        file.pad(7);
        file.close();

        assertEquals("Padded file size", testFile.length() + 4, testFilePadded.length());
    }

    public void testComputeChecksum() throws Exception {
        PEFile file = new PEFile(new File("target/test-classes/wineyes.exe"));

        assertEquals(file.computeChecksum(), 0x0000E7F5);
    }

    public void testComputeDigest() throws Exception {
        PEFile file = new PEFile(new File("target/test-classes/wineyes.exe"));

        String sha1 = Hex.toHexString(file.computeDigest(DigestAlgorithm.SHA1));
        String sha256 = Hex.toHexString(file.computeDigest(DigestAlgorithm.SHA256));

        assertEquals("d27ec498912807ddfc4bec2be4f62c42814836f3", sha1);
        assertEquals("7bb369df020cea757619e1c1d678dbca06b638f2cc45b740b5eacfc21e76b160", sha256);
    }
}