Montaż (CLI) - Assembly (CLI)

Zdefiniowane przez Microsoft do wykorzystania w nowszych wersjach systemu Windows , w zespole w Common Language Infrastructure (CLI) jest skompilowane biblioteki kodu wykorzystywane do rozmieszczania, wersji i bezpieczeństwa. Istnieją dwa typy: zestawy procesów ( EXE ) i zestawy bibliotek ( DLL ). Zespół procesu reprezentuje proces, który będzie używał klas zdefiniowanych w zespołach bibliotek. Zestawy CLI zawierają kod w CIL , który jest zwykle generowany z języka CLI , a następnie kompilowany do języka maszynowego w czasie wykonywania przez kompilator just-in-time . W implementacji .NET Framework ten kompilator jest częścią środowiska uruchomieniowego języka wspólnego (CLR).

Zespół może składać się z jednego lub większej liczby plików. Pliki kodu nazywane są modułami. Zestaw może zawierać więcej niż jeden moduł kodu. A ponieważ możliwe jest użycie różnych języków do tworzenia modułów kodu, technicznie możliwe jest użycie kilku różnych języków do utworzenia zestawu. Jednak program Visual Studio nie obsługuje używania różnych języków w jednym zestawie.

Nazwy zestawów

Nazwa zespołu składa się z czterech części

  1. Krótka nazwa. W systemie Windows jest to nazwa pliku Portable Executable (PE) bez rozszerzenia.
  2. Kultura. To jest identyfikator RFC 1766 ustawień narodowych zestawu. Ogólnie rzecz biorąc, biblioteki i zespoły procesów powinny być kulturowo neutralne; kultura powinna być używana tylko dla zestawów satelitarnych .
  3. Wersja. Jest to kropkowana liczba składająca się z czterech wartości - głównej, pobocznej, kompilacji i zmiany.
  4. Klucz publiczny token. Jest to 64- bitowy skrót klucza publicznego, który odpowiada kluczowi prywatnemu używanemu do podpisywania zestawu. Mówi się, że podpisany zespół ma silną nazwę .

Token klucza publicznego jest używany, aby nazwa zestawu była unikatowa. W związku z tym dwa silne nazwane zestawy mogą mieć tę samą nazwę pliku PE, a mimo to interfejs wiersza polecenia rozpozna je jako różne zestawy. System plików Windows ( FAT32 i NTFS ) rozpoznaje tylko nazwę pliku PE, więc dwa zestawy z tą samą nazwą pliku PE (ale inną kulturą, wersją lub tokenem klucza publicznego) nie mogą istnieć w tym samym folderze Windows. Aby rozwiązać ten problem, interfejs CLI wprowadza GAC ​​( Global Assembly Cache ), który jest traktowany jako pojedynczy folder w czasie wykonywania, ale w rzeczywistości jest zaimplementowany przy użyciu zagnieżdżonych folderów systemu plików.

Aby zapobiec atakom podszywającym się , w których cracker próbowałby udawać, że zestaw wygląda jak coś innego, zestaw jest podpisywany kluczem prywatnym. Twórca zamierzonego zestawu utrzymuje klucz prywatny w tajemnicy, więc cracker nie może mieć do niego dostępu ani po prostu go odgadnąć. W ten sposób cracker nie może zmusić swojego zespołu do podszywania się pod coś innego, bez możliwości prawidłowego podpisania go po zmianie. Podpisanie zestawu obejmuje pobranie skrótu ważnych części zestawu, a następnie zaszyfrowanie skrótu za pomocą klucza prywatnego. Podpisany skrót jest przechowywany w zestawie wraz z kluczem publicznym. Klucz publiczny odszyfruje podpisany skrót. Gdy środowisko CLR ładuje zestaw o silnej nazwie, wygeneruje skrót z zestawu, a następnie porówna go z odszyfrowanym skrótem. Jeśli porównanie powiedzie się, oznacza to, że klucz publiczny w pliku (a tym samym token klucza publicznego) jest skojarzony z kluczem prywatnym używanym do podpisywania zestawu. Oznacza to, że klucz publiczny w zestawie jest kluczem publicznym wydawcy zestawu, a tym samym zapobiega się fałszywemu atakowi.

Wersje montażowe

Zestawy CLI mogą mieć informacje o wersji, co pozwala im wyeliminować większość konfliktów między aplikacjami spowodowanych przez udostępnione zestawy. Jednak nie eliminuje to wszystkich możliwych konfliktów wersji między zestawami.

Złożenia i zabezpieczenia CLI

