如何改变.net托管的入口main函数

有小伙伴问: .NET托管入口Main函数可以修改成别的函数,用来作为程序的入口吗?

答案:当然是可以的。这也算是.NET里面非常简单的骚操了。本篇来用最新的.NET8演示下,如何修改Main入口。

1.简单控制台例子:

复制代码
namespace ConsoleApp1{    internal class Program    {        static void Main(string[] args)        {            Console.WriteLine("Call Main");        }        static void ABC()        {            Console.WriteLine("Call ABC");        }    }}

例子里面有两个函数:Main和ABC。Main函数是托管入口函数,这里演示下如何把托管入口函数改为ABC函数。结果是程序启动会直接打印出"Call ABC"字符串,而不是"Call Main"字符串。

以上代码运行之后在bin/Debug/net8.0目录下生成了ConsoleApp1.dll文件,比如我的当前目录如下:

2.修改

我们需要用到一个工具CFF Explorer_CN(本文底部有这个小工具的下载链接)解析下ConsoleApp1.dll托管动态链接库。它是类似于PE查看器的小工具,同时也兼具托管DLL的MSIL数据查看。如下图:

把ConsoleApp1.dll拖入到CFF Explorer_CN,展开.NET目录-》表-》Method表。如下图所示:

Method表里面有三个方法,我们只看前两个方法Main和ABC 。点击下Main,看到Main函数RVA的Value值是00002050

点击下ABC函数,它的RVA Value值是0000207C

知识点来了,JIT编译MSIL的时候根据RVA的值,进行定位函数头的位置。既然如此,把Main的RVA Value改成ABC的RVA Value,把ABC的RVA Value改成Main的RVA Value。即可进行Main函数和ABC函数的逻辑调换。

如何改呢?在Main的Value值处双击,把Value改成ABC的RVA Value值:0000207C。同样在ABC的Value值处双击,把Value值改成Main的RVA Value值:00002050。如下红框双击即可改动数据。

记得关闭ConsoleApp1.dll的时候保存下,不然改动不会生效。

最后cmd切换到ConsoleApp1.dll的目录,通过dotnet命令运行下下:

复制代码
dotnet ConsoleApp1.dll

结果如下:

CFF Explorer简单介绍

CFF Explorer是一款优秀的PE资源工具,使用CFF Explorer可以方便地查看和编辑PE(EXE/DLL)资源,类似PE资源工具

使用CFF Explorer可以查看和修改PE文件的资源,可以查看dll文件可供调用的函数,修改函数入口地址达到制造崩溃屏蔽功能的目的。

PE(Portable Execute)文件被称为可移植的执行体,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件 。

相关推荐
淡海水4 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅7 小时前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day7 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
吃一碗粉只付一碗钱16 小时前
12-给SPA友好的401和403响应
c#·状态模式
caimouse1 天前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
will_net1 天前
apollo 站点部署&C#接入
开发语言·c#·apollo
吾与谁归in1 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day1 天前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
吃一碗粉只付一碗钱2 天前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#