| 175 | } |
| 176 | |
| 177 | std::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 | } |
no test coverage detected