Предыстория (делюсь болью)

Сидел я тут на днях ковырял образы винды различными утилитами (хотя изначально должен был использовать oscdimg.exe), но желаемой цели добиться не мог. И всё же решил загрузить oscdigm, но мелкомягкие приготовили целый квест...
Для тех кто не вкурсе поясню, oscdimg.exe - это экзешник ввесом около 400 КБ, который позволяет через ps редактировать ISO-образы. Только Microsoft решили впихнуть его в пакет Windows ADK, загрузить который можно с оф.сайта в двух вариантах (с онлайн-установкой и "офлайн-установкой"). Вы скачиваете .exe для установки ADK, потом он обращается к серверу Microsoft Store, догружает всё что нужно и готово. Но так как, у меня (не только у меня, но всё же) существует ряд проблем с работой Microsoft Store, загрузкой приложений из него - то онлайн вариант нам не подошел. И я уверенный в своих силах, решил сейчас скачаю офлайн-инсталлер, установлю пакет ADK, уберу всё лишнее и буду использовать oscdimg. Да вот только "офлайн"-инстраллер, работает крайне интересным способом:

Комментарии излишне
Комментарии излишне

Цель - один исполняемый файл весом 400 КБ. Официальный путь - скачать Windows ADK размером в несколько гигабайт, установить, найти нужный .exe, удалить установщик. Именно так Microsoft предлагает получить oscdimg.exe 

Но есть способ лучше. В этой статье разберём технику прямой загрузки PE-исполняемых файлов с серверов Microsoft, поймём, как она устроена изнутри, и напишем инструментарий для автоматизации.

Что такое Microsoft Symbol Server

Microsoft поддерживает публичный сервер отладочных символов по адресу msdl.microsoft.com. Формально он предназначен для отладчиков WinDbg, Visual Studio, чтобы те могли скачивать PDB-файлы с отладочными символами для системных библиотек.

Менее очевидный факт: помимо PDB-файлов, тот же сервер хранит и сами PE-бинарники: .exe и .dll. Именно этим мы и воспользуемся.

Небольшой дисклеймер:
Сервер предназначен для отладочных инструментов Microsoft. В статье рассматривается техническая возможность получения размещённых там файлов.

Анатомия URL на Symbol Server

Адрес каждого файла строится по детерминированной схеме из трёх компонентов PE-заголовка:

Ключевой сегмент - составной хеш 688CABB065000. Он формируется из двух полей PE-заголовка:

Поле PE

Структура

Формат в URL

Описание

TimeDateStamp

IMAGE_FILE_HEADER

8 hex-цифр, upper-case

Время компиляции в формате Unix timestamp

SizeOfImage

IMAGE_OPTIONAL_HEADER

hex без ведущих нулей

Размер образа в памяти после загрузки

Итоговый сегмент: {TimeDateStamp:08X}{SizeOfImage:X}. Это тот же ключ, который используют DbgHelp.dll и SymSrv.dll при поиске файлов на сервере символов.

Почему нужен специальный User-Agent

Сервер фильтрует запросы по полю User-Agent. Обычный браузерный идентификатор вернёт ошибку или редирект. Необходимо имитировать клиент Windows Debugger:

Вот что получим, если попытаемся просто скачать файл перейдя по ссылке
Вот что получим, если попытаемся просто скачать файл перейдя по ссылке
curl.exe -L -A "Microsoft-Symbol-Server/10.0.0.0" \
    https://msdl.microsoft.com/download/symbols/oscdimg.exe/688CABB065000/oscdimg.exe \
    -o oscdimg.exe

Флаг -L важен: сервер возвращает HTTP 302 и перенаправляет на CDN Microsoft (домен вида vsblobprod*.blob.core.windows.net). Без следования редиректам файл не скачается.

Важно. Используйте curl.exe, а не curl. В PowerShell псевдоним curl указывает на Invoke-WebRequest, у которого другой синтаксис и поведение.

Что делать если не помогло?

