Tworząc programy, bardzo często wykorzystuje się różne biblioteki stworzone przez inne osoby. Dopóki kod jest tworzony na potrzeby własne, nie patrzy się na to jak zostały przygotowane użyte biblioteki. Pierwszy momentem, kiedy zaczyna się zwracać na to uwagę jest podjecie decyzji o publikacji rozwiązania dla większego grona odbiorców. W tym momencie zaczynają się pojawiać myśli o zabezpieczeniu kodu. Najprostszym sposobem jest podpisanie plików wynikowych. I tu może pojawić się pierwszy problem. Może okazać się, że chcąc skompilować program otrzymamy następujący komunikat:
Assembly generation failed -- Referenced assembly 'Foo' does not have a strong name
Komunikat ten informuje nas, że jedna z bibliotek wykorzystywanych w naszym programie nie ma silnej nazwy (ang. strong name). Z tego powodu nie można podpisać naszych plików wynikowych. W celu rozwiązania tego problemu można zastosować trzy podejścia:
- poprosić twórców wykorzystywanych bibliotek o przygotowanie ich podpisanej wersji,
- znaleźć inną bibliotekę, która jest podpisana i zapewnia taką samą funkcjonalność jak używana biblioteka,
- spróbować samodzielnie podpisać biblioteki, które nie są podpisane.
Wydaje mi się, że dwa pierwsze sposoby nie wymagają komentowania. Zajmijmy się, więc trzecim.
Pierwszym krokiem jest deasemblacja pliku biblioteki. W tym celu należy uruchomić Visual Studio Command Prompt i przejść do katalogu, w którym znajduje się problematyczna biblioteka. Teraz należy wykorzystać ildasm.exe z przełącznikami /all i /out, aby deasemblować bibliotekę. Polecenie wygląda następująco:
C:\Foo\bin> ildasm /all /out=Foo.il Foo.dll
Polecenie to wygeneruje kod biblioteki Foo w języku CIL (ang. Common Language Infrastructure). Wystarczy teraz przeprowadzić operację odwrotną – skompilować otrzymany plik. Dodatkowo w trakcie kompilacji należy podpisać bibliotekę. W tym celu należy wykorzystać narzędzie ilasm.exe, wykonując polecenie:
C:\Foo\bin> ilasm /dll /key=Key.snk Foo.il
Przed uruchomieniem tego polecenia należy przegrać do katalogu C:\Foo\bin klucz (Key.snk), którym paczka ma zostać podpisana. Do tego celu można użyć klucz, który będzie wykorzystany do podpisania naszego projektu, lub też wygenerować nowy klucz. W generacji kluczy pomaga nam Visual Studio, wystarczy wydać polecenie:
C:\Foo\bin> sn –k Key.snk
Spowoduje ono utworzenie parę kluczy publiczny – prywatny i zapisanie ich do pliku Key.snk.
Na koniec wystarczy już tylko podmienić referencje w Visual Studio, usuwając tą wskazującą na niepodpisany plik Foo.dll i dodać referencje do nowo otrzymanego podpisanego pliku. Teraz już tylko wystarczy skompilować cały projekt. Operacja ta powinna przejść bezproblemowo.
Kończąc ten temat chciałem zasygnalizować jeszcze jedną kwestię. Przed przystąpieniem do tej operacji należy sprawdzić, czy nie jest ona sprzeczna z licencją, na jakiej została wydana dana biblioteka. Z tego powodu wymienione dwa pierwsze rozwiązania są bezpieczniejsze.
when i run „C:\Foo\bin> ilasm /dll /key=Key.snk Foo.il” it came back with ***************FAILURE************************
It is hard to say anything. There is to many unknowns.
The first question: do you have file Key.snk in folder C:\Foo\bin?
And second: Can you send me files: Foo.dll (before decompilation) and Foo.il. Then I will try to reproduce your case.
Thank you for sharing. Saved my day!
Thx for the post 🙂 just what i was looking for 🙂
this is really gud… thanks for post this.. after referred so many sites, i got solution here… i solved it.. thanks again…