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
40
41 enum addr_type {
43 RAW = 1,
44 RVA = 2,
45 VA = 3
46 };
47 static bool isBit64(Executable *exe) { return (!exe || exe->getBitMode() != Executable::BITS_64) ? false: true; }
48 static bool isBit32(Executable *exe) { return (!exe || exe->getBitMode() != Executable::BITS_32) ? false: true; }
49
50 bool isBit64() { return isBit64(this); }
51 bool isBit32() { return isBit32(this); }
52
53 virtual ~Executable(void) { }
54
55 virtual exe_bits getBitMode() { return this->bitMode; }
56
57 virtual bufsize_t getContentSize() { return buf->getContentSize(); }
58 virtual BYTE* getContent() { return buf->getContent(); }
59 //wrapper:
60 virtual offset_t getRawSize() const { return static_cast<offset_t>(buf->getContentSize()); }
61
62 BYTE* getContentAtPtr(BYTE* ptr, bufsize_t size, bool allowExceptions = false) { return AbstractByteBuffer::getContentAtPtr(ptr, size, allowExceptions); }
63 BYTE* getContentAt(offset_t offset, bufsize_t size, bool allowExceptions = false) { return AbstractByteBuffer::getContentAt(offset, size, allowExceptions); }
64
65 virtual BYTE* getContentAt(offset_t offset, Executable::addr_type aType, bufsize_t size, bool allowExceptions = false);
66//------------------------------
69 virtual offset_t getImageBase(bool recalculate = false) = 0;
71
73
74 /* All Entry Points of the application, including: main EP, Exports, TLS Callbacks */
75 virtual size_t getAllEntryPoints(QMap<offset_t,QString> &entrypoints, Executable::addr_type aType = Executable::RVA)
76 {
77 offset_t mainEP = getEntryPoint(aType);
78 entrypoints.insert(mainEP, "_start");
79 return 1;
80 }
81
82 /* conversions */
83 virtual bool isValidAddr(offset_t addr, addr_type addrType);
84 virtual bool isValidVA(offset_t va) { return isValidAddr(va, Executable::VA); }
85
87
88 virtual offset_t toRaw(offset_t offset, addr_type addrType, bool allowExceptions = false); //any type of offset to raw
90
91 // returns INVALID_ADDR if failed
92 // FileAddr <-> RVA
93 virtual offset_t rawToRva(offset_t raw) = 0;
94 virtual offset_t rvaToRaw(offset_t rva) = 0;
95
96 // VA <-> RVA
97 virtual offset_t VaToRva(offset_t va, bool autodetect = false);
98
100 {
101 return (rva == INVALID_ADDR) ? INVALID_ADDR : (rva + this->getImageBase());
102 }
103
104 // VA -> FileAddr
106 {
107 if (va == INVALID_ADDR) return INVALID_ADDR;
108
109 offset_t rva = this->VaToRva(va, true);
110 return rvaToRaw(rva);
111 }
112
113 QString getFileName();
114
115 virtual bool resize(bufsize_t newSize) { return buf->resize(newSize); }
116
117 virtual bool isResized() { return buf ? buf->isResized() : false; }
118
119 virtual bool isTruncated() { return buf ? buf->isTruncated() : false; }
120
121 /* wrappers */
123 bufsize_t getFileSize() const;
124
125 virtual bool dumpFragment(offset_t offset, bufsize_t size, QString fileName);
126
127protected:
128 Executable(AbstractByteBuffer *v_buf, exe_bits v_bitMode);
129
132};
133
uint32_t bufsize_t
const offset_t INVALID_ADDR
uint64_t offset_t
virtual bufsize_t getContentSize()=0
virtual bool isTruncated()
virtual BYTE * getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions=false)
virtual bool isResized()
virtual BYTE * getContent()=0
virtual BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
virtual bool resize(bufsize_t newSize)
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:131
virtual bool isTruncated()
Definition Executable.h:119
virtual offset_t getEntryPoint(Executable::addr_type aType=Executable::RVA)=0
bufsize_t getFileSize() const
bool isBit32()
Definition Executable.h:51
virtual exe_bits getBitMode()
Definition Executable.h:55
virtual offset_t toRaw(offset_t offset, addr_type addrType, bool allowExceptions=false)
virtual bool isValidAddr(offset_t addr, addr_type addrType)
BYTE * getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions=false)
Definition Executable.h:62
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition Executable.h:63
bool isBit64()
Definition Executable.h:50
static bool isBit64(Executable *exe)
Definition Executable.h:47
virtual offset_t getImageBase(bool recalculate=false)=0
virtual BYTE * getContent()
Definition Executable.h:58
QString getFileName()
virtual offset_t vaToRaw(offset_t va)
Definition Executable.h:105
virtual ~Executable(void)
Definition Executable.h:53
virtual bool isValidVA(offset_t va)
Definition Executable.h:84
Executable(AbstractByteBuffer *v_buf, exe_bits v_bitMode)
Definition Executable.cpp:4
virtual offset_t getRawSize() const
Definition Executable.h:60
virtual size_t getAllEntryPoints(QMap< offset_t, QString > &entrypoints, Executable::addr_type aType=Executable::RVA)
Definition Executable.h:75
virtual bufsize_t getMappedSize(Executable::addr_type aType)=0
virtual bufsize_t getImageSize()
Definition Executable.h:72
virtual offset_t rawToRva(offset_t raw)=0
exe_bits bitMode
Definition Executable.h:130
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:115
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:48
virtual offset_t rvaToVa(offset_t rva)
Definition Executable.h:99
virtual bufsize_t getContentSize()
Definition Executable.h:57
AbstractByteBuffer * getFileBuffer() const
Definition Executable.h:122
virtual bool isResized()
Definition Executable.h:117