Оказалось, что вся проблема в размере файла. Он больше чем 4294967295 (0xFFFFFFFF) байт.
Было принято решение разобраться в PDB формате и попробовать как то минимизировать файл.
Информации имеется достаточно: https://llvm.org/docs/PDB/index.html
Это MSF (Multi-Stream Format) файл, это потоки-потоки-потоки.
А потоки состоят из страниц одного размера. В нашем случае 0x2000.
Опираясь на документацию и на собственные исследование получаем такие потоки:
Основные данные это 2 и 3 потоки, 30 и 60 процентов от размера файла соответственно.
И пришла идея распарсить все это дело и упаковать в два разных PDB:
Исходников по структуре и по обработке:
Но C++ и Rust это для слабаков.
Мы по хардкору будем использовать PHP.
Этапы:
2. Читаем страницу с описанием блоков
3. Все страницы в этом блоке идут от 0x00. Потоки попорядку, но могут находится на разных страницах.
Нулевой поток тому пример. Он почти вконце файла.
Читаем:
Это основная информация которая нам нужна.
Пересобираем:
Готово:
Получаем чудо pdbskip (скачать)
Загружаем поочереди эти PDB в IDA. Получаем удовлетворение.
Да, при загрузки без DBI появляется окно что подпись не совпадает, но продолжаем.
Текущая версия 130.0.6723.59, PDB на 400Mb меньше чем в 128 и 129 версиях (на них тоже репак тестировался)
https://chromium-browser-symsrv.commondatastorage.googleapis.com/chrome.dll.pdb/0FB6AE8216A88EBE4C4C44205044422E1/chrome.dll.pdb
Лог из IDA:
PDB: using PDBIDA provider\nPDB: loading chrome.dll.pdb\nPDB: File chrome.dll.pdb is the malformed PDB file\n\nPDB: loading E:\debug\chrome\130.0.6723.59\chrome.dll.skip-dbi.pdb\nPDB: loaded 3151550 types\nPDB: total 0 symbols loaded for "E:\debug\chrome\130.0.6723.59\chrome.dll.skip-dbi.pdb"\n\nPDB: loading E:\debug\chrome\130.0.6723.59\chrome.dll.skip-tpi.pdb\nPDB: loaded 1209755 types\nPDB: total 725742 symbols loaded for "E:\debug\chrome\130.0.6723.59\chrome.dll.skip-tpi.pdb"\n