当前位置: 首页 > news >正文

C#程序集系列07,篡改程序集

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

 

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

 

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


 
using System;

 
public class Dog
{
    public static void MakeSound()
    {
        Console.WriteLine("汪汪汪");
    }
}

 
→把Dog.cs编译成程序集
38

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

 


 
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly Dog
{
  .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
}
.module Dog.dll
// MVID: {A8BAEEAB-2DF4-425C-B851-87260378D735}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x00400000

 

 
// =============== CLASS MEMBERS DECLARATION ===================

 
.class public auto ansi beforefieldinit Dog
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  MakeSound() cil managed
  {
    // 代码大小       13 (0xd)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ldstr      bytearray (6A 6C 6A 6C 6A 6C )                               // jljljl
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Dog::MakeSound

 
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // 代码大小       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method Dog::.ctor

 
} // end of class Dog

 
 
 

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

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


 
using System;

 
class MainClass
{
    static void Main()
    {
        Dog.MakeSound();
    }
}

 
 
 

→编译MainClass.cs,引用Dog.dll,生成MainClass.exe
40
→执行MainClass.exe
41
→现在要篡改Dog.dll,先删除Dog.dll
42
→在as文件夹下创建AnotherDog.cs类,用记事本打开,编写如下,保存


 
using System;

 
public class Dog
{
    public static void MakeSound()
    {
        Console.WriteLine("小狗怎么叫~");
    }
}

 
 
 

→编译AnotherDog.cs类,同样生成一个Dog.dll程序集
43
→再次运行MainClass.exe
44
篡改程序集成功。

 

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

 

“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

相关文章:

  • 线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁
  • Android SDK Manager 无法更新的解决办法
  • java电子商务系统源码 Spring MVC+mybatis+spring cloud+spring boot+spring security
  • 软件加密与解密
  • SPOJ 422 Transposing is Even More Fun(polay计数)
  • DevExpress.9.2.9 破解文件
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 071:【Django数据库】ORM聚合函数详解-Avg
  • 自定义函数
  • 用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
  • 如何编写一个可升级的智能合约
  • disruptor 核心概念 二
  • 线程池-线程池源码详解
  • Java总结 - String - 这篇请使劲喷我
  • 星舆科技:打造下一代定位技术 以高精度位置感知构筑AI+时代基础力量
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Android优雅地处理按钮重复点击
  • HashMap剖析之内部结构
  • Java程序员幽默爆笑锦集
  • java第三方包学习之lombok
  • JDK 6和JDK 7中的substring()方法
  • js学习笔记
  • MD5加密原理解析及OC版原理实现
  • Promise初体验
  • TypeScript迭代器
  • 闭包--闭包作用之保存(一)
  • 对JS继承的一点思考
  • - 概述 - 《设计模式(极简c++版)》
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前嗅ForeSpider采集配置界面介绍
  • 如何设计一个比特币钱包服务
  • 数据可视化之 Sankey 桑基图的实现
  • 我看到的前端
  • 一份游戏开发学习路线
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • # C++之functional库用法整理
  • $.ajax中的eval及dataType
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (function(){})()的分步解析
  • (Python) SOAP Web Service (HTTP POST)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)Controller接口控制器详解(三)
  • (正则)提取页面里的img标签
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET文档生成工具ADB使用图文教程