Zabezpieczenia dostępu do kodu CLI są oparte na zestawach i dowodach . Dowodem może być wszystko, co można wywnioskować z zestawu, ale zazwyczaj jest on tworzony ze źródła zestawu - niezależnie od tego, czy zestaw został pobrany z Internetu, intranetu , czy zainstalowany na komputerze lokalnym (jeśli zestaw jest pobierany z innego komputera, będzie być przechowywane w lokalizacji piaskownicy w GAC i dlatego nie jest traktowane jako zainstalowane lokalnie). Uprawnienia są stosowane do całych zestawów, a zestaw może określać minimalne uprawnienia, których wymaga, za pomocą atrybutów niestandardowych (zobacz metadane interfejsu wiersza polecenia ). Po załadowaniu zestawu środowisko CLR użyje dowodów zestawu do utworzenia zestawu uprawnień zawierającego co najmniej jedno uprawnienia dostępu do kodu. Środowisko CLR sprawdzi następnie, aby upewnić się, że ten zestaw uprawnień zawiera wymagane uprawnienia określone przez zestaw.

Kod CLI może realizować żądanie bezpieczeństwa dostępu do kodu. Oznacza to, że kod wykona jakąś uprzywilejowaną akcję tylko wtedy, gdy wszystkie zestawy wszystkich metod w stosie wywołań mają określone uprawnienia. Jeśli jeden zestaw nie ma uprawnień, zostanie zgłoszony wyjątek zabezpieczeń .

Kod CLI może również wykonywać połączone żądanie w celu uzyskania uprawnień ze stosu wywołań. W tym przypadku środowisko CLR przyjrzy się tylko jednej metodzie na stosie wywołań w pozycji TOP dla określonego uprawnienia. Tutaj przejście stosu jest powiązane z jedną metodą w stosie wywołań, za pomocą której środowisko CLR zakłada, że ​​wszystkie inne metody w STOSIE wywołań mają określone uprawnienie. Zespół jest połączeniem pliku METADATA i MSIL.

Zgromadzenia satelitarne

Ogólnie zestawy powinny zawierać zasoby neutralne kulturowo. Jeśli chcesz zlokalizować swój zestaw (na przykład użyj różnych ciągów dla różnych ustawień regionalnych), powinieneś użyć zestawów satelickich - specjalnych zestawów tylko do zasobów. Jak sama nazwa wskazuje, satelita jest powiązany z zespołem zwanym głównym zespołem. Ten zestaw (powiedzmy, lib.dll) będzie zawierał neutralne zasoby (o którym Microsoft mówi, że jest to angielski międzynarodowy , ale sugeruje, że jest to angielski amerykański). Każdy satelita ma nazwę powiązanej biblioteki z dopiskiem .resources (na przykład lib.resources.dll). Satelita otrzymuje nieneutralną nazwę kultury, ale ponieważ jest ona ignorowana przez istniejące systemy plików Windows (FAT32 i NTFS), oznaczałoby to, że w jednym folderze może znajdować się kilka plików o tej samej nazwie PE. Ponieważ nie jest to możliwe, satelity muszą być przechowywane w podfolderach w folderze aplikacji. Na przykład satelita z zasobami w Wielkiej Brytanii będzie miał nazwę CLI „lib.resources Version = 0.0.0.0 Culture = en-GB PublicKeyToken = null”, nazwę pliku PE lib.resources.dll i będzie przechowywany w podfolderze o nazwie en-GB.

Satelity są ładowane przez klasę CLI o nazwie System.Resources.ResourceManager . Deweloper musi podać nazwę zasobu i informacje o głównym zestawie (z zasobami neutralnymi). Klasa ResourceManager odczyta ustawienia regionalne maszyny i użyje tych informacji oraz nazwy zestawu głównego, aby uzyskać nazwę satelity i nazwę podfolderu, który go zawiera. ResourceManager może następnie załadować satelitę i uzyskać zlokalizowane zasoby.

Odwoływanie się do zestawów

Można odwoływać się do wykonywalnej biblioteki kodu, używając flagi / reference kompilatora C #.

Opóźnione podpisywanie zgromadzenia

Zestawy udostępnione muszą mieć silną nazwę, aby jednoznacznie identyfikować zestaw, który może być współużytkowany przez aplikacje. Silne nazewnictwo składa się z tokenu klucza publicznego, kultury, wersji i nazwy pliku PE. Jeśli zestaw prawdopodobnie będzie używany do celów programistycznych, który jest zestawem udostępnionym, procedura silnego nazewnictwa zawiera tylko generowanie klucza publicznego. Klucz prywatny nie jest wtedy generowany. Jest generowany tylko podczas wdrażania zestawu.

Język zgromadzenia

Zespół jest zbudowany z kodu CIL, który jest językiem pośrednim. Struktura wewnętrznie konwertuje CIL ( kod bajtowy ) do natywnego kodu asemblera . Jeśli mamy program, który wyświetla „Hello World”, odpowiednikiem kodu CIL dla metody jest:

 .method private hidebysig static void  Main(string[] args) cil managed {
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       11 (0xb)
  .maxstack  1
  IL_0000:  ldstr      "Hello World"
  IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000a:  ret } // end of method Class1::Main

Kod CIL ładuje String na stos, a następnie wywołuje funkcję WriteLine i zwraca.

Zobacz też

Bibliografia