MCPcopy Create free account
hub / github.com/BeneficialCode/WinArk / GetImports

Method GetImports

PEParser/PEParser.cpp:177–239  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

175}
176
177std::vector<ImportedLibrary> PEParser::GetImports() const {
178 std::vector<ImportedLibrary> libs;
179
180 if (!IsValid())
181 return libs;
182
183 auto dir = GetDataDirectory(IMAGE_DIRECTORY_ENTRY_IMPORT);
184 if (dir->Size == 0)
185 return libs;
186
187 auto imports = static_cast<IMAGE_IMPORT_DESCRIPTOR*>(GetAddress(dir->VirtualAddress));
188 auto inc = IsPe64() ? 8 : 4;
189 char undecorated[1 << 10];
190
191 for (;;) {
192 auto offset = imports->OriginalFirstThunk == 0 ? imports->FirstThunk : imports->OriginalFirstThunk;
193 if (offset == 0)
194 break;
195 auto iat = static_cast<PBYTE>(GetAddress(offset));
196 auto libName = static_cast<PBYTE>(GetAddress(imports->Name));
197
198 ImportedLibrary lib;
199 lib.Name = (PCSTR)libName;
200 lib.IAT = imports->FirstThunk;
201
202 for (;;) {
203 int ordinal = -1;
204 int nameRva = 0;
205 if (inc == 8) {
206 auto value = *(ULONGLONG*)iat;
207 if (value == 0)
208 break;
209 auto isOrdinal = (value & (1ULL << 63)) > 0;
210 if (isOrdinal)
211 ordinal = (unsigned short)(value & 0xffff);
212 else
213 nameRva = (int)(value & ((1LL << 31) - 1));
214 }
215 else {
216 auto value = *(ULONG*)iat;
217 auto isOrdinal = (value & (1UL << 31)) > 0;
218 if (isOrdinal)
219 ordinal = (unsigned short)(value & 0xffff);
220 else
221 nameRva = (int)(value & ((1LL << 31) - 1));
222 }
223 if (nameRva == 0)
224 break;
225 auto p = static_cast<IMAGE_IMPORT_BY_NAME*>(GetAddress(nameRva));
226 ImportedSymbol symbol;
227 symbol.Hint = p->Hint;
228 symbol.Name = p->Name;
229 if (::UnDecorateSymbolName(symbol.Name.c_str(), undecorated, sizeof(undecorated), 0))
230 symbol.UndecoratedName = undecorated;
231 lib.Symbols.push_back(std::move(symbol));
232
233 iat += inc;
234 }

Callers 2

CheckIATHookMethod · 0.80
ParseTableEntryMethod · 0.80

Calls 1

push_backMethod · 0.80

Tested by

no test coverage detected