99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
//---------------------------------------------------------------------------//
|
|
// 1100101 |_ mov #0, r4 __ //
|
|
// 11 |_ <0xb380 %5c4> / _|_ _____ ___ //
|
|
// 0110 |_ 3.50 -> 3.60 | _\ \ / _ (_-< //
|
|
// |_ base# + offset |_| /_\_\___/__/ //
|
|
//---------------------------------------------------------------------------//
|
|
// fxos/vspace: Virtual address space with loaded code and analyses
|
|
//
|
|
// This is the main structure/entry point of fxos. A virtual space emulates the
|
|
// virtual memory of the MPU and can have files loaded ("bound") at chosen
|
|
// positions. Usually, there is one virtual space for each OS being studied.
|
|
//
|
|
// Technically, each virtual space should also come with platform information,
|
|
// but currently only the MPU is specified and it's unused.
|
|
//
|
|
// Virtual spaces also centralize information related to analyses.
|
|
//---
|
|
|
|
#ifndef FXOS_VSPACE_H
|
|
#define FXOS_VSPACE_H
|
|
|
|
#include <fxos/memory.h>
|
|
#include <fxos/os.h>
|
|
#include <fxos/symbols.h>
|
|
#include <fxos/disassembly.h>
|
|
#include <fxos/AbstractMemory.h>
|
|
#include <fxos/util/Buffer.h>
|
|
#include <fxos/util/Addressable.h>
|
|
|
|
#include <optional>
|
|
#include <vector>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
|
|
namespace FxOS {
|
|
|
|
/* A binding of a data buffer into a memory region of the target. */
|
|
struct Binding: public AbstractMemory
|
|
{
|
|
/* Constructor from data buffer. An error is raised if the buffer is
|
|
not at least of the size of the region. In this case, a new buffer
|
|
can be constructed with the required size. */
|
|
Binding(MemoryRegion region, Buffer const &buffer);
|
|
|
|
/* Targeted region, might overlap with other bindings */
|
|
MemoryRegion region;
|
|
/* Underlying buffer (copy of the original one) */
|
|
Buffer buffer;
|
|
|
|
// - AbstractMemory interface
|
|
char const *translate_dynamic(uint32_t addr, int *size) override;
|
|
};
|
|
|
|
/* A composite space where regions can be bound dynamically */
|
|
class VirtualSpace: public AbstractMemory
|
|
{
|
|
public:
|
|
/* Create an empty space with no regions */
|
|
VirtualSpace();
|
|
|
|
/* MPU used by this target, or an empty string if unspecified */
|
|
std::string mpu;
|
|
|
|
/* List of bindings (most recent first) */
|
|
std::vector<Binding> bindings;
|
|
|
|
/* Bind a buffer to a standard or custom memory region. Functions in the
|
|
library tend to assume that bindings don't overlap and are not
|
|
immediately consecutive in memory. If the buffer is smaller than the
|
|
region, it is 0-padded to the proper size. */
|
|
void bind_region(MemoryRegion const ®ion, Buffer const &buffer);
|
|
|
|
/* Cursor position, used by the interactive shell */
|
|
uint32_t cursor;
|
|
|
|
/* Symbol table */
|
|
SymbolTable symbols;
|
|
|
|
// - AbstractMemory interface
|
|
char const *translate_dynamic(uint32_t addr, int *size) override;
|
|
|
|
// Analysis tools and data
|
|
|
|
/* Main disassembly; holds disassembled code for large-scale analyses. */
|
|
Disassembly disasm;
|
|
|
|
/* OS analysis; created on-demand. Returns the new or cached OS analysis,
|
|
nullptr OS analysis fails. */
|
|
OS *os_analysis(bool force = false);
|
|
|
|
private:
|
|
/* OS analysis results */
|
|
std::unique_ptr<OS> m_os;
|
|
};
|
|
|
|
} /* namespace FxOS */
|
|
|
|
#endif /* FXOS_VSPACE_H */
|