11std::map<DWORD, QString> SectionHdrWrapper::s_secHdrCharact;
15 char rights[] =
"---";
17 if (characteristics & SCN_MEM_READ)
19 if (characteristics & SCN_MEM_WRITE)
21 if (characteristics & SCN_MEM_EXECUTE)
28 secHdrCharact[SCN_MEM_READ] =
"readable";
29 secHdrCharact[SCN_MEM_WRITE] =
"writeable";
30 secHdrCharact[SCN_MEM_EXECUTE] =
"executable";
32 secHdrCharact[SCN_LNK_NRELOC_OVFL] =
"contains extended relocations";
33 secHdrCharact[SCN_MEM_DISCARDABLE] =
"discardable";
34 secHdrCharact[SCN_MEM_NOT_CACHED] =
"not cachable";
35 secHdrCharact[SCN_MEM_NOT_PAGED] =
"pageable";
36 secHdrCharact[SCN_MEM_SHARED] =
"shareable";
37 secHdrCharact[SCN_CNT_CODE] =
"code";
38 secHdrCharact[SCN_CNT_INITIALIZED_DATA] =
"initialized data";
39 secHdrCharact[SCN_CNT_UNINITIALIZED_DATA] =
"uninitialized data";
44 if (s_secHdrCharact.size() == 0) {
47 std::vector<DWORD> chSet;
48 std::map<DWORD, QString>::iterator iter;
49 for (iter = s_secHdrCharact.begin(); iter != s_secHdrCharact.end(); iter++) {
50 if (charact & iter->first) {
51 chSet.push_back(iter->first);
59 if (s_secHdrCharact.size() == 0) {
63 if (s_secHdrCharact.find(charact) == s_secHdrCharact.end())
return "";
64 return s_secHdrCharact[charact];
81 if (
m_PE == NULL)
return NULL;
84 return (
void*) this->header;
88 offset_t secOffset = firstSecOffset + (this->
sectNum *
sizeof(IMAGE_SECTION_HEADER));
91 this->header = (IMAGE_SECTION_HEADER*)
m_PE->
getContentAt(secOffset,
sizeof(IMAGE_SECTION_HEADER));
92 return (
void*) this->header;
97 IMAGE_SECTION_HEADER* header = (IMAGE_SECTION_HEADER*)
getPtr();
98 if (!header)
return false;
107 this->
name = (
char*)::calloc(BUF_LEN, 1);
109 memset(this->
name, 0, BUF_LEN);
110 snprintf(this->
name, BUF_LEN,
"%.8s", (
char*) header->Name);
120 if (
m_PE == NULL)
return 0;
121 return sizeof(IMAGE_SECTION_HEADER);
127 if (!this->
name)
return "";
133 IMAGE_SECTION_HEADER* sec = (IMAGE_SECTION_HEADER*)
getPtr();
134 if (!sec)
return NULL;
135 if (!this->
name)
return NULL;
138 case NAME:
return (
void*) &sec->Name;
139 case VSIZE:
return (
void*) &sec->Misc.VirtualSize;
140 case VPTR:
return (
void*) &sec->VirtualAddress;
141 case RSIZE:
return (
void*) &sec->SizeOfRawData;
142 case RPTR:
return(
void*) &sec->PointerToRawData;
144 case RELOC_PTR:
return (
void*) &sec->PointerToRelocations;
145 case RELOC_NUM:
return (
void*) &sec->NumberOfRelocations;
146 case LINENUM_PTR:
return (
void*) &sec->PointerToLinenumbers;
147 case LINENUM_NUM:
return (
void*) &sec->NumberOfLinenumbers;
149 case CHARACT:
return (
void*) &sec->Characteristics;
158 case NAME:
return "Name";
159 case VSIZE:
return "Virtual Size";
160 case VPTR:
return "Virtual Addr.";
161 case RSIZE:
return "Raw size";
162 case RPTR:
return "Raw Addr.";
163 case CHARACT:
return "Characteristics";
185 if (fieldId ==
NAME) {
199 offset =
static_cast<offset_t>(this->header->PointerToRawData);
201 offset =
static_cast<offset_t>(this->header->VirtualAddress);
214 if (offset > peSize) {
223 const bool useMapped =
true;
234 if (this->header == NULL)
return 0;
238 size =
static_cast<bufsize_t>(this->header->SizeOfRawData);
240 size =
static_cast<bufsize_t>(this->header->Misc.VirtualSize);
260 if (secOffset > peSize) {
268 const bufsize_t secEnd = secOffset + roundedUpSize;
271 if (secEnd > peSize) {
272 const bufsize_t trimmedSize = peSize - secOffset;
280 if ((virtualSize != 0) && (trimmedSize > virtualSize)) {
285 return roundedUpSize;
303 bufsize_t mVirtualSize = (dVirtualSize > mRawSize) ? dVirtualSize : mRawSize;
309 const bufsize_t secEnd = startOffset + mVirtualSize;
311 if (secEnd > imgSize) {
312 const bufsize_t trimmedSize = imgSize - startOffset;
320 if (!this->header || !
m_PE)
return 0;
346 if (sEntry == NULL) {
356 if (entrySize == 0)
return false;
365 if (
m_PE == NULL)
return NULL;
372 size_t count = secCount + 1;
389 if (sec == NULL)
return false;
390 if (sec->
getPtr() == NULL) {
403 if (sec == NULL)
return;
417 if (
rSec.find(endRaw) !=
rSec.end()) {
419 if (prevSec == NULL)
return;
435 for (
size_t i = 0; i < count; i++) {
437 if (sec == NULL)
continue;
445 if (this->
m_PE == NULL)
return false;
449 for (
size_t i = 0; i < count; i++) {
462 if (
entries.size() == 0)
return NULL;
468 if (this->
m_PE == NULL)
return 0;
474 offset_t endOffset = hdrOffset + (secCount *
sizeof(IMAGE_SECTION_HEADER));
476 if (endOffset > fileSize) {
479 return bufsize_t (endOffset - hdrOffset);
490 if (fieldId >=
entries.size())
return NULL;
491 return entries[fieldId]->getName();
496 size_t size = this->
entries.size();
497 std::map<offset_t, SectionHdrWrapper*> *secMap = NULL;
500 secMap = &this->
rSec;
502 secMap = &this->
vSec;
504 if (secMap == NULL)
return NULL;
506 std::map<offset_t, SectionHdrWrapper*>::iterator found = secMap->lower_bound(offset);
507 std::map<offset_t, SectionHdrWrapper*>::iterator itr;
508 for (itr = found; itr != secMap->end(); itr++) {
510 if (sec == NULL)
continue;
512 printf(
"found [%llX] key: %llX sec: %llX %llX\n",
513 static_cast<unsigned long long>(offset),
514 static_cast<unsigned long long>(itr->first),
525 if (offset >= startOffset && offset < endOffset) {
528 if (offset < startOffset)
break;
535 std::map<offset_t, SectionHdrWrapper*> *secMap = NULL;
538 secMap = &this->
rSec;
540 secMap = &this->
vSec;
542 if (secMap == NULL)
return;
544 std::map<offset_t, SectionHdrWrapper*>::iterator itr;
545 for (itr = secMap->begin(); itr != secMap->end(); itr++) {
549 printf(
"[%llX] %s %llX %llX\n",
550 static_cast<unsigned long long>(secEnd),
551 sec->
getName().toStdString().c_str(),
const offset_t INVALID_ADDR
virtual bufsize_t getContentSize()=0
bool isAreaEmpty(offset_t rawOffset, bufsize_t size)
virtual bufsize_t getContentSize()
ExeNodeWrapper * getLastEntry()
virtual ExeNodeWrapper * getEntryAt(size_t fieldId)
virtual bufsize_t geEntrySize()
std::vector< ExeNodeWrapper * > entries
virtual offset_t getNextEntryOffset()
virtual size_t getEntriesCount()
virtual ExeNodeWrapper * addEntry(ExeNodeWrapper *entry)
BYTE * getContentAt(offset_t offset, bufsize_t size, bool allowExceptions=false)
virtual offset_t getRawSize() const
virtual bufsize_t getImageSize()
virtual bufsize_t getMappedSize(Executable::addr_type aType)
offset_t secHdrsOffset() const
bool setHdrSectionsNum(size_t newNum)
size_t hdrSectionsNum() const
virtual bufsize_t getAlignment(Executable::addr_type aType) const
std::map< offset_t, SectionHdrWrapper * > rSec
void printSectionsMapping(Executable::addr_type aType)
ExeNodeWrapper * addEntry(ExeNodeWrapper *entry)
virtual bufsize_t getSize()
virtual bool loadNextEntry(size_t entryNum)
virtual QString getFieldName(size_t fieldId)
SectionHdrWrapper * getSecHdrAtOffset(offset_t offset, Executable::addr_type addrType, bool roundup, bool verbose=false)
bool isMyEntryType(ExeNodeWrapper *entry)
virtual void reloadMapping()
static size_t SECT_COUNT_MAX
std::map< offset_t, SectionHdrWrapper * > vSec
void addMapping(SectionHdrWrapper *sec)
static size_t SECT_INVALID_INDEX
virtual size_t getFieldsCount()
static std::vector< DWORD > splitCharacteristics(DWORD characteristics)
bufsize_t getMappedVirtualSize()
virtual QString getName()
virtual QString getFieldName(size_t fieldId)
offset_t getContentDeclaredOffset(Executable::addr_type aType)
static void initSecCharacter(std::map< DWORD, QString > &secHdrCharact)
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
bufsize_t getContentDeclaredSize(Executable::addr_type aType)
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
static QString translateCharacteristics(DWORD charact)
bufsize_t getContentSize(Executable::addr_type aType, bool recalculate)
offset_t getContentEndOffset(Executable::addr_type aType, bool roundup)
offset_t getContentOffset(Executable::addr_type aType, bool useMapped=true)
static QString getSecHdrAccessRightsDesc(DWORD characteristics)
bufsize_t getMappedRawSize()
static const size_t SECNAME_LEN
virtual WrappedValue::data_type containsDataType(size_t fieldId, size_t subField=FIELD_NONE)
virtual bufsize_t getSize()
bool append(dbg_level lvl, const char *format,...)
bufsize_t roundupToUnit(bufsize_t size, bufsize_t unit)