反编译dll文件,C#的装箱与拆箱,

目录

 编写cs文件​编辑

反编译成IL文件 

分析IL文件

 第一行: IL_0000:  /* 19   |                  */ ldc.i4.3

第二行: IL_0001:  /* 0A   |                  */ stloc.0

第三行:_0002:  /* 06   |                  */ ldloc.0

第四行:_0003:  /* 8C   | (01)00000F       */ box        [System.Runtime]System.Int32

第七行 IL_000a:  /* A5   | (01)00000F       */ unbox.any  [System.Runtime]System.Int32

第八行: IL_000f:  /* 0C   |                  */ stloc.2

第九行 : IL_0010:  /* 2A   |                  */ ret

总结


       该文章尝试把cs(C#语言)文件反编译成.Net的IL(通用中间语言)文件以观察拆箱和装箱的过程在IL文件中是怎么发生的。

灵感来源于观看了大佬的博客,于是模仿大佬的操作自己尝试下。下面是CREDIT。
原文连接:Six Important .NET Concepts: Stack, Heap, Value Types, Reference Types, Boxing, and Unboxing - CodeProject(大佬的图片和文章都比这篇博文精彩,推荐去看下。)

关于CIL部分参考的博客:

Understanding Common Intermediate Language (CIL) - CodeProject

然后关于后续用到的把dll文件反编译成IL文件是参考下面这篇博客。
如何使用ILAsm與ILDasm修改.Net exe(dll)文件_ZenDei技術網路在線

 编写cs文件

该程序做了三步操作,
1.把整数3赋值给变量X。
2.把变量X传递给一个Object类“O”。
3.再把O传递给变量Y。

在命令行输入dotnet build,或者直接代码,即可得到dll文件与exe文件。

反编译成IL文件 
  1. 打开Visual Studio 2022 Developer Command Prompt(这个下载了VS就会自动装上)。
  2. 输入“ILDSM”打开反编译的软件。
  3. 文件--打开--选择dll/exe文件--转储--默认选项下点确定

  4. 得到IL文件

分析IL文件

终于找到了CIL(Common Intermediate Language )的文档了。以下也是CREDIT。
https://www.ecma-international.org/wp-content/uploads/ECMA-335_5th_edition_december_2010.pdf
其中文档用到的部分专业术语需要先做下定义。例如Load,Store,Push,Pop.

  • The process of adding the item to the stack is called Push 
  • 把物体添加进栈的过程叫做压入(Push)
  • and the removing the item from the stack is called Pop.
  • 把物体移除出栈的过程叫做弹出(Pop)
  • Instruction that copy values from memory to the evaluation stack are called Load .
  • 从内存把值复制到(评估)栈称为加载(Load)
  • and the instruction that copy values from stack back to memory are called Store.
  • 从(评估)栈上把值复制到内存称为储存(Store)


那么我们逐行分析IL文件中的这段代码。

 第一行: IL_0000:  /* 19   |                  */ ldc.i4.3

IL_0000:首先看到的是IL_0000,称为CIL Code labels. 是可以任意更改的,只是一个代码的标签。

 /* 19   |                  */:这个为实际字节,是ldc.i4.3这个指令的原始格式。

 ldc.

载入常量:载入常量指令被使用来加载int32, int64, float32, or float64等常量。

然后idc.下又有各种不同的指令,然后把不同的数据压入栈中。

我们要找的idc.i4.3在这里,把3压入栈里。

第二行: IL_0001:  /* 0A   |                  */ stloc.0

把值从栈上弹出(pop)至本地变量

所以该行是把数值从栈上弹出至本地变量0


第三行:_0002:  /* 06   |                  */ ldloc.0

把本地变量0载入栈中。

第四行:_0003:  /* 8C   | (01)00000F       */ box        [System.Runtime]System.Int32

Convert a boxable value to its boxed form:把可装箱类型装箱成他的装箱形式。
 

第五六行:

    IL_0008:  /* 0B   |                  */ stloc.1
    IL_0009:  /* 07   |                  */ ldloc.1

把数值从栈上弹至本地变量1

把本地变量1载入栈中。

第七行 IL_000a:  /* A5   | (01)00000F       */ unbox.any  [System.Runtime]System.Int32

拆箱操作,把值类型形式的object拆箱成值类型

第八行: IL_000f:  /* 0C   |                  */ stloc.2

   把数值从栈上弹至本地变量2

第九行 : IL_0010:  /* 2A   |                  */ ret

从方法中返回,是否需要带返回值为一个可选项。

总结

       所以最终通过明白IL文件中实际的操作,我们可以知道把值类型赋值给引用类型,是会经历装箱的操作的。而反过来,把引用类型赋值给值类型会经历拆箱的操作。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 易语言是一个编程语言,它的特点是简单易学、上手快,并且可以开发出各种应用程序。在易语言开发中,我们可以编写并使用动态链接库(DLL文件,这些文件可以用来实现一些功能模块的封装,方便在不同的应用程序中使用。 然而,由于DLL文件的特性,使得它们容易被编译编译是指将已编译的程序文件转换回可读的源代码文件的过程。在易语言中,一些较为简单的编译工具可以将DLL文件还原为易语言的源代码。 编译易语言的DLL文件可能会导致一些潜在的风险。首先,开发者的源代码可能会被窃取,从而导致知识产权的损失和商业竞争的风险。其次,编译后的源代码可以被不法分子用于改造和篡改,从而产生恶意软件或病毒,对用户的电脑和隐私造成损害。 为了防止易语言的DLL文件编译,我们可以采取一些安全措施。首先,可以使用易语言开发工具的加密功能,对DLL文件进行加密保护,使得编译变得更加困难。其次,可以使用一些译技术,如混淆代码和使用程序保护工具,增加编译的难度。另外,定期更新和升级程序也是保护DLL文件的重要步骤。 总而言之,易语言的DLL文件在一定程度上容易被编译。为了防止源代码的泄露和恶意篡改,开发者应该采取一些安全措施来保护自己的软件和用户的利益。 ### 回答2: 易语言是一种基于VBScript的编程语言,易语言程序可以以.dll文件的形式存在。编译是指将已编译的程序还原为源代码的过程。 易语言的.dll文件编译过程相对简单,可以通过一些专门的编译工具进行操作。这些工具可以解析.dll文件,还原出其中的源代码,使得他人能够查看和修改原始代码。 然而,需要注意的是,编译是一种侵犯软件知识产权的行为,有可能违相关的法律法规。大多数软件开发者不希望其他人对他们的代码进行编译,因为这可能导致他们的源代码被他人使用或修改。 为了保护软件的知识产权,开发者通常会在编写代码时采取一些措施,如代码混淆、加密或使用特殊的编译工具,以增加编译的难度。但是这些方法并不能完全阻止有心人进行编译。 总之,易语言的.dll文件编译是一种可能存在的行为,但是该行为通常是不被鼓励和支持的,因为它可能涉及到侵犯他人知识产权的问题。以合法合规的方式使用和保护软件知识产权是我们应该遵循的原则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值