| RSS



Меню

Bookmark and Share


Статистика
Ваш IP: 3.146.107.49
Вы используете: v





Сейчас на сайте:

Тех поддержка ->

Облако тэгов
ОС видио Tor Обратная сторона антенна 4.6 php libc rand() эксплоит Windows Server 2008 FreeBSD Jail Elastix QIP Virtual chroot Limit kernel proc sysctl Tune freeBSD bridge Boot LiveCD Disk Bluetooth GEO game DirectX emulator Python Shell червь Conficker вирус троян лаборатория касперского пиратство Apple iPhone Microsoft twitter социальная сеть анонимность лицензия Open Source уязвимость MySQL база данных Закон Франция Пират Skype мобильный Deutsche Telekom хакер trend micro кибератака Германия робот Персональные данные Ноутбук Интернет китай цензура windows vista acer Linux патент браузер Firefox Internet Explorer Opera Safari Intel Oracle патч Банкомат IBM США Dell Ford MAC контроль Internet кибербезопасность приговор Mozilla Chrome безопасность Госдума СМИ Windows 8 взлом Пентагон Украина Facebook Cisco Cloud Windows XP нетбук торрент музыка Биометрический Nokia Hardware Manager ФБР IP-адрес sms RSA java Google Captcha Symantec Спам Антивирус тест Anti-Malware Windows 7 операционная система windows провайдер авторское право rapidshare UNIX свиной грипп шантаж Дети ipod копирайт McAfee HTTPS icann студент Норвегия New York Times YouTube Warner Music КНДР Ubuntu AMD ATI касперский Россия РФ сервер хостинг Wi-Fi суд пароль блог фишинг одноклассники Медведев контрафакт мошенник sony Gps по JavaScript Хакеры Yahoo фас компьютер софт Минкомсвязи Сбой мошенничество Доктор ВЕб Вконтакте ie8 исходный код МВД фильтр порнография свобода слова казахстан Autodesk сисадмин Gmail кредитная карта LiveJournal шифрование Deep Purple банк HTML5 Нанотехнологии wikipedia выборы DNS bind KaZaA Android Basic атака Mac OS X домен ФСБ прокуратура уголовное дело ICQ Sophos Google Voice ошибка DARPA военные сайт турция конференция спамер Полиция Koobface Великобритания IRC белоруссия Грузия Bittorrent Европа Dr.WEB Linux Mint Билл Гейтс спецслужбы Royal Bank of Scotland смартфон Canonical F-Secure Symbian фильм Microsoft Office Новая Зеландия Adobe Австралия IDC Internet Explorer 9 iPad Ирландия поиск GOOGLE EARTH МТС Реклама слежка Mandriva BSD Zeus личные данные eset avast Avira G Data Software защита Defcon виртуализация dll LibreOffice Черный список BlackBerry индия Москва DVD социальные сети flash player paypal BitDefender email сертификат honda MasterCard Anonymous технологии IPv6 Ассанж Оптоволокно передача данных арест Fedora Samsung Иск Apache учетная запись iTunes исследование Cert Санкт-Петербург McDonald's SOPA PIPA Bioshock Infinite: Burial at Sea - ico Megaupload CES hotfile отчет приложение Инвестиции платформа DRM DDoS-атака роскомнадзор

Главная » Статьи » Общие Статьи

Модифицируем подписанные библиотеки в .NET

Задумался я тут над смыслом подписания компоновочных блоков .Net. Наверняка, ты тоже подписывал свои библиотеки, чтобы установить их в GAC. В ходе сегодняшнего расследования мы научимся изменять подписанные сборки, не обладая исходниками и секретными ключами.

Приватные сборки

При подписании библиотеки (назначении строгого имени) открытый ключ записывается в манифест. Таким образом, чтобы внести изменения в чужую подписанную библиотеку, нужно просто заменить публичный ключ на свой. Или — еще проще — сделать новую сборку с таким же именем и подписать на своем ключе.

