BearParser
Portable Executable parsing library (from PE-bear)
Toggle main menu visibility
Loading...
Searching...
No Matches
parser
ExeNodeWrapper.cpp
Go to the documentation of this file.
1
#include "
ExeNodeWrapper.h
"
2
3
ExeNodeWrapper::ExeNodeWrapper
(
Executable
*exec,
ExeNodeWrapper
* parent)
4
:
ExeElementWrapper
(exec),
parentNode
(parent),
entryNum
(0)
5
{
6
wrap
();
7
}
8
9
ExeNodeWrapper::ExeNodeWrapper
(
Executable
*exec,
ExeNodeWrapper
* parent,
size_t
entryNumber)
10
:
ExeElementWrapper
(exec),
parentNode
(parent),
entryNum
(entryNumber)
11
{
12
wrap
();
13
}
14
15
ExeNodeWrapper
*
ExeNodeWrapper::getEntryAt
(
size_t
fieldId)
16
{
17
return
this->
getEntryAt
(this->
entries
, fieldId);
18
}
19
20
ExeNodeWrapper
*
ExeNodeWrapper::getEntryAt
(std::vector<ExeNodeWrapper*> &_entries,
size_t
fieldId)
21
{
22
return
(fieldId < _entries.size()) ? _entries[fieldId] : NULL;
23
}
24
25
size_t
ExeNodeWrapper::getEntriesCount
(std::vector<ExeNodeWrapper*> &_entries)
26
{
27
return
_entries.size();
28
}
29
30
void
ExeNodeWrapper::clear
()
31
{
32
size_t
entriesCount = this->
entries
.size();
33
for
(
size_t
i = 0; i < entriesCount; i++) {
34
delete
this->
entries
[i];
35
}
36
this->
entries
.clear();
37
}
38
39
void
*
ExeNodeWrapper::getSubfieldPtr
(
size_t
fieldId,
size_t
subField)
40
{
41
ExeNodeWrapper
* entry = this->
getEntryAt
(fieldId);
42
if
(!entry)
return
NULL;
43
//---
44
return
entry->
getFieldPtr
(subField);
45
}
46
47
bufsize_t
ExeNodeWrapper::getSubfieldSize
(
size_t
fieldId,
size_t
subField)
48
{
49
ExeNodeWrapper
* entry = this->
getEntryAt
(fieldId);
50
if
(!entry)
return
0;
51
//---
52
return
entry->
getFieldSize
(subField);
53
}
54
55
QString
ExeNodeWrapper::getSubfieldName
(
size_t
fieldId,
size_t
subField)
56
{
57
ExeNodeWrapper
* entry = this->
getEntryAt
(fieldId);
58
if
(!entry)
return
""
;
59
//---
60
return
entry->
getFieldName
(subField);
61
}
62
63
bool
ExeNodeWrapper::canAddEntry
()
64
{
65
offset_t
nextOffset =
getNextEntryOffset
();
66
bufsize_t
entrySize =
geEntrySize
();
67
if
(entrySize == 0)
return
false
;
68
69
bufsize_t
paddedSize = entrySize * 2;
70
bool
haveSpace = this->
m_Exe
->isAreaEmpty(nextOffset, paddedSize);
71
Logger::append
(
Logger::D_INFO
,
72
"NextOffset = %llX size = %lX, canAdd: %u"
,
73
static_cast<
unsigned
long
long
>
(nextOffset),
74
static_cast<
unsigned
long
>
(entrySize),
75
static_cast<
unsigned
int
>
(haveSpace)
76
);
77
return
haveSpace;
78
}
79
80
bool
ExeNodeWrapper::isMyEntryType
(
ExeNodeWrapper
*entry)
81
{
82
if
(!entry)
return
false
;
83
return
true
;
//type cast check in inherited wrappers
84
}
85
86
ExeNodeWrapper
*
ExeNodeWrapper::getLastEntry
()
87
{
88
size_t
lastId = this->
getEntriesCount
() - 1;
89
return
this->
getEntryAt
(lastId);
90
}
91
92
offset_t
ExeNodeWrapper::getNextEntryOffset
()
93
{
94
ExeNodeWrapper
*lastEntry =
getLastEntry
();
95
if
(lastEntry == NULL)
return
INVALID_ADDR
;
96
97
offset_t
lastOffset = lastEntry->
getOffset
();
98
if
(lastOffset ==
INVALID_ADDR
)
return
INVALID_ADDR
;
99
100
bufsize_t
entrySize = lastEntry->
getSize
();
101
offset_t
nextOffset = lastOffset + entrySize;
102
return
nextOffset;
103
}
104
105
bufsize_t
ExeNodeWrapper::geEntrySize
()
106
{
107
ExeNodeWrapper
*lastEntry =
getLastEntry
();
108
if
(lastEntry == NULL)
return
0;
109
110
bufsize_t
entrySize = lastEntry->
getSize
();
111
return
entrySize;
112
}
113
114
ExeNodeWrapper
*
ExeNodeWrapper::addEntryAt
(
ExeNodeWrapper
*entry,
offset_t
nextOffset)
115
{
116
if
(
canAddEntry
() ==
false
)
return
NULL;
117
118
size_t
entryNum
= this->
getEntriesCount
();
119
120
if
(nextOffset ==
INVALID_ADDR
)
return
NULL;
121
if
(entry == NULL) {
122
// if no entry supplied, duplicate the last entry...
123
entry = this->
getLastEntry
();
124
}
125
126
if
(
isMyEntryType
(entry) ==
false
)
return
NULL;
127
// if (entrySize != entry->getSize()) return NULL;
128
if
(
m_Exe
->pasteBuffer(nextOffset, entry,
false
) ==
false
) {
129
return
NULL;
130
}
131
if
(
loadNextEntry
(
entryNum
) ==
false
)
return
NULL;
132
reloadMapping
();
133
Logger::append
(
Logger::D_INFO
,
134
"Entries count: %lu"
,
135
static_cast<
unsigned
long
>
(this->
getEntriesCount
())
136
);
137
return
getLastEntry
();
138
}
139
140
ExeNodeWrapper
*
ExeNodeWrapper::addEntry
(
ExeNodeWrapper
*entry)
141
{
142
offset_t
offset =
getNextEntryOffset
();
143
return
addEntryAt
(entry, offset);
144
}
145
INVALID_ADDR
const offset_t INVALID_ADDR
Definition
AbstractByteBuffer.h:21
offset_t
uint64_t offset_t
Definition
AbstractByteBuffer.h:20
bufsize_t
size_t bufsize_t
Definition
AbstractByteBuffer.h:17
ExeNodeWrapper.h
ExeElementWrapper::getSize
virtual bufsize_t getSize()=0
ExeElementWrapper::getFieldSize
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField=FIELD_NONE)
Definition
ExeElementWrapper.cpp:12
ExeElementWrapper::getFieldPtr
virtual void * getFieldPtr(size_t fieldId, size_t subField)=0
ExeElementWrapper::ExeElementWrapper
ExeElementWrapper(Executable *exe)
Definition
ExeElementWrapper.cpp:3
ExeElementWrapper::getOffset
virtual offset_t getOffset()
Definition
ExeElementWrapper.cpp:39
ExeElementWrapper::Executable
friend class Executable
Definition
ExeElementWrapper.h:67
ExeElementWrapper::m_Exe
Executable * m_Exe
Definition
ExeElementWrapper.h:65
ExeNodeWrapper::getFieldName
virtual QString getFieldName(size_t fieldId)=0
ExeNodeWrapper::isMyEntryType
virtual bool isMyEntryType(ExeNodeWrapper *entry)
Definition
ExeNodeWrapper.cpp:80
ExeNodeWrapper::getSubfieldPtr
virtual void * getSubfieldPtr(size_t fieldId, size_t subField)
Definition
ExeNodeWrapper.cpp:39
ExeNodeWrapper::addEntryAt
virtual ExeNodeWrapper * addEntryAt(ExeNodeWrapper *entry, offset_t nextOffset)
Definition
ExeNodeWrapper.cpp:114
ExeNodeWrapper::getLastEntry
ExeNodeWrapper * getLastEntry()
Definition
ExeNodeWrapper.cpp:86
ExeNodeWrapper::getSubfieldName
virtual QString getSubfieldName(size_t fieldId, size_t subField)
Definition
ExeNodeWrapper.cpp:55
ExeNodeWrapper::wrap
virtual bool wrap()
Definition
ExeNodeWrapper.h:16
ExeNodeWrapper::ExeNodeWrapper
ExeNodeWrapper(Executable *pe, ExeNodeWrapper *parent=NULL)
Definition
ExeNodeWrapper.cpp:3
ExeNodeWrapper::reloadMapping
virtual void reloadMapping()
Definition
ExeNodeWrapper.h:17
ExeNodeWrapper::getEntryAt
virtual ExeNodeWrapper * getEntryAt(size_t fieldId)
Definition
ExeNodeWrapper.cpp:15
ExeNodeWrapper::geEntrySize
virtual bufsize_t geEntrySize()
Definition
ExeNodeWrapper.cpp:105
ExeNodeWrapper::entries
std::vector< ExeNodeWrapper * > entries
Definition
ExeNodeWrapper.h:56
ExeNodeWrapper::loadNextEntry
virtual bool loadNextEntry(size_t entryNum)
Definition
ExeNodeWrapper.h:48
ExeNodeWrapper::canAddEntry
virtual bool canAddEntry()
Definition
ExeNodeWrapper.cpp:63
ExeNodeWrapper::getNextEntryOffset
virtual offset_t getNextEntryOffset()
Definition
ExeNodeWrapper.cpp:92
ExeNodeWrapper::parentNode
ExeNodeWrapper * parentNode
Definition
ExeNodeWrapper.h:53
ExeNodeWrapper::getEntriesCount
virtual size_t getEntriesCount()
Definition
ExeNodeWrapper.h:20
ExeNodeWrapper::entryNum
size_t entryNum
Definition
ExeNodeWrapper.h:54
ExeNodeWrapper::clear
virtual void clear()
Definition
ExeNodeWrapper.cpp:30
ExeNodeWrapper::getSubfieldSize
virtual bufsize_t getSubfieldSize(size_t fieldId, size_t subField)
Definition
ExeNodeWrapper.cpp:47
ExeNodeWrapper::addEntry
virtual ExeNodeWrapper * addEntry(ExeNodeWrapper *entry)
Definition
ExeNodeWrapper.cpp:140
Logger::append
bool append(dbg_level lvl, const char *format,...)
Definition
Util.cpp:8
Logger::D_INFO
@ D_INFO
Definition
Util.h:26
Generated by
1.17.0