C#程式集系列09,程式集簽名

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   strong   

在"C#程式集系列08,設定程式集版本"中體驗了為程式集設定版本,但對於程式集的安全性來說,還遠遠不夠。本篇體驗程式集的簽名。

 

□ 程式集的簽名

→F盤as檔案夾下有多個檔案

→在程式集所在檔案夾建立密匙

→列印密匙

密匙是一堆亂碼,這是經過加密了。
→在密匙的基礎上建立公匙Public Key

→列印公匙Public Key

注意:這裡的public token是public key經過雜湊演算法而獲得的。當程式集被引用,該程式集對外是以public token形式存在的。

→現在重新編譯"C#程式集系列08,設定程式集版本"中的Cow.cs,但這次使用密匙

→重新編譯"C#程式集系列08,設定程式集版本"中的MainClass.cs,引用剛建立的Farm.dll

→運行MainClass.exe

→現在類比一個病毒程式集,首先在F盤的as檔案夾中建立CowVirus.cs
→用記事本開啟CowVirus.cs,編寫如下,儲存

using System;
using System.Reflection;
[assembly: AssemblyVersion("3.3.3.3")]
public class Cow
{
    public static void Moo()
    {
        Console.WriteLine("我是病毒");
    }
}

→編譯CowVirus.cs,產生新的Farm.dll,重寫原先的Farm.dll,並且在沒有私匙的情況下

→再次運行MainClass.exe

可見,病毒程式雖然類比了一個相同名稱的程式集,但由於沒有簽名,該程式集不會得到主程式的認可。

 

□ Public Token

如果一個A程式集有public key,且被B程式引用,如果我們反編譯B程式,在B程式的IL代碼中就可以看到A程式集有一個public token,這個public token是根據A程式集的public key經雜湊演算法而得到的。

 

→再次重寫Farm.dll,編譯Cow.cs檔案,並且使用密匙

→反編譯Farm.dll

來看Farm程式集的清單部分:

.assembly Farm
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                             63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
  .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00   // .$..............
                00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00   // .$..RSA1........
                49 2C E7 BF EF 82 D2 44 A3 F4 AB 96 27 32 89 A4   // I,.....D....‘2..
                77 E6 AD A6 A3 21 62 E3 0A DA 72 9D BA 0A 7C 59   // w....!b...r...|Y
                51 0C F6 63 22 ED E3 50 4B F5 61 E2 1A 7F ED 26   // Q..c"..PK.a....&
                78 BD 1B 99 E7 1C 91 7F 80 E6 3F 9B 1C F0 85 63   // x.........?....c
                58 5D 8B DC 60 41 69 2A F3 E6 EB 9B 42 4D D8 B6   // X]..`Ai*....BM..
                C5 B0 31 47 77 58 C6 53 65 2A B1 90 30 EA 24 EF   // ..1GwX.Se*..0.$.
                2A 1C 92 DD 62 D3 00 F6 F3 CA 0E 24 1C A8 F2 2E   // *...b......$....
                5D D3 06 41 A7 77 EE EB C0 2F 64 83 2A 59 00 AE ) // ]..A.w.../d.*Y..
  .hash algorithm 0x00008004
  .ver 3:3:3:3
}

以上,程式集Farm.dll中包含了public key。

→重新編譯MainClass.cs,並且引用Farm.dll程式集,重建MainClass.exe

→運行MainClass.exe

→反編譯MainClass.exe

→查看到MainClass.exe的IL代碼

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern Farm
{
  .publickeytoken = (21 64 02 E8 98 B6 AC A9 )                         // !d......
  .ver 3:3:3:3
}
.assembly MainClass
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                             63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}

以上,在.assembly extern Farm語句塊中,.publickeytoken的值,是根據Farm.dll程式集的public key雜湊演算法後獲得的。

 

總結:
○ 通過給程式集簽名,即給程式集加密匙,程式集就有了public key,這樣會有效防止他人惡意篡改程式集
○ 程式集被A程式引用,如果反編譯A程式,資訊清單中有一個public token,該值是public key經雜湊演算法而得到的

 

“C#程式集系列”包括:

  C#程式集系列01,用記事本編寫C#,IL代碼,用DOS命令編譯器集,運行程式  C#程式集系列02,使用記事本查看可執行程式集的IL代碼  C#程式集系列03,引用多個module  C#程式集系列04,在程式集包含多個module的情境下理解關鍵字internal  C#程式集系列05,讓程式集包含多個module  C#程式集系列06,資訊清單,EXE和DLL的區別  C#程式集系列07,篡改程式集  C#程式集系列08,設定程式集版本  C#程式集系列09,程式集簽名

 

參考資料:

http://www.computersciencevideos.org/  created by Jamie King

C#程式集系列09,程式集簽名

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.