BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
SectHdrsWrapper.h
Go to the documentation of this file.
1#pragma once
2
3#include "PENodeWrapper.h"
4#include <vector>
5#include <map>
6
8{
9public:
10 static const size_t SECNAME_LEN;
11
12 static std::vector<DWORD> splitCharacteristics(DWORD characteristics);
13 static QString getSecHdrAccessRightsDesc(DWORD characteristics);
14
15 static void initSecCharacter(std::map<DWORD, QString> &secHdrCharact);
16 static QString translateCharacteristics(DWORD charact);
17
18 /* fields :*/
20 NAME = 0,
23
26
29
32
35 };
36
37 SectionHdrWrapper(PEFile *pe, size_t sectionNumber)
38 : PENodeWrapper(pe), sectNum(sectionNumber), name(NULL), header(NULL) { wrap(); }
39
41 {
42 if (name) {
43 ::free(name);
44 }
45 }
46
47 bool wrap();
48
49 /* full structure boundaries */
50 virtual void* getPtr();
51 virtual bufsize_t getSize();
52 virtual QString getName();
53 virtual size_t getFieldsCount() { return FIELD_COUNTER; }
54 virtual size_t getSubFieldsCount() { return 1; }
55
56 /* specific field boundaries */
57 virtual void* getFieldPtr(size_t fieldId, size_t subField = FIELD_NONE);
58 virtual QString getFieldName(size_t fieldId);
59
60 virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField = FIELD_NONE);
61 virtual WrappedValue::data_type containsDataType(size_t fieldId, size_t subField = FIELD_NONE);
62
63 offset_t getContentOffset(Executable::addr_type aType, bool useMapped = true);
64 offset_t getContentEndOffset(Executable::addr_type aType, bool roundup); //always useMapped startOFfset
65
66 bufsize_t getContentSize(Executable::addr_type aType, bool recalculate);
67
68 /* wrappers */
69 DWORD getCharacteristics() { return header ? header->Characteristics : 0; }
70
71 DWORD getRawPtr() { return header ? header->PointerToRawData : 0; }
72
73 DWORD getVirtualPtr() { return header ? header->VirtualAddress : 0; }
74
75//modifications:
76
77 bool setCharacteristics(DWORD newCharacteristics)
78 {
79 if (!header) return false;
80 //TODO: validate newCharacteristics
81
82 header->Characteristics = newCharacteristics;
83 return true;
84 }
85
86 bool reloadName();
87
88 QString mappedName;
89
90protected:
91 SectionHdrWrapper(PEFile *pe, IMAGE_SECTION_HEADER *v_header) //standalone entry
92 : PENodeWrapper(pe), sectNum(INVALID_ENTRYNUM), name(NULL), header(v_header)
93 {
94 reloadName();
95 }
96
98
102
103 char *name;
104 size_t sectNum;
105
106private:
107 static std::map<DWORD, QString> s_secHdrCharact;
108 IMAGE_SECTION_HEADER *header;
109
110friend class PEFile;
111};
112
113//----
114
116{
117public:
118 static size_t SECT_COUNT_MAX;
119 static size_t SECT_INVALID_INDEX;
120
121 // fields :
123 bool wrap();
124 virtual void reloadMapping();
125
126 // full structure boundaries
127 virtual void* getPtr();
128 virtual bufsize_t getSize();
129 virtual QString getName() { return "Section Hdrs"; }
130 virtual size_t getFieldsCount();
131
132 // specific field boundaries
133 virtual void* getFieldPtr(size_t fieldId, size_t subField) { return getSubfieldPtr(fieldId, subField ); }
134 virtual bufsize_t getFieldSize(size_t fieldId, size_t subField) { return getSubfieldSize(fieldId, subField ); }
135 virtual QString getFieldName(size_t fieldId);
136
137 SectionHdrWrapper* getSecHdrAtOffset(offset_t offset, Executable::addr_type addrType, bool roundup, bool verbose = false);
138
140
142 {
143 if (!sec || !entries.size()) return SECT_INVALID_INDEX;
144 size_t indx = 0;
145 for (auto itr = entries.begin(); itr != entries.end(); ++itr, ++indx) {
146 if (sec == *itr) {
147 return indx;
148 }
149 }
150 return indx;
151 }
152
153 SectionHdrWrapper* getSecHdr(size_t index) const
154 {
155 if (index == SECT_INVALID_INDEX || index >= entries.size()) return NULL;
156 return dynamic_cast<SectionHdrWrapper*>(entries.at(index));
157 }
158
159 //---
160 bool canAddEntry();
162
163protected:
164 void clear();
165 void addMapping(SectionHdrWrapper *sec);
166 virtual bool loadNextEntry(size_t entryNum);
167 bool isMyEntryType(ExeNodeWrapper *entry); // is it an entry of appropriate type
168
169 std::map<offset_t, SectionHdrWrapper*> vSec;
170 std::map<offset_t, SectionHdrWrapper*> rSec;
171};
uint32_t bufsize_t
uint64_t offset_t
#define FIELD_NONE
const size_t INVALID_ENTRYNUM
Definition: ExeNodeWrapper.h:6
virtual bufsize_t getContentSize()
virtual void * getSubfieldPtr(size_t fieldId, size_t subField)
std::vector< ExeNodeWrapper * > entries
virtual bufsize_t getSubfieldSize(size_t fieldId, size_t subField)
Definition: PEFile.h:41
SectHdrsWrapper(PEFile *pe)
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField)
std::map< offset_t, SectionHdrWrapper * > rSec
void printSectionsMapping(Executable::addr_type aType)
ExeNodeWrapper * addEntry(ExeNodeWrapper *entry)
virtual bufsize_t getSize()
virtual bool loadNextEntry(size_t entryNum)
virtual QString getFieldName(size_t fieldId)
SectionHdrWrapper * getSecHdrAtOffset(offset_t offset, Executable::addr_type addrType, bool roundup, bool verbose=false)
bool isMyEntryType(ExeNodeWrapper *entry)
virtual void reloadMapping()
SectionHdrWrapper * getSecHdr(size_t index) const
virtual void * getPtr()
static size_t SECT_COUNT_MAX
std::map< offset_t, SectionHdrWrapper * > vSec
virtual void * getFieldPtr(size_t fieldId, size_t subField)
size_t getSecIndex(SectionHdrWrapper *sec) const
void addMapping(SectionHdrWrapper *sec)
virtual QString getName()
static size_t SECT_INVALID_INDEX
virtual size_t getFieldsCount()
virtual size_t getFieldsCount()
static std::vector< DWORD > splitCharacteristics(DWORD characteristics)
DWORD getCharacteristics()
bufsize_t getMappedVirtualSize()
virtual QString getName()
bool setCharacteristics(DWORD newCharacteristics)
SectionHdrWrapper(PEFile *pe, size_t sectionNumber)
virtual QString getFieldName(size_t fieldId)
offset_t getContentDeclaredOffset(Executable::addr_type aType)
static void initSecCharacter(std::map< DWORD, QString > &secHdrCharact)
SectionHdrWrapper(PEFile *pe, IMAGE_SECTION_HEADER *v_header)
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
virtual size_t getSubFieldsCount()
bufsize_t getContentDeclaredSize(Executable::addr_type aType)
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
static QString translateCharacteristics(DWORD charact)
offset_t getContentEndOffset(Executable::addr_type aType, bool roundup)
offset_t getContentOffset(Executable::addr_type aType, bool useMapped=true)
static QString getSecHdrAccessRightsDesc(DWORD characteristics)
virtual void * getPtr()
bufsize_t getMappedRawSize()
static const size_t SECNAME_LEN
virtual WrappedValue::data_type containsDataType(size_t fieldId, size_t subField=FIELD_NONE)
virtual bufsize_t getSize()