mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
230 lines
10 KiB
C++
230 lines
10 KiB
C++
/* ###
|
|
* IP: GHIDRA
|
|
*
|
|
* 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.
|
|
*/
|
|
/// \file loadimage.hh
|
|
/// \brief Classes and API for accessing a binary load image
|
|
|
|
#ifndef __LOADIMAGE_HH__
|
|
#define __LOADIMAGE_HH__
|
|
|
|
#include "address.hh"
|
|
|
|
namespace ghidra {
|
|
|
|
/// \brief Exception indicating data was not available
|
|
///
|
|
/// This exception is thrown when a request for load image
|
|
/// data cannot be met, usually because the requested address
|
|
/// range is not in the image.
|
|
struct DataUnavailError : public LowlevelError {
|
|
DataUnavailError(const string &s) : LowlevelError(s) {} ///< Instantiate with an explanatory string
|
|
};
|
|
|
|
/// \brief A record indicating a function symbol
|
|
///
|
|
/// This is a lightweight object holding the Address and name of a function
|
|
struct LoadImageFunc {
|
|
Address address; ///< Start of function
|
|
string name; ///< Name of function
|
|
};
|
|
|
|
/// \brief A record describing a section bytes in the executable
|
|
///
|
|
/// A lightweight object specifying the location and size of the section and basic properties
|
|
struct LoadImageSection {
|
|
/// Boolean properties a section might have
|
|
enum {
|
|
unalloc = 1, ///< Not allocated in memory (debug info)
|
|
noload = 2, ///< uninitialized section
|
|
code = 4, ///< code only
|
|
data = 8, ///< data only
|
|
readonly = 16 ///< read only section
|
|
};
|
|
Address address; ///< Starting address of section
|
|
uintb size; ///< Number of bytes in section
|
|
uint4 flags; ///< Properties of the section
|
|
};
|
|
|
|
/// \brief An interface into a particular binary executable image
|
|
///
|
|
/// This class provides the abstraction needed by the decompiler
|
|
/// for the numerous load file formats used to encode binary
|
|
/// executables. The data encoding the machine instructions
|
|
/// for the executable can be accessed via the addresses where
|
|
/// that data would be loaded into RAM.
|
|
/// Properties other than the main data and instructions of the
|
|
/// binary are not supposed to repeatedly queried through this
|
|
/// interface. This information is intended to be read from
|
|
/// this class exactly once, during initialization, and used to
|
|
/// populate the main decompiler database. This class currently
|
|
/// has only rudimentary support for accessing such properties.
|
|
class LoadImage {
|
|
protected:
|
|
string filename; ///< Name of the loadimage
|
|
public:
|
|
LoadImage(const string &f); ///< LoadImage constructor
|
|
virtual ~LoadImage(void); ///< LoadImage destructor
|
|
const string &getFileName(void) const; ///< Get the name of the LoadImage
|
|
virtual void loadFill(uint1 *ptr,int4 size,const Address &addr)=0; ///< Get data from the LoadImage
|
|
virtual void openSymbols(void) const; ///< Prepare to read symbols
|
|
virtual void closeSymbols(void) const; ///< Stop reading symbols
|
|
virtual bool getNextSymbol(LoadImageFunc &record) const; ///< Get the next symbol record
|
|
virtual void openSectionInfo(void) const; ///< Prepare to read section info
|
|
virtual void closeSectionInfo(void) const; ///< Stop reading section info
|
|
virtual bool getNextSection(LoadImageSection &sec) const; ///< Get info on the next section
|
|
virtual void getReadonly(RangeList &list) const; ///< Return list of \e readonly address ranges
|
|
virtual string getArchType(void) const=0; ///< Get a string indicating the architecture type
|
|
virtual void adjustVma(long adjust)=0; ///< Adjust load addresses with a global offset
|
|
uint1 *load(int4 size,const Address &addr); ///< Load a chunk of image
|
|
};
|
|
|
|
/// \brief A simple raw binary loadimage
|
|
///
|
|
/// This is probably the simplest loadimage. Bytes from the image are read directly from a file stream.
|
|
/// The address associated with each byte is determined by a single value, the vma, which is the address
|
|
/// of the first byte in the file. No symbols or sections are supported
|
|
class RawLoadImage : public LoadImage {
|
|
uintb vma; ///< Address of first byte in the file
|
|
ifstream *thefile; ///< Main file stream for image
|
|
uintb filesize; ///< Total number of bytes in the loadimage/file
|
|
AddrSpace *spaceid; ///< Address space that the file bytes are mapped to
|
|
public:
|
|
RawLoadImage(const string &f); ///< RawLoadImage constructor
|
|
void attachToSpace(AddrSpace *id) { spaceid = id; } ///< Attach the raw image to a particular space
|
|
void open(void); ///< Open the raw file for reading
|
|
virtual ~RawLoadImage(void); ///< RawLoadImage destructor
|
|
virtual void loadFill(uint1 *ptr,int4 size,const Address &addr);
|
|
virtual string getArchType(void) const;
|
|
virtual void adjustVma(long adjust);
|
|
};
|
|
|
|
/// For the base class there is no relevant initialization except
|
|
/// the name of the image.
|
|
/// \param f is the name of the image
|
|
inline LoadImage::LoadImage(const string &f) {
|
|
filename = f;
|
|
}
|
|
|
|
/// The destructor for the load image object.
|
|
inline LoadImage::~LoadImage(void) {
|
|
}
|
|
|
|
/// The loadimage is usually associated with a file. This routine
|
|
/// retrieves the name as a string.
|
|
/// \return the name of the image
|
|
inline const string &LoadImage::getFileName(void) const {
|
|
return filename;
|
|
}
|
|
|
|
/// This routine should read in and parse any symbol information
|
|
/// that the load image contains about executable. Once this
|
|
/// method is called, individual symbol records are read out
|
|
/// using the getNextSymbol() method.
|
|
inline void LoadImage::openSymbols(void) const {
|
|
}
|
|
|
|
/// Once all the symbol information has been read out from the
|
|
/// load image via the openSymbols() and getNextSymbol() calls,
|
|
/// the application should call this method to free up resources
|
|
/// used in parsing the symbol information.
|
|
inline void LoadImage::closeSymbols(void) const {
|
|
}
|
|
|
|
/// This method is used to read out an individual symbol record,
|
|
/// LoadImageFunc, from the load image. Right now, the only
|
|
/// information that can be read out are function starts and the
|
|
/// associated function name. This method can be called repeatedly
|
|
/// to iterate through all the symbols, until it returns \b false.
|
|
/// This indicates the end of the symbols.
|
|
/// \param record is a reference to the symbol record to be filled in
|
|
/// \return \b true if there are more records to read
|
|
inline bool LoadImage::getNextSymbol(LoadImageFunc &record) const {
|
|
return false;
|
|
}
|
|
|
|
/// This method initializes iteration over all the sections of
|
|
/// bytes that are mapped by the load image. Once this is called,
|
|
/// information on individual sections should be read out with
|
|
/// the getNextSection() method.
|
|
inline void LoadImage::openSectionInfo(void) const {
|
|
}
|
|
|
|
/// Once all the section information is read from the load image
|
|
/// using the getNextSection() method, this method should be
|
|
/// called to free up any resources used in parsing the section info.
|
|
inline void LoadImage::closeSectionInfo(void) const {
|
|
}
|
|
|
|
/// This method is used to read out a record that describes a
|
|
/// single section of bytes mapped by the load image. This
|
|
/// method can be called repeatedly until it returns \b false,
|
|
/// to get info on additional sections.
|
|
/// \param record is a reference to the info record to be filled in
|
|
/// \return \b true if there are more records to read
|
|
inline bool LoadImage::getNextSection(LoadImageSection &record) const {
|
|
return false;
|
|
}
|
|
|
|
/// This method should read out information about \e all
|
|
/// address ranges within the load image that are known to be
|
|
/// \b readonly. This method is intended to be called only
|
|
/// once, so all information should be written to the passed
|
|
/// RangeList object.
|
|
/// \param list is where readonly info will get put
|
|
inline void LoadImage::getReadonly(RangeList &list) const {
|
|
}
|
|
|
|
/// \fn void LoadImage::adjustVma(long adjust)
|
|
/// Most load image formats automatically encode information
|
|
/// about the true loading address(es) for the data in the image.
|
|
/// But if this is missing or incorrect, this routine can be
|
|
/// used to make a global adjustment to the load address. Only
|
|
/// one adjustment is made across \e all addresses in the image.
|
|
/// The offset passed to this method is added to the stored
|
|
/// or default value for any address queried in the image.
|
|
/// This is most often used in a \e raw binary file format. In
|
|
/// this case, the entire executable file is intended to be
|
|
/// read straight into RAM, as one contiguous chunk, in order to
|
|
/// be executed. In the absence of any other info, the first
|
|
/// byte of the image file is loaded at offset 0. This method
|
|
/// then would adjust the load address of the first byte.
|
|
/// \param adjust is the offset amount to be added to default values
|
|
|
|
/// \fn string LoadImage::getArchType(void) const
|
|
/// The load image class is intended to be a generic front-end
|
|
/// to the large variety of load formats in use. This method
|
|
/// should return a string that identifies the particular
|
|
/// architecture this particular image is intended to run on.
|
|
/// It is currently the responsibility of any derived LoadImage
|
|
/// class to establish a format for this string, but it should
|
|
/// generally contain some indication of the operating system
|
|
/// and the processor.
|
|
/// \return the identifier string
|
|
|
|
/// \fn void LoadImage::loadFill(uint1 *ptr,int4 size,const Address &addr)
|
|
/// This is the \e core routine of a LoadImage. Given a particular
|
|
/// address range, this routine retrieves the exact byte values
|
|
/// that are stored at that address when the executable is loaded
|
|
/// into RAM. The caller must supply a pre-allocated array
|
|
/// of bytes where the returned bytes should be stored. If the
|
|
/// requested address range does not exist in the image, or
|
|
/// otherwise can't be retrieved, this method throws an
|
|
/// DataUnavailError exception.
|
|
/// \param ptr points to where the resulting bytes will be stored
|
|
/// \param size is the number of bytes to retrieve from the image
|
|
/// \param addr is the starting address of the bytes to retrieve
|
|
|
|
} // End namespace ghidra
|
|
#endif
|