/* * RawModule.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.*; import java.util.Collections; import java.util.Iterator; import java.util.Set; import org.jakstab.asm.AbsoluteAddress; import org.jakstab.asm.DummySymbolFinder; import org.jakstab.asm.SymbolFinder; import org.jakstab.disasm.Disassembler; import org.jakstab.disasm.x86.X86Disassembler; import org.jakstab.rtl.expressions.RTLMemoryLocation; import org.jakstab.rtl.expressions.RTLNumber; import org.jakstab.ssl.Architecture; import org.jakstab.util.BinaryFileInputBuffer; import org.jakstab.util.Logger; /** * @author Johannes Kinder */ public class RawModule implements ExecutableImage { private static final Logger logger = Logger.getLogger(RawModule.class); private final BinaryFileInputBuffer inBuf; private final AbsoluteAddress baseAddress; private Disassembler disassembler; public RawModule(File file, Architecture architecture) throws IOException { logger.info("Loading image as raw binary..."); InputStream inStream = new FileInputStream(file); inBuf = new BinaryFileInputBuffer(inStream); baseAddress = new AbsoluteAddress(0x0); } @Override public Disassembler getDisassembler() { if (disassembler == null) { disassembler = new X86Disassembler(inBuf); } return disassembler; } @Override public AbsoluteAddress getEntryPoint() { return baseAddress; } @Override public Set<ExportedSymbol> getExportedSymbols() { return Collections.emptySet(); } @Override public long getFilePointer(AbsoluteAddress va) { return va.getValue() - baseAddress.getValue(); } @Override public AbsoluteAddress getMaxAddress() { return new AbsoluteAddress(baseAddress.getValue() + inBuf.getSize()); } @Override public AbsoluteAddress getMinAddress() { return baseAddress; } @Override public SymbolFinder getSymbolFinder() { return DummySymbolFinder.getInstance(); } @Override public Set<UnresolvedSymbol> getUnresolvedSymbols() { return Collections.emptySet(); } @Override public AbsoluteAddress getVirtualAddress(long fp) { return new AbsoluteAddress(baseAddress.getValue() + fp); } @Override public boolean isCodeArea(AbsoluteAddress va) { return true; } @Override public boolean isReadOnly(AbsoluteAddress a) { return false; } @Override public RTLNumber readMemoryLocation(RTLMemoryLocation m) { // TODO Auto-generated method stub return null; } @Override public Iterator<AbsoluteAddress> codeBytesIterator() { throw new UnsupportedOperationException("Code iteration not yet implemented for " + this.getClass().getSimpleName() + "!"); } @Override public byte[] getByteArray() { return inBuf.getByteArray(); } @Override public boolean isImportArea(AbsoluteAddress va) { return false; } }