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);
92 virtual offset_t rvaToVa(offset_t rva) { return rva + this->getImageBase(); }
93
94 // VA -> FileAddr
96 {
97 offset_t rva = this->VaToRva(va, true);
98 return rvaToRaw(rva);
99 }
100
101 QString getFileName() { return fileName; }
102 virtual bool resize(bufsize_t newSize) { return buf->resize(newSize); }
103
104protected:
105 Executable(AbstractByteBuffer *v_buf, exe_bits v_bitMode);
106
109 QString fileName;
110};
111
uint32_t bufsize_t
uint64_t offset_t
virtual bufsize_t getContentSize()=0
virtual BYTE * getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions=false)
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:108
virtual offset_t getEntryPoint(Executable::addr_type aType=Executable::RVA)=0
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:24
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
QString fileName
Definition: Executable.h:109
static bool isBit64(Executable *exe)
Definition: Executable.h:41
virtual BYTE * getContent()
Definition: Executable.h:52
QString getFileName()
Definition: Executable.h:101
virtual offset_t vaToRaw(offset_t va)
Definition: Executable.h:95
virtual bufsize_t getAlignment(Executable::addr_type aType)=0
virtual ~Executable(void)
Definition: Executable.h:47
virtual bool isValidVA(offset_t va)
Definition: Executable.h:78
virtual offset_t VaToRva(offset_t va, bool autodetect)
Definition: Executable.cpp:32
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:107
virtual offset_t rvaToRaw(offset_t rva)=0
virtual offset_t getImageBase()=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:102
Executable::addr_type detectAddrType(offset_t addr, Executable::addr_type hintType)
Definition: Executable.cpp:122
static bool isBit32(Executable *exe)
Definition: Executable.h:42
virtual offset_t rvaToVa(offset_t rva)
Definition: Executable.h:92
virtual bufsize_t getContentSize()
Definition: Executable.h:51