BearParser
Portable Executable parsing library (from PE-bear)
Toggle main menu visibility
Loading...
Searching...
No Matches
parser
pe
ExceptionDirWrapper.cpp
Go to the documentation of this file.
1
#include "
pe/ExceptionDirWrapper.h
"
2
#include "
pe/PEFile.h
"
3
4
/*
5
typedef struct _IMAGE_IA64_RUNTIME_FUNCTION_ENTRY {
6
DWORD BeginAddress;
7
DWORD EndAddress;
8
DWORD UnwindInfoAddress;
9
} IMAGE_IA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
10
*/
11
12
typedef
struct
_ARM_EXCEPT_RECORD
{
13
DWORD
Start
;
14
DWORD
Xdata
;
15
}
ARM_EXCEPT_RECORD
;
16
17
18
bool
ExceptionDirWrapper::wrap
()
19
{
20
clear
();
21
parsedSize = 0;
22
bufsize_t
maxSize =
getDirEntrySize
(
true
);
23
if
(maxSize == 0)
return
false
;
// nothing to parse
24
25
if
(!
getPtr
())
return
false
;
26
27
size_t
entrySize = 0;
28
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
29
entrySize =
sizeof
(IMAGE_IA64_RUNTIME_FUNCTION_ENTRY);
30
}
31
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
32
entrySize = 8;
33
}
34
size_t
entryId = 0;
35
while
(parsedSize < maxSize) {
36
ExceptionEntryWrapper
* entry =
new
ExceptionEntryWrapper
(this->
m_Exe
,
this
, entryId++);
37
38
if
(entry->
getPtr
() == NULL) {
39
delete
entry;
40
break
;
41
}
42
this->parsedSize += entrySize;
43
this->
entries
.push_back(entry);
44
}
45
Logger::append
(
Logger::D_INFO
,
46
"Entries num = %lu, parsedSize = %lX"
,
47
static_cast<
unsigned
long
>
(
entries
.size()),
48
static_cast<
unsigned
long
>
(parsedSize)
49
);
50
return
true
;
51
}
52
53
void
*
ExceptionDirWrapper::getPtr
()
54
{
55
size_t
entrySize = 0;
56
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
57
entrySize =
sizeof
(IMAGE_IA64_RUNTIME_FUNCTION_ENTRY);
58
}
59
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
60
entrySize =
sizeof
(uint64_t);
61
}
62
const
offset_t
rva =
getDirEntryAddress
();
63
BYTE* first =
m_Exe
->getContentAt(rva,
Executable::RVA
, entrySize);
64
if
(!first || !entrySize) {
65
return
NULL;
66
}
67
return
first;
68
}
69
70
//----------------
71
72
void
*
ExceptionEntryWrapper::getPtr
()
73
{
74
if
(!this->parentDir) {
75
return
NULL;
76
}
77
const
size_t
entrySize = _getSize();
78
void
* first = parentDir->getPtr();
79
if
(!first || !entrySize) {
80
return
NULL;
81
}
82
83
uint64_t firstOffset = this->
getOffset
(first);
84
uint64_t myOffset = firstOffset + this->
entryNum
* entrySize;
85
86
BYTE* ptr =
m_Exe
->getContentAt(myOffset,
Executable::RAW
, entrySize);
87
return
ptr;
88
}
89
90
bufsize_t
ExceptionEntryWrapper::_getSize()
91
{
92
if
(this->
m_Exe
) {
93
if
(this->
m_Exe
->
getArch
() ==
Executable::ARCH_INTEL
) {
94
return
sizeof
(IMAGE_IA64_RUNTIME_FUNCTION_ENTRY);
95
}
96
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
97
return
8;
98
}
99
}
100
return
0;
101
}
102
103
bufsize_t
ExceptionEntryWrapper::getSize
()
104
{
105
if
(!this->parentDir)
return
0;
106
if
(!this->
getPtr
())
return
0;
107
108
return
_getSize();
109
}
110
111
size_t
ExceptionEntryWrapper::getFieldsCount
()
112
{
113
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
114
return
ExceptionBlockFID_Intel::FIELD_COUNTER
;
115
}
116
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
117
return
ExceptionBlockFID_Arm64::ARM_EXCEPT_FIELD_COUNTER
;
118
}
119
return
0;
120
}
121
122
void
*
ExceptionEntryWrapper::getFieldPtr
(
size_t
fieldId,
size_t
subField)
123
{
124
void
*ptr = this->
getPtr
();
125
if
(!ptr)
return
nullptr
;
126
127
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
128
IMAGE_IA64_RUNTIME_FUNCTION_ENTRY* exc = (IMAGE_IA64_RUNTIME_FUNCTION_ENTRY*) ptr;
129
if
(!exc)
return
NULL;
130
131
switch
(fieldId) {
132
case
BEGIN_ADDR
:
return
&exc->BeginAddress;
133
case
END_ADDR
:
return
&exc->EndAddress;
134
case
UNWIND_INFO_ADDR
:
return
&exc->UnwindInfoAddress;
135
}
136
}
137
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
138
ARM_EXCEPT_RECORD
*rec = (
ARM_EXCEPT_RECORD
*) ptr;
139
if
(!rec)
return
NULL;
140
141
switch
(fieldId) {
142
case
ARM_EXCEPT_START
:
return
&rec->
Start
;
143
case
ARM_EXCEPT_XDATA
:
return
&rec->
Xdata
;
144
}
145
}
146
return
ptr;
147
}
148
149
QString
ExceptionEntryWrapper::getFieldName
(
size_t
fieldId)
150
{
151
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
152
switch
(fieldId) {
153
case
BEGIN_ADDR
:
return
"BeginAddress"
;
154
case
END_ADDR
:
return
"EndAddress"
;
155
case
UNWIND_INFO_ADDR
:
return
"UnwindInfoAddress"
;
156
}
157
return
""
;
158
}
159
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
160
switch
(fieldId) {
161
case
ARM_EXCEPT_START
:
return
"Start"
;
162
case
ARM_EXCEPT_XDATA
:
return
"XData"
;
163
}
164
}
165
return
getName
();
166
}
167
168
Executable::addr_type
ExceptionEntryWrapper::containsAddrType
(
size_t
fieldId,
size_t
subField)
169
{
170
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_INTEL
) {
171
switch
(fieldId) {
172
case
BEGIN_ADDR
:
173
case
END_ADDR
:
174
case
UNWIND_INFO_ADDR
:
175
return
Executable::RVA
;
176
}
177
}
178
else
if
(this->
m_Exe
->getArch() ==
Executable::ARCH_ARM
&& this->m_Exe->getBitMode() == 64) {
179
180
if
(fieldId ==
ARM_EXCEPT_START
)
return
Executable::RVA
;
181
if
(fieldId ==
ARM_EXCEPT_XDATA
) {
182
ARM_EXCEPT_RECORD
*rec = (
ARM_EXCEPT_RECORD
*) this->
getPtr
();
183
if
(!rec)
return
Executable::NOT_ADDR
;
184
185
if
(rec->
Xdata
&
ARM_XDATA_FLAG
) {
186
return
Executable::NOT_ADDR
;
187
}
188
return
Executable::RVA
;
189
}
190
}
191
return
Executable::NOT_ADDR
;
192
}
offset_t
uint64_t offset_t
Definition
AbstractByteBuffer.h:20
bufsize_t
size_t bufsize_t
Definition
AbstractByteBuffer.h:17
ARM_EXCEPT_RECORD
struct _ARM_EXCEPT_RECORD ARM_EXCEPT_RECORD
ExceptionDirWrapper.h
ARM_XDATA_FLAG
#define ARM_XDATA_FLAG
Definition
ExceptionDirWrapper.h:32
PEFile.h
DataDirEntryWrapper::getDirEntrySize
bufsize_t getDirEntrySize(bool trimToExeSize=false)
Definition
DataDirEntryWrapper.cpp:33
DataDirEntryWrapper::getDirEntryAddress
offset_t getDirEntryAddress()
Definition
DataDirEntryWrapper.cpp:19
ExceptionDirWrapper::ExceptionEntryWrapper
friend class ExceptionEntryWrapper
Definition
ExceptionDirWrapper.h:29
ExceptionDirWrapper::wrap
bool wrap()
Definition
ExceptionDirWrapper.cpp:18
ExceptionDirWrapper::getPtr
virtual void * getPtr()
Definition
ExceptionDirWrapper.cpp:53
ExceptionEntryWrapper::getPtr
virtual void * getPtr()
Definition
ExceptionDirWrapper.cpp:72
ExceptionEntryWrapper::getName
virtual QString getName()
Definition
ExceptionDirWrapper.h:62
ExceptionEntryWrapper::ARM_EXCEPT_FIELD_COUNTER
@ ARM_EXCEPT_FIELD_COUNTER
Definition
ExceptionDirWrapper.h:50
ExceptionEntryWrapper::ARM_EXCEPT_XDATA
@ ARM_EXCEPT_XDATA
Definition
ExceptionDirWrapper.h:49
ExceptionEntryWrapper::ARM_EXCEPT_START
@ ARM_EXCEPT_START
Definition
ExceptionDirWrapper.h:48
ExceptionEntryWrapper::getFieldPtr
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
Definition
ExceptionDirWrapper.cpp:122
ExceptionEntryWrapper::getFieldsCount
virtual size_t getFieldsCount()
Definition
ExceptionDirWrapper.cpp:111
ExceptionEntryWrapper::containsAddrType
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField)
Definition
ExceptionDirWrapper.cpp:168
ExceptionEntryWrapper::getFieldName
virtual QString getFieldName(size_t fieldId)
Definition
ExceptionDirWrapper.cpp:149
ExceptionEntryWrapper::getSize
virtual bufsize_t getSize()
Definition
ExceptionDirWrapper.cpp:103
ExceptionEntryWrapper::BEGIN_ADDR
@ BEGIN_ADDR
Definition
ExceptionDirWrapper.h:40
ExceptionEntryWrapper::UNWIND_INFO_ADDR
@ UNWIND_INFO_ADDR
Definition
ExceptionDirWrapper.h:42
ExceptionEntryWrapper::FIELD_COUNTER
@ FIELD_COUNTER
Definition
ExceptionDirWrapper.h:43
ExceptionEntryWrapper::END_ADDR
@ END_ADDR
Definition
ExceptionDirWrapper.h:41
ExeElementWrapper::getOffset
virtual offset_t getOffset()
Definition
ExeElementWrapper.cpp:39
ExeElementWrapper::m_Exe
Executable * m_Exe
Definition
ExeElementWrapper.h:65
ExeNodeWrapper::entries
std::vector< ExeNodeWrapper * > entries
Definition
ExeNodeWrapper.h:56
ExeNodeWrapper::entryNum
size_t entryNum
Definition
ExeNodeWrapper.h:54
ExeNodeWrapper::clear
virtual void clear()
Definition
ExeNodeWrapper.cpp:30
Executable::addr_type
addr_type
Definition
Executable.h:42
Executable::NOT_ADDR
@ NOT_ADDR
Definition
Executable.h:43
Executable::RVA
@ RVA
Definition
Executable.h:45
Executable::RAW
@ RAW
Definition
Executable.h:44
Executable::getArch
virtual exe_arch getArch()=0
Executable::ARCH_ARM
@ ARCH_ARM
Definition
Executable.h:38
Executable::ARCH_INTEL
@ ARCH_INTEL
Definition
Executable.h:37
Logger::append
bool append(dbg_level lvl, const char *format,...)
Definition
Util.cpp:8
Logger::D_INFO
@ D_INFO
Definition
Util.h:26
_ARM_EXCEPT_RECORD
Definition
ExceptionDirWrapper.cpp:12
_ARM_EXCEPT_RECORD::Start
DWORD Start
Definition
ExceptionDirWrapper.cpp:13
_ARM_EXCEPT_RECORD::Xdata
DWORD Xdata
Definition
ExceptionDirWrapper.cpp:14
Generated by
1.17.0