Возможно Вы столкнетесь с подобной ошибкой
Возможно Вы столкнетесь с подобной ошибкой

В данном случае Вам поможетлишь загрузка с wsl (либо можете взять любую ВМ на unix-based) и выполнил wget:

wget --user-agent="Microsoft-Symbol-Server/10.0.0.0" \
    https://msdl.microsoft.com/download/symbols/oscdimg.exe/688CABB065000/oscdimg.exe \
    -O oscdimg.exe

В данном случае –user-agent=“…” - маскирует запрос под официальный отладчик Microsoft. Без этого сервер Microsoft msdl выдаст ошибку доступа 403.

Готовые примеры команд для различных утилит

oscdimg.exe - создание ISO-образов

curl.exe -L -A "Microsoft-Symbol-Server/10.0.0.0" `
  https://msdl.microsoft.com/download/symbols/oscdimg.exe/688CABB065000/oscdimg.exe `
  -o oscdimg.exe

oscdimg - утилита Microsoft для создания ISO-образов в форматах ISO 9660, Joliet и UDF. Официально распространяется в составе Windows ADK (Assessment and Deployment Kit), но нередко нужна сама по себе.

signtool.exe - подпись исполняемых файлов

curl.exe -L -A "Microsoft-Symbol-Server/10.0.0.0" `
  https://msdl.microsoft.com/download/symbols/signtool.exe/910D667173000/signtool.exe `
  -o signtool.exe

signtool используется для подписи PE-файлов сертификатами Authenticode, верификации подписей и простановки временных меток. Альтернативный официальный источник - Windows SDK, но он весит несколько гигабайт.

icacls.exe - Управление списками контроля доступа NTFS (ACL)

curl.exe -L -A "Microsoft-Symbol-Server/10.0.0.0" `
  https://msdl.microsoft.com/download/symbols/icacls.exe/578998547000/icacls.exe `
  -o icacls.exe

Основной инструмент командной строки для работы с ACL (Access Control Lists) в NTFS. Замена устаревшей cacls.exe - начиная с Windows Vista/2008, именно icacls является рекомендованным Microsoft инструментом. Позволяет выдавать, отзывать и заменять права доступа, сохранять и восстанавливать ACL, работать с наследованием. Незаменим в скриптах развёртывания, при настройке серверных директорий и в CI/CD пайплайнах, где нужно зафиксировать права на файлы артефактов.
В WinPE и минимальных сборках Server Core бывает нужна конкретная версия с поддержкой нужных флагов, либо утилита вовсе отсутствует, если образ сконфигурирован с минимальным набором компонентов.

Использование Winbindex

Это именно тот инструмент, который индексирует все бинарники с msdl.microsoft.com.

Если Вам нужна другая утилита и её хэш, то можете заходить на https://winbindex.m417z.com/ и пользоваться им.
Введите имя файла (например, wevtutil.exe), выберите версию Windows и архитектуру — получите прямую ссылку для скачивания. Проект поддерживается сообществом и обновляется с каждым крупным обновлением Windows.

Итог

Вот такой простой способ я Вам показал, думаю "Америку я вам не открыл", но кому-то надеюсь это поможет.
Не обязательно загружать гигабайты ADK и SDK и "прочего мусора" с ним, всё можно обойти гораздо более простым путем, при этом сэкономив время.

