/* * MSDOS_Stub.java - This file is part of the Jakstab project. * * Copyright 2007-2015 Johannes Kinder <jk@jakstab.org> * Copyright (C) 2003 The University of Arizona * * The original code for this class was taken from "MBEL: The Microsoft * Bytecode Engineering Library" and modified for use with Jakstab. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, see <http://www.gnu.org/licenses/>. */ package org.jakstab.loader.pe; import org.jakstab.loader.BinaryParseException; import org.jakstab.util.BinaryInputBuffer; /** * Ths MS-DOS stub starts a PE/COFF file. The only relevant field in this structure * is the NewFileHeaderAddress, which will be at offset 0x3C romt he start of the file. * The value here will be the file offset to the PE signature, which is followed by the PE header. * * Changed to throw a BinaryParseException for MSDOS-executables * * @author Michael Stepp * @author Johannes Kinder */ class MSDOS_Stub { private static final int MAGIC = 0x5A4D; // == 'MZ' private int Magic; // 2 bytes private byte[] data1; // 58 bytes private long NewFileHeaderAddress; // 4 bytes private byte[] data2; // (NewFileHeaderAddress-64) bytes /** * Parses an MSDOS_Stub from an input stream */ public MSDOS_Stub(BinaryInputBuffer in) throws java.io.IOException, BinaryParseException { Magic = in.readWORD(); if (Magic != MAGIC) throw new BinaryParseException("MSDOS_Stub: File does not start with magic number 0x4D5A"); data1 = new byte[58]; in.read(data1); NewFileHeaderAddress = in.readDWORD(); try { data2 = new byte[(int)(NewFileHeaderAddress - 64)]; in.read(data2); } catch (Exception e) { throw new BinaryParseException("No PE header found. MS-DOS executables are not supported."); } } /** * @return Returns the file offset of the PE signature */ public long getHeaderAddress(){ return NewFileHeaderAddress; } public void output(){ System.out.print("MSDOS_Stub:{"); System.out.print("\n Magic = 0x" + Integer.toHexString(Magic)); System.out.print("\n <data1>"); System.out.print("\n NewFileHeaderAddress = 0x" + Long.toHexString(NewFileHeaderAddress)); System.out.print("\n <data2>"); System.out.print("\n}\n"); } }