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 
4 size_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 
46 void* 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 
61 IMAGE_TLS_DIRECTORY32* TlsDirWrapper::tls32()
62 {
63  if (m_Exe->getBitMode() != Executable::BITS_32) return NULL;
64  return (IMAGE_TLS_DIRECTORY32*) getTlsDirPtr();
65 }
66 
67 IMAGE_TLS_DIRECTORY64* TlsDirWrapper::tls64()
68 {
69  if (m_Exe->getBitMode() != Executable::BITS_64) return NULL;
70  return (IMAGE_TLS_DIRECTORY64*) getTlsDirPtr();
71 }
72 
73 void* 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 
91 QString 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  }
113  return Executable::NOT_ADDR;
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()
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
Definition: Executable.h:57
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
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