Комментарии (7)


  1. unreal_undead2
    02.06.2026 07:12

    Менее очевидный факт: помимо PDB-файлов, тот же сервер хранит и сами PE-бинарники: .exe и .dll

    Интересно, для чего это изначально сделано? Самим сотрудникам MS проще брать бинарники оттуда?


    1. stnkv-it Автор
      02.06.2026 07:12

      Это даже не то чтобы проще, а просто вынужденная мера. При отладке нужны определенные бинари (определенной сборки), для обеспечения воспроизводимой отладки конкретных версий программ.
      Он хранит множество конкретных сборок файлов (DLL, EXE, SYS, PDB) и позволяет по уникальному идентификатору получить именно ту версию, которая использовалась при возникновении ошибки или создании дампа памяти.
      Такой архив версий получается, ну он не хранит историю изменений а просто дает быстрый поиск версии файла и её загрузку.


      1. unreal_undead2
        02.06.2026 07:12

        Да, согласен что для внутренних целей репозиторий всех бинарников нужен - и проще запользовать для этого готовую логику симольного сервера.


  1. zzzzzzzzzzzz
    02.06.2026 07:12

    Интересно.

    Но не особо понятно, возможно в статье какие-то куски потерялись

    Что делать если не помогло?

    В данном случае Вам поможетлишь загрузка с wsl (либо можете взять любую ВМ на unix-based) и выполнил wget:

    При чём тут wsl? Чем приведённый пример с wget отличается от curl выше?

    Также непонятны проблемы с User-Agent. Скачивается файл с расширением blob, но это же тот же exe внутри, просто с другим именем?

    https://winbindex.m417z.com/

    Там тоже странно.

    Пошёл на сайт, поискал powershell.exe, по кнопке "Show" нашёл ссылку, у которой указан md5 такой же, как у powershell.exe на моём компе. Но при этом файл имеет другой размер... На сайте нумерация съехала, что ли?


    1. stnkv-it Автор
      02.06.2026 07:12

      Сейчас постараюсь Вам пояснить.

      При чём тут wsl? Чем приведённый пример с wget отличается от curl выше?

      По поводу WSL. В приведённых примерах curl и wget делают практически одно и то же - отправляют HTTP-запрос с нужным User-Agent и скачивают файл.
      Но при попытке загрузить .exe при помощи curl Вы можете столкнуться с проблемой связанной с TLS-стека, либо корп.политик. Чтобы не вдаваться в дебри решения проблем с TLS и не раздувать статью, показал пример на WSL. Думаю нужно было это в статье указать отдельно(

      Также непонятны проблемы с User-Agent. Скачивается файл с расширением blob, но это же тот же exe внутри, просто с другим именем?

      Тут спорный момент, я не могу гарантировать на 100% что скачанный файл .blob при переименовании его в .exe будет работать корректно и что мы получили настоящий PE-файл. Поэтому лучше использовать User-Agent. 
      Ну либо можно заморочиться с проверкой содержимого через Format-Hex )))

      Пошёл на сайт, поискал powershell.exe, по кнопке "Show" нашёл ссылку, у которой указан md5 такой же, как у powershell.exe на моём компе. Но при этом файл имеет другой размер... На сайте нумерация съехала, что ли?

      Насчёт Winbindex - там отображается не только имя файла, но и конкретная версия из определённой сборки Windows. Поэтому вполне возможна ситуация, когда MD5 совпадает с вашим экземпляром, а размер кажется другим из-за особенностей отображения, путаницы между размером файла и размером образа в памяти (SizeOfImage) или просто ошибки интерфейса сайта. Для уверенности лучше сравнить SHA-256 и фактический размер файла после скачивания.


      1. CaptainFlint
        02.06.2026 07:12

        я не могу гарантировать на 100% что скачанный файл .blob при переименовании его в .exe будет работать корректно и что мы получили настоящий PE-файл.

        Во-первых, сравнить это элементарно, и даже никаких hex-ов не надо, банальным fc /b. Я сравнил, файлы идентичны, user-agent ни на что не повлиял, файл скачался и через браузер, и через curl.

        Во-вторых, имя blob возникает из того самого редиректа, так обозначено имя файла в новом урле. Поэтому браузер и использует это имя по умолчанию. При скачивании curl’ом вы указываете опцию -o oscdimg.exe, явным образом задающую имя сохраняемого файла, поэтому что там в урле уже не играет никакой роли. И, опять же, урловое blob-имя никак не меняется от того, указываем мы заголовок UA или нет. Проверяется элементарно, добавлением опции -v к параметрам curl, заставляющей его печатать все технические заголовки.


  1. 586
    02.06.2026 07:12

    Гугл предлагает через winget:

    winget install -e --id Microsoft.OSCDIMG