При использовании интерактивного дизассемблера IDA (6.х+ версий) на некоторых системах наблюдается интересная проблема: при типовой загрузке произвольного файла, для которого имеется отладочная информация, программа сперва выдает запрос на подгрузку файла символов (.pdb-файл) с сервера Microsoft или локального хранилища символов:
а затем, уже непосредственно при попытке загрузки файла символов с сервера символов Microsoft, может выскочить такая вот ошибка:
<имя_модуля>: failed to load pdb info. интерфейс не поддерживается.
Теперь, если обратить внимание на фрейм в нижней части интерфейсного окна IDA (output window), то можно увидеть дополнительные детали инцидента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
. . . Loading file 'C:\Windows\System32\printui.exe' into database... Detected file format: Portable executable for 80386 (PE) 0. Creating a new segment (01001000-01002000) ... ... OK 1. Creating a new segment (01002000-01003000) ... ... OK Reading imports directory... Applying fixups... 2. Creating a new segment (010010B8-01002000) ... ... OK Possible file format: PE executable (C:\Program Files\IDA 6.6\loaders\dbg.ldw) DWARF: No libdwarf found. PDB: could not process file C:\Windows\System32\printui.exe with DIA: Интерфейс не поддерживается << It appears that MS DIA SDK is not installed. Please try installing "Microsoft Visual C++ 2008 Redistributable Package / x86" >> Assuming __cdecl calling convention by default Type library 'mssdk' loaded. Applying types... Types applied to 30 names. Plan FLIRT signature: Microsoft VisualC 2-11/net runtime autoload.cfg: vc32rtf.sig autoloads mssdk.til main() function at 10012E8, named "_wWinMain@16" Marking typical code sequences... Flushing buffers, please wait...ok File 'C:\Windows\System32\printui.exe' has been successfully loaded into the database. . . . |
Тем не менее немногие догадываются туда заглянуть. Внимательные пользователи будут вознаграждены экономией некоторого количества времени. Если вы обратите внимание на подсвеченные строки, то увидите там как само сообщение об ошибке:
1 |
PDB: could not process file C:\Windows\System32\printui.exe with DIA: Интерфейс не поддерживается |
,так и рекомендацию по устранению:
1 |
It appears that MS DIA SDK is not installed. Please try installing "Microsoft Visual C++ 2008 Redistributable Package / x86" |
Полезно быть внимательным, не находите? Но и невнимательным быть то же неплохо, поскольку невнимательные тратят то же драгоценное время на поиск, что ведет к открытию для себя незнакомых ранее системных механизмов, существенно расширяя кругозор.
Теория
Перво-наперво нам следует понять, что дизассемблеры/отладчики должны иметь возможность загружать и использовать символьную информацию из PDB-файлов в случае, если для загружаемого в данный момент для дизассемблирования модуля имеется прилинкованная отладочная информация. Причина проста - отладочная информация (часто называемая символами), используется этим инструментами для расширенного (более подробного) комментирования, а соответственно и улучшения качества листинга исходного кода. Логично предположить, что для обеспечения загрузки отладочной информации, должен присутствовать некий внутренний или внешний системный механизм? В строке, содержащей рекомендации по устранению ошибки (окно журналирования), фигурирует некий новый для нас термин под названием MS DIA SDK
.
IDA производит загрузку PDB-файлов используя следующие методы:
- DbgHelp API (ранее
ImageHlp
) -- старый метод. Библиотека dbghelp.dll, содержащая набор функций обеспечения отладки, позволяющих работать с исполняемыми образами в формате PE (portable executable); - DIA API -- новый метод. Библиотеки msdia90.dll, msdia100.dll, обеспечивающие продвинутый интерфейс (API) доступа к интерфейсу отладки;
Если IDA не находит DIA-библиотек, IDA вынуждена использовать "старый" метод, и что-то у неё с ним явно не клеится. Так как же мы будем устранять ошибку IDA интерфейс не поддерживается?
Решение №1
Судя по подсказке в окне логгирования, нам требуется скачать и установить распространяемый пакет под названием Microsoft Visual C++ 2008 Redistributable Package (x86). Для этого переходим по ссылке Microsoft Visual C++ 2008 Redistributable Package (x86), выбираем требуемый язык пакета и скачиваем. После установки распространяемого пакета, мы можем убедиться в присутствии в нашей системе необходимых библиотек интерфейса DIA. Для этого проверяем директорию C:\Program Files\Common Files\microsoft shared\VC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
C:\Users\user>cd "c:\Program Files (x86)\Common Files\microsoft shared\VC" c:\Program Files (x86)\Common Files\microsoft shared\VC>dir Том в устройстве C не имеет метки. Серийный номер тома: 8854-8D21 Содержимое папки c:\Program Files (x86)\Common Files\microsoft shared\VC 27.08.2014 15:19 <DIR> . 27.08.2014 15:19 <DIR> .. 13.01.2014 14:39 <DIR> amd64 19.02.2011 22:03 799 568 msdia100.dll 12.07.2009 11:11 670 016 msdia90.dll 2 файлов 1 469 584 байт 3 папок 148 379 226 112 байт свободно |
При наличии в системе указанных библиотек, IDA получает возможность загружать отладочную информацию посредством DIA-библиотек в противоположность использования метода dbghelp.dll. После установки библиотек фрагмент лог-файла процесса загрузки символов выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
. . . Loading file 'C:\Windows\System32\printui.exe' into database... Detected file format: Portable executable for 80386 (PE) 0. Creating a new segment (01001000-01002000) ... ... OK 1. Creating a new segment (01002000-01003000) ... ... OK Reading imports directory... Applying fixups... 2. Creating a new segment (010010B8-01002000) ... ... OK Possible file format: PE executable (C:\Program Files\IDA 6.6\loaders\dbg.ldw) DWARF: No libdwarf found. PDB: using DIA dll "C:\Program Files\Common Files\Microsoft Shared\VC\msdia90.dll" PDB: DIA interface version 9.0 PrintUI.pdb: not found, trying with the input file C:\Windows\System32\printui.exe Trying loadDataForExe with ffffffff loadDataForExe: 0 Assuming __cdecl calling convention by default Type library 'mssdk' loaded. Applying types... Types applied to 30 names. PDB: loaded 0 types PDB: total 96 symbols loaded for C:\Windows\System32\printui.exe Plan FLIRT signature: Microsoft VisualC 2-11/net runtime autoload.cfg: vc32rtf.sig autoloads mssdk.til Plan FLIRT signature: MFC 3.1-11.0 32bit autoload.cfg: vc32mfc.sig autoloads mssdk.til main() function at 10012E8, named "_wWinMain@16" Marking typical code sequences... Flushing buffers, please wait...ok File 'C:\Windows\System32\printui.exe' has been successfully loaded into the database. . . . |
Решение №2
Возможно, версии этих файлов уже сильно устарели, и можно попробовать следующее решение:
- Скачать и установить Пакет SDK;
- Переписать файлы dbghelp.dll и symsrv.dll из директории пакета SDK (C:\Program Files\Windows Kits\XX\Debuggers\x86) в корневую директорию IDA (C:\Program Files\IDA X.X);