При использовании библиотеки любой публичный ключ будет принят как доверенный.

Проведем эксперимент, создадим небольшую библиотечку:

Библиотека signedLib.dll

namespace signedLib
{
public class sLib
{
public static int GetNumber() { return 1; }
}
}

Подпишем ее и добавим к проекту консольного приложения:

Консольное приложение changeKey.exe

namespace changeKey
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(signedLib.sLib.GetNumber());
Console.ReadLine();
}
}
}

Затем скомпилируем релиз проекта. С помощью .NET Reflector [1] и плагина Reflexil [2] отредактируем IL-код подписанной библиотеки (signedLib.dll), так что GetNumber() будет возвращать не "1", а "2". Консольное приложение не заметило подмены и вывело "2". Вывод: подменить/изменить приватную сборку со строгим именем очень просто. Другие сборки, ссылающиеся на измененную, никак на это не реагируют, несмотря на то, что они были скомпилированы с оригинальной. Обращаю внимание, что речь идет именно о приватных сборках, со сборками в GAC дело обстоит иначе.

Сборки в GAC

Как мы только что убедились, подписанные приватные компоновочные блоки можно легко модифицировать. При этом необязательно обладать ни исходниками, ни секретным ключом, ни правами администратора.

Вносить изменения в сборки, установленные в GAC, не многим сложнее. В случае с приватными сборками их "подписанность" никакой роли не играет. Подпись не проверяется, а "полный идентификатор приватного компоновочного блока состоит из имени компоновочного блока и числового номера его версии" (из книги Э. Троелсена).

Сборки, устанавливаемые в GAC, должны иметь так называемое строгое имя. Сборка получает строгое имя в момент ее подписания. Идентификаторы сборок в GAC дополняются параметрами публичного ключа, подписи проверяются. Замуровали, демоны! Что же это получается? Окружили со всех сторон:

  • незаметно внести изменения не получится - подпись проверку не пройдет;
  • свой публичный ключ не подсунешь - идентификатор сборки изменится.

Тем не менее, не нужно быть криптографом, чтобы все же изменить библиотеку в GAC. Требуется всего лишь обладать правами администратора и знать параметры утилиты sn.exe (страдальцы, не имеющие Студии, вручную используют стандартную утилиту sn.exe для подписания компоновочных блоков).

Итак, возьмем проект уже знакомой библиотеки signedLib.dll. Подпишем ее и установим в GAC.

gacutil.exe /i D:\projects\changeKey\signedLib\bin\Release\signedLib.dll

Добавим референс к консольному приложению changeKey.exe. Компилируем релиз, убеждаемся, что в папке с программой нет файла signedLib.dll (это значит, что сборка будет загружена из GAC). Запускаем changeKey.exe - приложение показывает "1".

С этого момента воображаем себя атакующими - у нас нет исходников, нет секретного ключа. Но надо, чтобы метод GetNumber() возвращал не 1, а 2.

Структуру файлов ниже C:\Windows\assembly проводник Windows не показывает. Создадим псевдодиск, на который будет проецироваться нужный каталог:

subst b: C:\Windows\assembly

В проводнике появился диск B.

.Net сборки попадают в папку GAC_MSIL; находим нужную папку (ее название совпадает с названием .dll файла). Внутри будет еще одна папка, а в ней, наконец, signedLib.dll. Копируем signedLib.dll на рабочий стол.

С помощью замечательной программы .NET Reflector и не менее замечательного плагина Reflexil (на нашем диске все это хозяйство тебя уже заждалось) мы будем редактировать библиотеку. Предварительно перепишем токен публичного ключа и его значение в блокнот (пригодятся позже). Как мы уже знаем, публичный ключ записан в самой сборке, и теперь в этом можно окончательно убедиться.

null

После правки IL-кода и сохранения изменений программа сообщит о том, что цифровая подпись нарушена и предложит варианты дальнейших действий.

