以下几个方面用来区分不同的程序集:
○ 程序集名称:Name
○ 程序集版本:Version
○ 程序集公匙: Public Token
○ 程序集文化:Culture

如果没有很严格地按照上面的几个方面来创建程序集,程序集是很容易被篡改的。本篇体验篡改程序集。

→清空F盘as文件夹下的所有文件
→在as文件夹下创建Dog.cs类,用记事本打开,编写如下,保存

  1. using System;
  2.  
  3. public class Dog
  4.  
  5. {
  6.  
  7.     public static void MakeSound()
  8.  
  9.     {
  10.  
  11.         Console.WriteLine("汪汪汪");
  12.  
  13.     }
  14.  
  15. }
  16.  

→把Dog.cs编译成程序集

→反编译Dog.dll程序集,查看IL代码

  1. // Metadata version: v4.0.30319
  2.  
  3. .assembly extern mscorlib
  4.  
  5. {
  6.  
  7.   .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  8.  
  9.   .ver 4:0:0:0
  10.  
  11. }
  12.  
  13. .assembly Dog
  14.  
  15. {
  16.  
  17.   .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
  18.  
  19.   .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
  20.  
  21.                                                                                                              63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
  22.  
  23.   .hash algorithm 0x00008004
  24.  
  25.   .ver 0:0:0:0
  26.  
  27. }
  28.  
  29. .module Dog.dll
  30.  
  31. // MVID: {A8BAEEAB-2DF4-425C-B851-87260378D735}
  32.  
  33. .imagebase 0x10000000
  34.  
  35. .file alignment 0x00000200
  36.  
  37. .stackreserve 0x00100000
  38.  
  39. .subsystem 0x0003       // WINDOWS_CUI
  40.  
  41. .corflags 0x00000001    //  ILONLY
  42.  
  43. // Image base: 0x00400000
  44.  
  45. // =============== CLASS MEMBERS DECLARATION ===================
  46.  
  47. .class public auto ansi beforefieldinit Dog
  48.  
  49.        extends [mscorlib]System.Object
  50.  
  51. {
  52.  
  53.   .method public hidebysig static void  MakeSound() cil managed
  54.  
  55.   {
  56.  
  57.     // 代码大小       13 (0xd)
  58.  
  59.     .maxstack  8
  60.  
  61.     IL_0000:  nop
  62.  
  63.     IL_0001:  ldstr      bytearray (6A 6C 6A 6C 6A 6C )                               // jljljl
  64.  
  65.     IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  66.  
  67.     IL_000b:  nop
  68.  
  69.     IL_000c:  ret
  70.  
  71.   } // end of method Dog::MakeSound
  72.  
  73.   .method public hidebysig specialname rtspecialname
  74.  
  75.           instance void  .ctor() cil managed
  76.  
  77.   {
  78.  
  79.     // 代码大小       7 (0x7)
  80.  
  81.     .maxstack  8
  82.  
  83.     IL_0000:  ldarg.0
  84.  
  85.     IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  86.  
  87.     IL_0006:  ret
  88.  
  89.   } // end of method Dog::.ctor
  90.  
  91. } // end of class Dog
  92.  

○ .assembly Dog表示程序集的名称是Dog
○ .assembly Dog语句块中的.ver 0:0:0:0表示程序集的版本没有经过特别的设置
○ .assembly Dog语句块中也没有Public Token和Culture相关信息

→在as文件夹下创建MainClass.cs类,用记事本打开,编写如下,保存

  1. using System;
  2.  
  3. class MainClass
  4.  
  5. {
  6.  
  7.     static void Main()
  8.  
  9.     {
  10.  
  11.         Dog.MakeSound();
  12.  
  13.     }
  14.  
  15. }
  16.  

→编译MainClass.cs,引用Dog.dll,生成MainClass.exe

→执行MainClass.exe

→现在要篡改Dog.dll,先删除Dog.dll

→在as文件夹下创建AnotherDog.cs类,用记事本打开,编写如下,保存

  1. using System;
  2.  
  3. public class Dog
  4.  
  5. {
  6.  
  7.     public static void MakeSound()
  8.  
  9.     {
  10.  
  11.         Console.WriteLine("小狗怎么叫~");
  12.  
  13.     }
  14.  
  15. }
  16.  

→编译AnotherDog.cs类,同样生成一个Dog.dll程序集

→再次运行MainClass.exe

篡改程序集成功。

总结:在生成程序集的时候,如果没有对程序集的版本、公匙、文化等进行特别的设置,程序集很容易被篡改。

“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,程序集签名

C#程序集系列10,强名称程序集

C#程序集系列11,全局程序集缓存

C#程序集系列12,C#编译器和CLR如何找寻程序集

C#程序集系列13,如何让CLR选择不同版本的程序集

参考资料:

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

C#程序集系列07,篡改程序集的更多相关文章

  1. C#程序集系列10,强名称程序集

    当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改 ...

  2. C#程序集系列08,设置程序集版本

    区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...

  3. C#程序集系列05,让程序集包含多个module

    本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 usi ...

  4. C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

    本篇在一个程序集包含多个module的场景下体验internal的含义. →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到 ...

  5. C#程序集系列13,如何让CLR选择不同版本的程序集

    本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 → ...

  6. C#程序集系列12,C#编译器和CLR如何找寻程序集

    本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式. □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.N ...

  7. C#程序集系列11,全局程序集缓存

    全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...

  8. C#程序集系列09,程序集签名

    在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...

  9. C#程序集系列06,程序集清单,EXE和DLL的区别

    CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...

随机推荐

  1. 详解MySQL大表优化方案

    单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时 ...

  2. Unix IPC之Posix信号量实现生产者消费者

    采用多生产者,多消费者模型. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /**  * 生产者  */ P(nempty); P(mutex); // 写入一个 ...

  3. Ajax请求中的async:false/true

    Ajax请求中的async:false/trueasync. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的succes ...

  4. 能ping但是无法上网

    管理员权限,执行以下这个命令就好了. netsh winsock reset 配置问题,重置windows socket.

  5. Python 的內建模块

    >>> import __builtin__>>> dir(__builtin__)['ArithmeticError', 'AssertionError', 'A ...

  6. 自己动手编译OpenSSL库

    因为工作需要,要实现一个基于SSL的通信程序.之前没有接触过SSL协议通讯,这次学习了一下如何自己编译OpenSSL库. 我使用的环境是Windows 10 + VS2015 1.首先打开VS2015 ...

  7. Firefox地址栏样式设定

    我希望把Firefox的界面调整为chrome-like,一个关键的地方就是地址栏:地址栏和tab之间的距离太大了,地址栏和页面本身之间的距离也太大. 设定方法是在FF中安装stylish插件,然后加 ...

  8. easyui tree tabs

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. python语法(二)— 判断

    昨天简单的学习了一些python的一些简单的语句与python的数据类型,今天继续学习python的基础语句 if 语句. 一.if 语句 if 语句语法 if expression: ifSuite ...

  10. bzoj2660: [Beijing wc2012]最多的方案

    题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...