BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
Executable.h
Go to the documentation of this file.
1#pragma once
2#include <map>
3#include <QMap>
4
6class Executable;
7
9{
10public:
11 ExeException(const QString info) : CustomException(info) {}
12};
13
15public:
17 virtual ~ExeBuilder() {}
18
19 virtual bool signatureMatches(AbstractByteBuffer *buf) = 0;
21 virtual QString typeName() = 0;
22};
23
24//-------------------------------------------------------------
25
27public:
28 enum exe_bits {
30 BITS_16 = 16,
31 BITS_32 = 32,
32 BITS_64 = 64,
33 };
34
41
42 enum addr_type {
44 RAW = 1,
45 RVA = 2,
46 VA = 3,
48 };
49
50 static bool isBit64(Executable *exe) { return (!exe || exe->getBitMode() != Executable::BITS_64) ? false: true; }
51 static bool isBit32(Executable *exe) { return (!exe || exe->getBitMode() != Executable::BITS_32) ? false: true; }
52
53 bool isBit64() { return isBit64(this); }
54 bool isBit32() { return isBit32(this); }
55
56 virtual ~Executable(void) { }
57
58 virtual exe_bits getBitMode() { return this->bitMode; }
59 virtual exe_arch getArch() = 0;
60
61 virtual bufsize_t getContentSize() { return buf->getContentSize(); }
62 virtual BYTE* getContent() { return buf->getContent(); }
63 //wrapper:
64 virtual offset_t getRawSize() const { return static_cast<offset_t>(buf->getContentSize()); }
65
66 BYTE* getContentAtPtr(BYTE* ptr, bufsize_t size, bool allowExceptions = false) { return AbstractByteBuffer::getContentAtPtr(ptr, size, allowExceptions); }
67 BYTE* getContentAt(offset_t offset, bufsize_t size, bool allowExceptions = false) { return AbstractByteBuffer::getContentAt(offset, size, allowExceptions); }
68
69 virtual BYTE* getContentAt(offset_t offset, Executable::addr_type aType, bufsize_t size, bool allowExceptions = false);
70//------------------------------
73 virtual offset_t getImageBase(bool recalculate = false) = 0;
75
77
78 /* All Entry Points of the application, including: main EP, Exports, TLS Callbacks */
79 virtual size_t getAllEntryPoints(QMap<offset_t,QString> &entrypoints, Executable::addr_type aType = Executable::RVA)
80 {
81 offset_t mainEP = getEntryPoint(aType);
82 entrypoints.insert(mainEP, "_start");
83 return 1;
84 }
85
86 /* conversions */
87 virtual bool isValidAddr(offset_t addr, addr_type addrType);
88 virtual bool isValidVA(offset_t va) { return isValidAddr(va, Executable::VA); }
89
91
92 virtual offset_t toRaw(offset_t offset, addr_type addrType, bool allowExceptions = false); //any type of offset to raw
94
95 // returns INVALID_ADDR if failed
96 // FileAddr <-> RVA
97 virtual offset_t rawToRva(offset_t raw) = 0;
98 virtual offset_t rvaToRaw(offset_t rva) = 0;
99
100 // VA <-> RVA
101 virtual offset_t VaToRva(offset_t va, bool autodetect = false);
102
104 {
105 return (rva == INVALID_ADDR) ? INVALID_ADDR : (rva + this->getImageBase());
106 }
107
108 // VA -> FileAddr
110 {
111 if (va == INVALID_ADDR) return INVALID_ADDR;
112
113 offset_t rva = this->VaToRva(va, true);
114 return rvaToRaw(rva);
115 }
116
117 QString getFileName();
118
119 virtual bool resize(bufsize_t newSize) { return buf->resize(newSize); }
120
121 virtual bool isResized() { return buf ? buf->isResized() : false; }
122
123 virtual bool isTruncated() { return buf ? buf->isTruncated() : false; }
124
125 /* wrappers */
127 bufsize_t getFileSize() const;
128
129 virtual bool dumpFragment(offset_t offset, bufsize_t size, QString fileName);
130
131protected:
132 Executable(AbstractByteBuffer *v_buf, exe_bits v_bitMode);
133
136};
137
const offset_t INVALID_ADDR
uint64_t offset_t
size_t bufsize_t
virtual BYTE * getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions=false)
virtual BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
CustomException(const QString info, const int32_t code=UNKNOWN_EXCEPTION)
virtual ~ExeBuilder()
Definition Executable.h:17
virtual Executable * build(AbstractByteBuffer *buf)=0
virtual bool signatureMatches(AbstractByteBuffer *buf)=0
virtual QString typeName()=0
ExeException(const QString info)
Definition Executable.h:11
AbstractByteBuffer * buf
Definition Executable.h:135
virtual bool isTruncated()
Definition Executable.h:123
@ ADDR_TYPE_COUNT
Definition Executable.h:47
virtual offset_t getEntryPoint(Executable::addr_type aType=Executable::RVA)=0
bufsize_t getFileSize() const
bool isBit32()
Definition Executable.h:54
virtual exe_bits getBitMode()
Definition Executable.h:58
virtual offset_t toRaw(offset_t offset, addr_type addrType, bool allowExceptions=false)
virtual exe_arch getArch()=0
virtual bool isValidAddr(offset_t addr, addr_type addrType)
BYTE * getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions=false)
Definition Executable.h:66
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition Executable.h:67
bool isBit64()
Definition Executable.h:53
static bool isBit64(Executable *exe)
Definition Executable.h:50
virtual offset_t getImageBase(bool recalculate=false)=0
virtual BYTE * getContent()
Definition Executable.h:62
QString getFileName()
virtual offset_t vaToRaw(offset_t va)
Definition Executable.h:109
virtual ~Executable(void)
Definition Executable.h:56
virtual bool isValidVA(offset_t va)
Definition Executable.h:88
Executable(AbstractByteBuffer *v_buf, exe_bits v_bitMode)
Definition Executable.cpp:4
virtual offset_t getRawSize() const
Definition Executable.h:64
virtual size_t getAllEntryPoints(QMap< offset_t, QString > &entrypoints, Executable::addr_type aType=Executable::RVA)
Definition Executable.h:79
virtual bufsize_t getMappedSize(Executable::addr_type aType)=0
virtual bufsize_t getImageSize()
Definition Executable.h:76
virtual offset_t rawToRva(offset_t raw)=0
exe_bits bitMode
Definition Executable.h:134
virtual offset_t rvaToRaw(offset_t rva)=0
virtual bufsize_t getAlignment(Executable::addr_type aType) const =0
virtual offset_t convertAddr(offset_t inAddr, Executable::addr_type inType, Executable::addr_type outType)
virtual bool resize(bufsize_t newSize)
Definition Executable.h:119
Executable::addr_type detectAddrType(offset_t addr, Executable::addr_type hintType)
virtual bool dumpFragment(offset_t offset, bufsize_t size, QString fileName)
virtual offset_t VaToRva(offset_t va, bool autodetect=false)
static bool isBit32(Executable *exe)
Definition Executable.h:51
virtual offset_t rvaToVa(offset_t rva)
Definition Executable.h:103
virtual bufsize_t getContentSize()
Definition Executable.h:61
AbstractByteBuffer * getFileBuffer() const
Definition Executable.h:126
virtual bool isResized()
Definition Executable.h:121