все заметки

Решаем задачу chrome.dll failed to load pdb info

2024.10.25 (редактировано: 2024.12.17)
В продолжении темы IDA Pro: chrome.dll failed to load pdb info

Оказалось, что вся проблема в размере файла. Он больше чем 4294967295 (0xFFFFFFFF) байт.

Было принято решение разобраться в PDB формате и попробовать как то минимизировать файл.
Информации имеется достаточно: https://llvm.org/docs/PDB/index.html

Это MSF (Multi-Stream Format) файл, это потоки-потоки-потоки.
А потоки состоят из страниц одного размера. В нашем случае 0x2000.

Опираясь на документацию и на собственные исследование получаем такие потоки:

  • 0 - хранит информацию о размере потоков в байтах и перечесление страниц где находятся данные этих потоков
  • 1 - PDB - информация о текущем PDB с guid
  • 2 - TPI - типы и структуры
  • 3 - DBI - symbols - ссылки на потоки где указываются названия функций
  • ... далее неважно (пока)

Основные данные это 2 и 3 потоки, 30 и 60 процентов от размера файла соответственно.

И пришла идея распарсить все это дело и упаковать в два разных PDB:

  • один со структурой и всем остальным (без третьего потока)
  • один с функциями и всем остальным (без второго потока)

Исходников по структуре и по обработке:

Но C++ и Rust это для слабаков.

Мы по хардкору будем использовать PHP.

Этапы:

1. Читаем заголовок. В нем важная информация:
  • размер страниц в байтах
  • сколько страниц всего в файле (умножить на размер страницы получим размер файла)
  • где находится описание всех страниц

2. Читаем страницу с описанием блоков

3. Все страницы в этом блоке идут от 0x00. Потоки попорядку, но могут находится на разных страницах.
Нулевой поток тому пример. Он почти вконце файла.
Читаем:

  • количество потоков
  • размеры этих потоков в байтах (но все равно это выравнивается размером блока)
  • страницы потоков, все это попорядку идет

Это основная информация которая нам нужна.

Пересобираем:

  • берем нужные стримы и пропускаем ненужный
  • подсчитываем страницы
  • генерируем основную страницу

Готово:

  • chrome.dll.skip-dbi.pdb - пропущен DBI поток
  • chrome.dll.skip-tpi.pdb - пропущен TPI поток

Получаем чудо 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

еще по теме реверс инжиниринг