PREMESSA ALLA TRADUZIONE
Presento a seguire la traduzione dell'articolo
".NET-fu: Signing an Unsigned Assembly (without Delay Signing)"
di OJ Reeves che avevo citato nel mio precedente post
"Signed or not signed?"
. OJ mi ha chiesto di tradurre l'articolo ed io lo faccio con vero piacere.
Ho cercato di non tradurre termini che considero parte del linguaggio tecnico, in particolare SIGNED (e così UNSIGNED) che andrebbe tradotto come "firmato" o meglio "cifrato" ma che a mio parere deve essere lasciato tale.
Buona lettura.
.NET-FU : come trasformare in SIGNED un assembly UNSIGNED (senza ricorrere al DELAY SIGNING)
L'insieme di codice sul quale sto lavorando è costituito da un gran numero di file binari (assembly) tutti SIGNED. Chi ha avuto a che fare un minimo con .NET sa che un assembly referenziato da un assembly SIGNED deve essere esso stesso SIGNED.
Quando abbiamo che fare con un assembly di terze parti che non lo è, ci troviamo di fronte ad un problema . Talvolta si è fortunati se si incappa in un produttore che ci fornisce anche un set di assembly SIGNED, ma non è sempre così. Se siete in quest'ultimo scenario (come è successo recentemente a me e ai miei colleghi), occorre trasformare gli assembly in SIGNED da sè. Ecco come.
Nota: il delay signing non è trattato in questo articolo.
SCENARIO 1 - FOO E BAR
Foo è il componente che stiamo sviluppando e che sarà SIGNED.
Bar è il componente di terze parti che dobbiamo usare per forza e che non lo è.
Scaricate il progetto Bar.dll ed il progetto Foo.dll per seguire l'esempio pratico citato in questo articolo.
Noterete che Foo contiene un file .snk usato per rendere SIGNED Foo.dll. Se provate a compilare Foo, avrete il seguente errore:
Assembly generation failed — Referenced assembly ‘Bar’ does not have a strong name
Occorre rendere SIGNED anche Bar per consentire a Foo di compilarsi.
PASSO 1 - DISASSEMBLARE BAR 
Apriamo la command line dell'ambiente .NET, il modo più semplice è di aprire la linea di comando di Visual Studio, che si trova nel sottomenù "Visual Studio Tools" del menù della vostra versione di Visual Studio. Portarsi nella cartella dove si trova Bar.dll.
Usiamo ildasm.exe per disassemblare il file usando le opzioni /all e /out così:
C:\Foo\bin> ildasm /all /out=Bar.il Bar.dll
Il risultato del comando è un nuovo file, Bar.il, che contiene il listato disassemblato di Bar.dll.
PASSO 2 - RICOMPILARE E FIRMARE BAR 
Ora possiamo usare ilasm per riassemblare Bar.il, ma stavolta specifichiamo una chiave per ottenere un assembly cifrato strong-name (SIGNED).
Passiamo il valore Foo.snk in corrispondenza del parametro /key, così:
C:\Foo\bin> ilasm /dll /key=Foo.snk Bar.il
Microsoft (R) .NET Framework IL Assembler. Version 2.0.50727.1434
Copyright (c) Microsoft Corporation. All rights reserved.
Assembling 'Bar.il' to DLL --> 'Bar.dll'
Source file is ANSI
Assembled method Bar.Bar::get_SecretMessage
Assembled method Bar.Bar::.ctor
Creating PE file
Emitting classes:
Class 1: Bar.Bar
Emitting fields and methods:
Global
Class 1 Methods: 2
Resolving local member refs: 1 -> 1 defs, 0 refs, 0 unresolved
Emitting events and properties:
Global
Class 1 Props: 1
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved
Writing PE file
Signing file with strong name
Operation completed successfully
Bar.dll adesso è cifrato in strong-name (SIGNED)! Tutto quello che dobbiamo fare è riaprire il progetto Foo, rimuovere il reference a Bar.dll e riaggiungere un reference al nuovo assembly firmato e ricompilato.
SCENARIO 2 -FOO, BAR E BAZ
Foo è il componente che stiamo costruendo e che deve essere firmato.
Bar è il componente di terze parti che devoete usare e che non lo è.
Baz è un'altro componente di terze parti che è necessario per usare Bar.
Potete scaricare i progetti Baz.dll, Bar.dll e Foo.dll citati nell'esempio.
Se provate a compilare Foo, otterrete lo stesso errore incontrato nel precedente scenario. Ricordate che stavolta sia Bar.dll che Baz.dll devono essere SIGNED, così prima di tutto seguite la procedura spiegata nel precedente scenario per entrambi.
Fatto? Bene, se provate a compilare Foo.dll referenziando i nuovi Bar.dll e Baz.dll, non avrete errori, ma non entusiasmatevi troppo.
Se provate ad usare Foo.dll avrete una brutta sorpresa. La ragione è che Bar.dll è stato compilato orginariamente con un reference ad una versione UNSIGNED di Baz.dll. Ora che Baz.dll è SIGNED dobbiamo forzare Bar.dll a referenziare la versione SIGNED di Baz.dll.
PASSO 1 - "HACKARE" IL DISASSEMBLATO "IL" 
Tutto ciò che dobbiamo fare è disassemblare il codice che dobbiamo modificare. Stavolta, fate attenzione a disassemblare l'assembly che abbiamo rigenerato nel passo precedente (questo assembly è stato firmato e contiene il segmento di codice dello strong name). Una volta che abbiamo ottenuto il nuovo Bar.il usando ildasm, apriamolo in un text editor.
Cerchiamo il reference a Baz - dovrebbe essere situato probabilmente in avanti nel file, prima dell'inizio del codice, dopo i commenti. Ecco come si presenta sulla mia macchina
.assembly extern /*23000002*/ Baz
{
.ver 1:0:0:0
}
Il riferimento all'assembly esterno è privo del reference alla chiave pubblica. Prima di aggiungerlo abbiamo bisogno di sapere la chiave pubblica di Bar.dll. Per determinarla possiamo usare l'utility sn.exe, così:
C:\Foo\bin> sn -Tp Baz.dll
Microsoft (R) .NET Framework Strong Name Utility Version 3.5.21022.8
Copyright (c) Microsoft Corporation. All rights reserved.
Public key is
00240000048000009400000006020000002400005253413100040000010001
00a59cd85e10658d9229d54de16c69d0b53b31f60bb4404b86eb3b8804203a
ca9d65412a249dfb8e7b9869d09ce80b0d9bdccd4943c0004c4e76b95fdcdb
c6043765f51a1ee331fdd55ad25400d496808b792723fc76dee74d3db67403
572cddd530cadfa7fbdd974cef7700be93c00c81121d978a3398b07a9dc107
7fb331ca9c
Public key token is 2ed7bbec811020ec
Torniamo adesso a Bar.il e modifichiamo l'assembly reference così che la chiave pubblica venga specificata. Dovrebbe presentarsi così dopo la modifica:
.assembly extern /*23000002*/ Baz
{
.publickeytoken = (2E D7 BB EC 81 10 20 EC )
.ver 1:0:0:0
}
Salviamo il tutto.
PASSO 2 - RIASSEMBLARE BAR 
Questo passo è solo la ripetizione dei passi precedenti.
Useremo ancora ilasm per riassemblare Bar.dll, ma questa volta il file Bar.il "hackato".
Useremo lo stesso comando usato prima, specificando il file Foo.snk per segnare l'assembly.
Per evitarvi di fare scroll verso l'alto eccolo di nuovo:
C:\Foo\bin> ilasm /dll /key=Foo.snk Bar.il
Microsoft (R) .NET Framework IL Assembler. Version 2.0.50727.1434
Copyright (c) Microsoft Corporation. All rights reserved.
Assembling 'Bar.il' to DLL --> 'Bar.dll'
Source file is ANSI
Assembled method Bar.Bar::get_SecretMessage
Assembled method Bar.Bar::.ctor
Creating PE file
Emitting classes:
Class 1: Bar.Bar
Emitting fields and methods:
Global
Class 1 Fields: 1 Methods: 2
Resolving local member refs: 3 -> 3 defs, 0 refs, 0 unresolved
Emitting events and properties:
Global
Class 1 Props: 1
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved
Writing PE file
Signing file with strong name
Operation completed successfully
Apriamo il progetto Foo, rimuoviamo e riaggiungiamo il riferimento a Bar.dll, assicurandoci di puntare alla versione appena creata.
Foo.dll non solo si compilerà, ma potrà anche funzionare!
AVVERTENZA
"Hackare" codice di terze parti così come è stato descritto, può costituire una violazione della licenza degli stessi. Assicuratevi che non state commettendo violazioni di questo genere prima di adottare questa tecnica.
Buon lavoro!