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