Промяна на подписани библиотеки в
Съдържанието на статията
Помислих си за значението на подписването на .Net градивни елементи тук. Трябва да сте подписали и вашите библиотеки, за да ги инсталирате в GAC. В днешното разследване ще научим как да модифицираме подписани асембли без изходния код и секретни ключове.
Частни конструкции
Когато библиотеката е подписана (присвоено силно име), публичният ключ се записва в манифеста. По този начин, за да направите промени в нечия подписана библиотека, просто трябва да замените публичния ключ с вашия собствен. Или - още по-лесно - направете нова сборка със същото име и я подпишете със собствен ключ.
Когато използвате библиотеката, всеки публичен ключ ще бъде приет като доверен.
Нека проведем експеримент, създайте малка библиотека:
namespace signedLib public class sLib public static int GetNumber() < връщане 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 се допълват с параметри на публичен ключ, подписите се проверяват. Зазидани, демони! Какво получава? Заобиколен от всички страни
- няма да е възможно да се правят промени неусетно - подписът няма да премине проверка;
- не можете да подхлъзнете публичния си ключ - ID на сборката ще се промени.
Не е нужно обаче да сте криптограф, за да промените библиотеката в GAC. Просто трябва да имате администраторски права и да знаете параметрите на помощната програма sn.exe (страдащите, които нямат Studio, използват ръчно стандартната помощна програма 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 Explorer. Нека създадем псевдодиск, върху който ще се проектира необходимата директория:
subst b: C:\Windows\assembly
Диск B се появява във File Explorer.
Сглобките .Net завършват в папката GAC_MSIL; намерете желаната папка (нейното име е същото като името на .dll файла). Вътре ще има друга папка и в нея, накрая, signedLib.dll. Копирайте signedLib.dll на работния плот.
С помощта на прекрасната програма .NET Reflector и не по-малко прекрасния плъгин Reflexil (на нашия диск цялата тази икономика вече ви очаква) ще редактираме библиотеката. Преди да пренапишем токена на публичния ключ и неговата стойност в бележник (полезно по-късно). Както вече знаем, публичният ключ е написан в самото събрание и сега можете най-накрая да проверите това.
След редактиране на IL-кода и запазване на промените, програмата ще съобщи, че цифровият подпис е бил нарушен и ще предложи опции за по-нататъшни действия.
Кликнете върху „Премахване на силно име“ - премахнете цифровия подпис. Затворете сборката (теоретично няма нужда да затваряте сборката и опцията „Регистрирайте го за пропускане на проверката“ трябва да ни подхожда, но тази операция завършва с грешка за мен; освен това за образователни цели е по-добре да правите всички операции ръчно).
Сега имаме:
- Модифициран, неподписан dll;
- публичния ключ на оригиналната библиотека.
Остава да го инсталирате в GAC. За да направим това, ще използваме механизма за отложено подписване. Ако събранието съдържа информация за общественосттаключ, но няма цифров подпис - казват, че е със забавен подпис (измислил го е някакъв мозък от Майкрософт "с цел тестване").
Създаването на такова събрание с помощта на .NET Reflector не е трудно - трябва да попълните съответните полета, те са маркирани в жълто на фигурата „Параметри на публичен ключ“ (не забравяйте, че копирахме техните стойности в бележника?). И не забравяйте да поставите отметка в квадратчето "HasPublicKey" (на теория публичният ключ трябва да бъде извлечен от секретния с помощта на помощната програма sn.exe и след това да се създаде отложен подпис, използвайки го).
И така, имаме сборка, която има същото име като оригиналната, има същата версия и същия публичен ключ. Оказва се, че ако го зададете в GAC, ще получи точно същия идентификатор като оригиналния (вижте началото на статията ). Както писах по-горе, по подразбиране сборките в GAC имат проверен подпис, обаче проверката на подписа може да бъде деактивирана - отново "за тестване".
За да деактивирате проверката на dll подпис на този компютър, използвайте sn.exe:
sn -Vr C:\Users\Alex\Desktop\signedLib.dll
Премахнете оригиналното сглобяване от GAC:
gacutil /u signedLib,Версия=1.0.0.0,Култура=неутрална,PublicKeyToken=2b1b71846e76146e
И инсталирайте модифицирания:
gacutil /i C:\Users\Alex\Desktop\signedLib.dll
Радваме се, гледайки надписа, показан от gacutil.exe:
Сглобяването е добавено успешно към кеша
Така че постигнахме това, което искахме - сменихме библиотеката, инсталирана в GAC. За да се порадваме още веднъж (и да проверим резултата), стартираме нашето приложение changeKey.exe, което в началото на статията показва 1. Ура, сега ще показва 2!
Време е да обобщим постиженията си днес. Нека го направим до Елементи:
- Публичният ключ е написан в самата сборка (по-точно в манифеста);
- в случай на частни събрания подписите не се проверяват.
За да промените монтажа в CAG, трябва:
- Направете копие на необходимия dll файл от C:\Windows\assembly (с помощта на командата subst).
- Извлечете публичния ключ от сборката.
- Променете IL кода на асемблиране и премахнете цифровия подпис.
- Добавете публичния ключ, получен на стъпка 2 към модифицирания файл (нека създадем отложен подпис).
- Отменете проверката на цифровия подпис за модифицираната сборка на този компютър.
- Премахнете оригиналната компилация от GAC.
- Инсталирайте модифицирания монтаж.
За да изпълните стъпки 5-7, трябва да имате администраторски права. Това е всичко! По повод това, позволете ми да се сбогувам и да ви пожелая страхотни креативни узбеки в областта на софтуерните изследвания.
За удобно четене на статията трябва да имате основни познания в областта криптография с публичен ключ.