BearParser
Portable Executable parsing library (from PE-bear)
Loading...
Searching...
No Matches
TlsDirWrapper.cpp
Go to the documentation of this file.
1#include "pe/TlsDirWrapper.h"
2#include "pe/PEFile.h"
3
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
27{
28 if (m_Exe->getBitMode() == Executable::BITS_32) {
29 return tls32();
30 }
31 return tls64();
32}
33
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
43void* TlsDirWrapper::getTlsDirPtr()
44{
45 bufsize_t dirSize = 0;
46
48 dirSize = sizeof(IMAGE_TLS_DIRECTORY32);
49 } else if (m_Exe->getBitMode() == Executable::BITS_64) {
50 dirSize = sizeof(IMAGE_TLS_DIRECTORY64);
51 }
52
54 BYTE *ptr = m_Exe->getContentAt(rva, Executable::RVA, dirSize);
55 return ptr;
56}
57
58IMAGE_TLS_DIRECTORY32* TlsDirWrapper::tls32()
59{
60 if (m_Exe->getBitMode() != Executable::BITS_32) return NULL;
61 return (IMAGE_TLS_DIRECTORY32*) getTlsDirPtr();
62}
63
64IMAGE_TLS_DIRECTORY64* TlsDirWrapper::tls64()
65{
66 if (m_Exe->getBitMode() != Executable::BITS_64) return NULL;
67 return (IMAGE_TLS_DIRECTORY64*) getTlsDirPtr();
68}
69
70void* 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
88QString 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
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 }
111}
112
113//----------------
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
134{
135 if (!this->parentDir) return 0;
136 const bufsize_t addrSize = this->parentDir->getFieldSize(TlsDirWrapper::CALLBACKS_ADDR);
137 return addrSize;
138}
const offset_t INVALID_ADDR
uint64_t offset_t
size_t bufsize_t
offset_t getDirEntryAddress()
virtual uint64_t getNumValue(size_t fieldId, size_t subField, bool *isOk)
std::vector< ExeNodeWrapper * > entries
virtual void clear()
virtual exe_bits getBitMode()
Definition Executable.h:56
virtual QString getName()
virtual bufsize_t getSize()
virtual void * getPtr()
virtual void * getFieldPtr(size_t fieldId, size_t subField)
virtual QString getFieldName(size_t fieldId)
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
virtual bufsize_t getSize()
virtual void * getPtr()
@ CALLBACK_ADDR