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

发布时间:2024年01月12日

灵感来源于观看了大佬的博客,于是模仿大佬的操作自己尝试下。下面是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文件

在命令行输入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
那么我们逐行分析IL文件中的这段代码。

?第一行: IL_0000: ?/* 19 ? | ? ? ? ? ? ? ? ? ?*/ ldc.i4.3 (?/* 19 ? | ? ? ? ? ? ? ? ? ?*/这个为实际字节)

?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

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

文章来源:https://blog.csdn.net/AmiensLiew/article/details/135534424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。