BearParser
Portable Executable parsing library (from PE-bear)
Toggle main menu visibility
Loading...
Searching...
No Matches
parser
pe
TlsDirWrapper.cpp
Go to the documentation of this file.
1
#include "
pe/TlsDirWrapper.h
"
2
#include "
pe/PEFile.h
"
3
4
bool
TlsDirWrapper::wrap
()
5
{
6
clear
();
7
size_t
entryId = 0;
8
while
(
true
) {
9
TlsEntryWrapper
* entry =
new
TlsEntryWrapper
(this->
m_Exe
,
this
, entryId++);
10
if
(!entry->
getPtr
()) {
11
delete
entry;
12
break
;
13
}
14
15
bool
isOk =
false
;
16
uint64_t val = entry->
getNumValue
(
TlsEntryWrapper::CALLBACK_ADDR
, &isOk);
17
if
(!isOk || val == 0) {
18
delete
entry;
19
break
;
20
}
21
this->
entries
.push_back(entry);
22
}
23
return
true
;
24
}
25
26
void
*
TlsDirWrapper::getPtr
()
27
{
28
if
(
m_Exe
->getBitMode() ==
Executable::BITS_32
) {
29
return
tls32();
30
}
31
return
tls64();
32
}
33
34
bufsize_t
TlsDirWrapper::getSize
()
35
{
36
if
(!
getPtr
())
return
0;
37
if
(
m_Exe
->getBitMode() ==
Executable::BITS_32
) {
38
return
sizeof
(IMAGE_TLS_DIRECTORY32);
39
}
40
return
sizeof
(IMAGE_TLS_DIRECTORY64);
41
}
42
43
void
* TlsDirWrapper::getTlsDirPtr()
44
{
45
bufsize_t
dirSize = 0;
46
47
if
(
m_Exe
->
getBitMode
() ==
Executable::BITS_32
) {
48
dirSize =
sizeof
(IMAGE_TLS_DIRECTORY32);
49
}
else
if
(
m_Exe
->getBitMode() ==
Executable::BITS_64
) {
50
dirSize =
sizeof
(IMAGE_TLS_DIRECTORY64);
51
}
52
53
offset_t
rva =
getDirEntryAddress
();
54
BYTE *ptr =
m_Exe
->getContentAt(rva,
Executable::RVA
, dirSize);
55
return
ptr;
56
}
57
58
IMAGE_TLS_DIRECTORY32* TlsDirWrapper::tls32()
59
{
60
if
(
m_Exe
->getBitMode() !=
Executable::BITS_32
)
return
NULL;
61
return
(IMAGE_TLS_DIRECTORY32*) getTlsDirPtr();
62
}
63
64
IMAGE_TLS_DIRECTORY64* TlsDirWrapper::tls64()
65
{
66
if
(
m_Exe
->getBitMode() !=
Executable::BITS_64
)
return
NULL;
67
return
(IMAGE_TLS_DIRECTORY64*) getTlsDirPtr();
68
}
69
70
void
*
TlsDirWrapper::getFieldPtr
(
size_t
fId,
size_t
subField)
71
{
72
IMAGE_TLS_DIRECTORY32* t32 = tls32();
73
IMAGE_TLS_DIRECTORY64* t64 = tls64();
74
75
if
(!t32 && !t64)
return
NULL;
76
77
switch
(fId) {
78
case
START_ADDR
:
return
t32 ? (
void
*) &t32->StartAddressOfRawData : (
void
*) &t64->StartAddressOfRawData;
79
case
END_ADDR
:
return
t32 ? (
void
*) &t32->EndAddressOfRawData : (
void
*) &t64->EndAddressOfRawData;
80
case
INDEX_ADDR
:
return
t32 ? (
void
*) &t32->AddressOfIndex : (
void
*) &t64->AddressOfIndex;
81
case
CALLBACKS_ADDR
:
return
t32 ? (
void
*) &t32->AddressOfCallBacks : (
void
*) &t64->AddressOfCallBacks;
82
case
ZEROF_SIZE
:
return
t32 ? (
void
*) &t32->SizeOfZeroFill : (
void
*) &t64->SizeOfZeroFill;
83
case
CHARACT
:
return
t32 ? (
void
*) &t32->Characteristics : (
void
*) &t64->Characteristics;
84
}
85
return
this->
getPtr
();
86
}
87
88
QString
TlsDirWrapper::getFieldName
(
size_t
fieldId)
89
{
90
switch
(fieldId) {
91
case
START_ADDR
:
return
"StartAddressOfRawData"
;
92
case
END_ADDR
:
return
"EndAddressOfRawData"
;
93
case
INDEX_ADDR
:
return
"AddressOfIndex"
;
94
case
CALLBACKS_ADDR
:
return
"AddressOfCallBacks"
;
95
case
ZEROF_SIZE
:
return
"SizeOfZeroFill"
;
96
case
CHARACT
:
return
"Characteristics"
;
97
}
98
return
getName
();
99
}
100
101
Executable::addr_type
TlsDirWrapper::containsAddrType
(
size_t
fieldId,
size_t
subField)
102
{
103
switch
(fieldId) {
104
case
START_ADDR
:
105
case
END_ADDR
:
106
case
INDEX_ADDR
:
107
case
CALLBACKS_ADDR
:
108
return
Executable::VA
;
109
}
110
return
Executable::NOT_ADDR
;
111
}
112
113
//----------------
114
void
*
TlsEntryWrapper::getPtr
()
115
{
116
if
(!this->parentDir)
return
nullptr
;
117
118
bool
isOk =
false
;
119
const
offset_t
firstVA =
static_cast<
offset_t
>
(this->parentDir->getNumValue(
TlsDirWrapper::CALLBACKS_ADDR
, &isOk));
120
if
(!isOk || (firstVA == 0))
return
nullptr
;
121
122
const
offset_t
firstRaw =
m_Exe
->toRaw(firstVA,
Executable::VA
);
123
if
(firstRaw ==
INVALID_ADDR
) {
124
return
nullptr
;
125
}
126
127
const
bufsize_t
addrSize = this->parentDir->getFieldSize(
TlsDirWrapper::CALLBACKS_ADDR
);
128
const
offset_t
myRaw = firstRaw + (addrSize * this->
entryNum
);
129
BYTE *ptr =
m_Exe
->getContentAt(myRaw,
Executable::RAW
, addrSize);
130
return
ptr;
131
}
132
133
bufsize_t
TlsEntryWrapper::getSize
()
134
{
135
if
(!this->parentDir)
return
0;
136
const
bufsize_t
addrSize = this->parentDir->getFieldSize(
TlsDirWrapper::CALLBACKS_ADDR
);
137
return
addrSize;
138
}
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
PEFile.h
TlsDirWrapper.h
DataDirEntryWrapper::getDirEntryAddress
offset_t getDirEntryAddress()
Definition
DataDirEntryWrapper.cpp:19
ExeElementWrapper::m_Exe
Executable * m_Exe
Definition
ExeElementWrapper.h:65
ExeElementWrapper::getNumValue
virtual uint64_t getNumValue(size_t fieldId, size_t subField, bool *isOk)
Definition
ExeElementWrapper.cpp:73
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::VA
@ VA
Definition
Executable.h:46
Executable::BITS_32
@ BITS_32
Definition
Executable.h:31
Executable::BITS_64
@ BITS_64
Definition
Executable.h:32
Executable::getBitMode
virtual exe_bits getBitMode()
Definition
Executable.h:58
TlsDirWrapper::getName
virtual QString getName()
Definition
TlsDirWrapper.h:31
TlsDirWrapper::wrap
bool wrap()
Definition
TlsDirWrapper.cpp:4
TlsDirWrapper::getSize
virtual bufsize_t getSize()
Definition
TlsDirWrapper.cpp:34
TlsDirWrapper::getPtr
virtual void * getPtr()
Definition
TlsDirWrapper.cpp:26
TlsDirWrapper::CALLBACKS_ADDR
@ CALLBACKS_ADDR
Definition
TlsDirWrapper.h:17
TlsDirWrapper::ZEROF_SIZE
@ ZEROF_SIZE
Definition
TlsDirWrapper.h:18
TlsDirWrapper::END_ADDR
@ END_ADDR
Definition
TlsDirWrapper.h:15
TlsDirWrapper::INDEX_ADDR
@ INDEX_ADDR
Definition
TlsDirWrapper.h:16
TlsDirWrapper::CHARACT
@ CHARACT
Definition
TlsDirWrapper.h:19
TlsDirWrapper::START_ADDR
@ START_ADDR
Definition
TlsDirWrapper.h:14
TlsDirWrapper::getFieldPtr
virtual void * getFieldPtr(size_t fieldId, size_t subField)
Definition
TlsDirWrapper.cpp:70
TlsDirWrapper::getFieldName
virtual QString getFieldName(size_t fieldId)
Definition
TlsDirWrapper.cpp:88
TlsDirWrapper::containsAddrType
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
Definition
TlsDirWrapper.cpp:101
TlsEntryWrapper
Definition
TlsDirWrapper.h:47
TlsEntryWrapper::getSize
virtual bufsize_t getSize()
Definition
TlsDirWrapper.cpp:133
TlsEntryWrapper::getPtr
virtual void * getPtr()
Definition
TlsDirWrapper.cpp:114
TlsEntryWrapper::CALLBACK_ADDR
@ CALLBACK_ADDR
Definition
TlsDirWrapper.h:52
Generated by
1.17.0