Нажимаем "Remove Strong Name" - удалить цифровую подпись. Закрываем сборку (теоретически закрывать сборку нет необходимости и нам должен подойти вариант "Register it for verification skipping", однако у меня эта операция заканчивается ошибкой; к тому же, в обучающих целях лучше проделать все операции вручную).

Теперь у нас есть:

  • Измененная, не подписанная dll;
  • публичный ключ оригинальной библиотеки.

Осталось установить ее в GAC. Для этого воспользуемся механизмом отложенной подписи. Если сборка содержит информацию о публичном ключе, но не имеет цифровой подписи – говорят, что она имеет отложенную подпись (придумал это какой-то надмозг из Майкрософт "с целью тестирования").

Сделать такую сборку с помощью .NET Reflector не составляет никакой сложности - нужно заполнить соответствующие поля, они выделены желтым на рисунке "Параметры публичного ключа" (помнишь, мы копировали их значения в блокнот?). И не забудь поставить галочку "HasPublicKey" (в теории публичный ключ нужно извлекать из секретного с помощью утилиты sn.exe и потом с помощью нее же создавать отложенную подпись).

Итак, мы получили сборку, которая называется так же, как оригинальная, имеет такую же версию и такой же публичный ключ. Получается, если ее установить в GAC, она получит точно такой же идентификатор, что и оригинальная (смотри начало статьи). Как я писал выше, по умолчанию у сборок в GAC проверяется подпись, однако проверку подписи можно отключить - опять же "для тестирования".

Чтобы отключить проверку подписи dll на данном компьютере, нужно воспользоваться sn.exe:

sn -Vr C:\Users\Alex\Desktop\signedLib.dll

Удаляем оригинальную сборку из GAC:

gacutil /u signedLib,Version=1.0.0.0,Culture=neutral,PublicKeyToken=2b1b71846e76146e

И устанавливаем измененную:

gacutil /i C:\Users\Alex\Desktop\signedLib.dll

Радуемся, глядя на выведенную gacutil.exe надпись:

Assembly successfully added to the cache

Вот мы и добились желаемого - изменили библиотеку, установленную в GAC. Чтобы еще раз порадоваться (и проверить результат), запускаем наше приложение changeKey.exe, которое в начале статьи выводило 1. Ура, теперь он покажет 2!

Подведем итог

Самое время подвести итог нашим сегодняшним свершениям. Сделаем это по пунктам:

  • Публичный ключ записан в самой сборке (точнее, в манифесте);
  • в случае с приватными сборками подписи не проверяются.

Чтобы изменить сборку в CAG, нужно:

  1. Сделать копию нужного dll-файла из C:\Windows\assembly (воспользовавшись командой subst).
  2. Извлечь из сборки публичный ключ.
  3. Модифицировать IL-код сборки и удалить цифровую подпись.
  4. Добавить к измененному файлу публичный ключ, полученный на шаге 2 (создадим отложенную подпись).
  5. Отменить проверку цифровой подписи для модифицированной сборки на данном компьютере.
  6. Удалить оригинальную сборку из GAC.
  7. Установить модифицированную сборку.

Для реализации шагов 5-7 нужно обладать правами администратора. Вот и все! На этом позволь откланяться и пожелать тебе огромных творческих узбеков на ниве исследований программного обеспечения.

INFO

Для комфортного чтения статьи нужно обладать базовыми знаниями в области криптографии с открытым ключом.

Категория: Общие Статьи | Добавил: LeadyTOR (10.07.2010) | Автор: Алексей Бойко
Просмотров: 2342 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
    Главная      
...
На службе : дней

07:47
Обновить


Пользователи
aka_kludge
qwerty
LeadyTOR
aka_Atlantis
AdHErENt
mAss
Sissutr
hiss
DrBio
tHick

Поиск


Copyright tHR - TeAM 2025 г. admin: aka_kludge (ICQ:334449009) Moderator's: LeadyTOR, ... Яндекс.Метрика