20 if (!isOk)
return NULL;
21 BYTE *ptr = this->m_Exe->getContentAt(offset,
Executable::RVA,
sizeof(IMAGE_IMPORT_BY_NAME));
22 return (IMAGE_IMPORT_BY_NAME*) ptr;
27 if (!parentNode)
return 0;
28 bool is32 = isBit32();
31 uint64_t thunkRva = parentNode->getNumValue(fId, &isOk);
34 if (is32) thunkRva = (int32_t)(thunkRva);
35 if (thunkRva == 0 || thunkRva == (-1))
return 0;
37 size_t thunkValSize = this->getThunkValSize();
38 offset_t offset = this->entryNum * thunkValSize;
40 offset_t fieldRVA = thunkRva + offset;
46 if (!parentNode)
return NULL;
47 bool is64 = isBit64();
50 uint64_t thunkRva = parentNode->getNumValue(fId, &isOk);
55 if (!is64) thunkRva = (int32_t)(thunkRva);
56 if (thunkRva == 0 || thunkRva == -1)
return NULL;
58 bufsize_t thunkValSize = this->getThunkValSize();
62 void* thunkPtr = m_Exe->getContentAt(thunkAddr, thunkValSize);
72 void* thunkPtr = getPtr();
73 if (!thunkPtr)
return 0;
76 uint64_t* ptr = (uint64_t*) thunkPtr;
78 if (ordinal & ORDINAL_FLAG64) ordinal ^= ORDINAL_FLAG64;
81 uint32_t* ptr = (uint32_t*) thunkPtr;
83 if (uint32_t(ordinal) & ORDINAL_FLAG32) ordinal ^= ORDINAL_FLAG32;
98 uint64_t* ptr = (uint64_t*) p;
99 if ((*ptr) & ORDINAL_FLAG64)
return true;
102 uint32_t* ptr = (uint32_t*) p;
103 if ((*ptr) & ORDINAL_FLAG32)
return true;
111 if (isByOrdinal())
return NULL;
113 IMAGE_IMPORT_BY_NAME* dataPtr = this->getImportByNamePtr();
114 if (!dataPtr)
return NULL;
115 char *name = (
char*) dataPtr->Name;
121 return getAddrSize();
126 bool is64 = isBit64();
127 void *entryPtr = this->getPtr();
128 if (entryPtr == NULL)
return NULL;
130 IMAGE_THUNK_DATA32* en32 = is64 ? NULL : (IMAGE_THUNK_DATA32*) entryPtr;
131 IMAGE_THUNK_DATA64* en64 = is64 ? (IMAGE_THUNK_DATA64*) entryPtr : NULL;
139 if (isByOrdinal())
return NULL;
140 IMAGE_IMPORT_BY_NAME* dataPtr = this->getImportByNamePtr();
141 return (
void*) &dataPtr->Hint;
149 if (fieldId == HINT)
return sizeof (WORD);
150 bufsize_t entrySize = (isBit64()) ?
sizeof(uint64_t) :
sizeof(uint32_t);
157 case ORIG_THUNK:
return "Original Thunk";
158 case THUNK:
return "Thunk";
159 case FORWARDER:
return "Forwarder";
160 case HINT :
return "Hint";
167 if (this->isByOrdinal()) {
190 entries.push_back(func);
199 if (m_PE == NULL)
return NULL;
200 IMAGE_DATA_DIRECTORY *d = m_PE->getDataDirectory();
203 offset_t importRva =
static_cast<offset_t>(d[pe::DIR_IMPORT].VirtualAddress);
204 if (importRva == 0)
return NULL;
210 BYTE *dirPtr = this->m_Exe->getContentAt(descAddr,
Executable::RAW,
sizeof(IMAGE_IMPORT_DESCRIPTOR));
211 if (dirPtr == NULL)
return NULL;
213 offset_t entryOffset = descAddr + (this->entryNum *
sizeof(IMAGE_IMPORT_DESCRIPTOR));
215 BYTE *content = this->m_Exe->getContentAt(entryOffset,
Executable::RAW,
sizeof(IMAGE_IMPORT_DESCRIPTOR));
216 if (!content)
return NULL;
217 return (
void*) content;
222 return sizeof(IMAGE_IMPORT_DESCRIPTOR);
227 char *name = getLibraryName();
228 if (!name)
return "";
234 void *ptr = this->getPtr();
235 IMAGE_IMPORT_DESCRIPTOR* desc = (IMAGE_IMPORT_DESCRIPTOR*) ptr;
236 if (!desc)
return false;
238 if (desc->TimeDateStamp == (-1))
return true;
244 void *ptr = this->getPtr();
245 IMAGE_IMPORT_DESCRIPTOR* desc = (IMAGE_IMPORT_DESCRIPTOR*) ptr;
246 if (!desc)
return NULL;
249 case ORIG_FIRST_THUNK:
return (
void*) &desc->OriginalFirstThunk;
250 case TIMESTAMP:
return (
void*) &desc->TimeDateStamp;
251 case FORWARDER:
return (
void*) &desc->ForwarderChain;
252 case NAME:
return (
void*) &desc->Name;
253 case FIRST_THUNK:
return (
void*) &desc->FirstThunk;
261 case ORIG_FIRST_THUNK:
return "OriginalFirstThunk";
262 case TIMESTAMP:
return "TimeDateStamp";
263 case FORWARDER:
return "Forwarder";
264 case NAME:
return "NameRVA";
265 case FIRST_THUNK:
return "FirstThunk";
267 return this->getName();
273 case ORIG_FIRST_THUNK:
283 IMAGE_IMPORT_DESCRIPTOR* desc = (IMAGE_IMPORT_DESCRIPTOR*) getPtr();
293 char *name = (
char*) m_Exe->getContentAt(nAddr,
sizeof(
char));
294 offset_t peSize = m_Exe->getRawSize();
296 bufsize_t upperLimit = m_Exe->getMaxSizeFromPtr((BYTE*) name);
298 int32_t limit = (uint32_t) upperLimit < HARD_LIMIT ? upperLimit : HARD_LIMIT;
301 if (upperLimit < HARD_LIMIT) {
314 if (pe == NULL)
return NULL;
322 IMAGE_DATA_DIRECTORY *d = getDataDirectory();
325 uint32_t importRva = d[pe::DIR_IMPORT].VirtualAddress;
326 if (importRva == 0)
return NULL;
331 BYTE *dirPtr = this->m_Exe->getContentAt(descAddr,
Executable::RAW,
sizeof(IMAGE_IMPORT_DESCRIPTOR));
332 if (dirPtr == NULL)
return NULL;
333 return (IMAGE_IMPORT_DESCRIPTOR*) dirPtr;
339 if (!imp || !imp->
getPtr()) {
354 if (!thunk && !oThunk) {
358 entries.push_back(imp);
364 size_t fields = getFieldsCount() + 1;
365 return static_cast<bufsize_t>(fields) *
sizeof(IMAGE_IMPORT_DESCRIPTOR);
const offset_t INVALID_ADDR
virtual uint64_t getNumValue(size_t fieldId, size_t subField, bool *isOk)
static bufsize_t NameLenLimit
IMAGE_DATA_DIRECTORY * getDataDirectory()
virtual bufsize_t getSize()
virtual bool loadNextEntry(size_t cntr)
IMAGE_IMPORT_DESCRIPTOR * firstDescriptor()
virtual QString getName()
virtual QString getFieldName(size_t fieldId)
bool loadNextEntry(size_t entryNum)
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
virtual bufsize_t getSize()
virtual void * getFieldPtr(size_t fieldId, size_t subField=FIELD_NONE)
virtual bufsize_t getSize()
virtual Executable::addr_type containsAddrType(size_t fieldId, size_t subField=FIELD_NONE)
virtual QString getFieldName(size_t fieldId)
void * getValuePtr(ImportEntryWrapper::FieldID fId)
offset_t getFieldRVA(ImportEntryWrapper::FieldID fId)
virtual IMAGE_IMPORT_BY_NAME * getImportByNamePtr()
virtual bufsize_t getFieldSize(size_t fieldId, size_t subField=FIELD_NONE)
IMAGE_DATA_DIRECTORY * getDataDirectory()
bool isStrLonger(const char *inp, size_t maxLen)