/*
* ExecutableImage.java - This file is part of the Jakstab project.
* Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
*
* 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;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import org.jakstab.asm.AbsoluteAddress;
import org.jakstab.asm.SymbolFinder;
import org.jakstab.disasm.Disassembler;
import org.jakstab.rtl.expressions.RTLMemoryLocation;
import org.jakstab.rtl.expressions.RTLNumber;
/**
* {@code ExecutableImage} provides an interface to information about the logical structure
* of a binary executable file. Virtual addresses are represented as objects of type
* {@code AbsoluteAddress} and calculated using the default base address defined by the
* image. If the image does not define a base address, a value of zero is used.
*
* Implementations usually assume that multiple executable images do not overlap and perform
* no relocation.
*/
public interface ExecutableImage {
/**
* Returns the virtual address that corresponds to a given file pointer
*
* @param fp the file pointer
* @return the virtual address
*/
public AbsoluteAddress getVirtualAddress(long fp);
/**
* Converts a virtual address into a file pointer into this image.
*
* @param va a virtual address that lies within the values of {@code getMinAddress()}
* and {@code getMaxAddress()}.
* @return A file pointer, which is an offset into the byte array returned by
* {@code getByteArray()}.
*/
public long getFilePointer(AbsoluteAddress va);
/**
* Retrieves the entry point of the executable, i.e., the address to which the operating
* system loader first transfers control. This might not be the {@code main} function, but
* initializer code by the runtime libraries.
*
* @return the virtual address of the executable's entry point.
*/
public AbsoluteAddress getEntryPoint();
/**
* Get the maximum virtual address mapped to this module.
*
* @return the maximal virtual address.
*/
public AbsoluteAddress getMaxAddress();
/**
* Get the minimal virtual address mapped to this module.
*
* @return the minimal virtual address.
*/
public AbsoluteAddress getMinAddress();
/**
* Get an iterator that iterates over all bytes that can possibly be
* code in this module.
*
* @return an iterator for all code bytes.
*/
public Iterator<AbsoluteAddress> codeBytesIterator();
/**
* Checks whether the specified virtual address is inside a code area of this executable.
*
* @param va The virtual address to check.
* @return True if the address points to a code area, false otherwise.
*/
public boolean isCodeArea(AbsoluteAddress va);
/**
* Checks whether the specified virtual address is inside an import section of this executable
* (plt for ELF, import table for PE)
*
* @param va The virtual address to check.
* @return True if the address points to a import area, false otherwise.
*/
public boolean isImportArea(AbsoluteAddress va);
/**
* Read a static memory location, i.e., the initial value of a global variable or a constant.
*
* @param m The absolute virtual address in IL syntax as an {@code RTLMemoryLocation} object.
* @return The result of the memory read as a number object of the requested bit length.
*/
public RTLNumber readMemoryLocation(RTLMemoryLocation m) throws IOException;
/**
* Determines whether the given address references read only memory. This is
* used for limiting conservative approximation of memory to actually modifiable
* parts.
*
* @param a a virtual address pointing inside the image's address space
* @return True if the address references read only memory, false otherwise
*/
public boolean isReadOnly(AbsoluteAddress a);
/**
* Returns the symbol finder for this module.
*
* @return a symbol finder
*/
public SymbolFinder getSymbolFinder();
/**
* Returns a disassembler object for this module, which can be used for disassembling individual
* instructions.
*
* @return a disassembler object, or {@code null} if no disassembler is available.
*/
public Disassembler getDisassembler();
/**
* Returns the set of unresolved symbols referenced from this module. Used for resolving
* dependencies between multiple modules.
*
* @return a set of unresolved symbols, or an empty set if it does not contain any.
*/
public Set<UnresolvedSymbol> getUnresolvedSymbols();
/**
* Returns the set of symbols exported by this module. Used for resolving dependencies
* between multiple modules.
*
* @return a set of exported symbols, or an empty set if it does not contain any.
*/
public Set<ExportedSymbol> getExportedSymbols();
/**
* Returns the file contents as an array of bytes.
*
* @return the byte array.
*/
public byte[] getByteArray();
}