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