c#自解压程序和自定义软件安装包的实现

本文介绍了如何利用PE文件结构实现自解压功能,通过读取自身和将要解压的文件写入程序末尾来完成。同时,展示了如何打包多个文件,包括使用自定义数据结构来存储文件信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要实现自解压或自定义安装包,那么首先要简单了解pe文件结构,网上有很多这方面的内容,可以自己学习一下,只需要简单了解不需要很精通就能搞明白本章原理,当然如果你对pe文件很了解的话,还可以制作捆绑软件,所谓捆绑软件是把两个exe程序(或者多个)变成一个程序,打开这个程序就可以运行捆绑的两个程序,说明下本章内容是做不到这点的。

上面的废话是让读者知其然还知其所以然,现在开始说重点了,要想实现自解压,核心是:把要解压文件写入pe文件末尾,写入末尾不会破坏pe文件结构
现在先创建一个项目实现解压程序,程序名是self.exe

//自己读取自己,我为了简单是写死的,读者可以调用api,获取当前程序名
byte[] data = File.ReadAllBytes("self_extracting.exe");
//这是self_extracting.exe也就是解压程序的大小,只能写死
int len = 4608;
byte[] buffer = new byte[data.Length - len];
Array.Copy(data, len, buffer, 0, buffer.Length);
File.WriteAllBytes("2.txt", buffer);

重点:len是怎么获取的,获取方法是编译这段程序,然后看这段程序的大小,因为len是int类型始终是4个字节,所以修改这个值不会改变这段程序的大小,如果觉得小可以改成long,说明下这个值不是随便写的。

再创建一个项目实现打包程序,把self.exe和1.txt合并在一起,程序名是pack.exe

byte[] s_data = File.ReadAllBytes("self.exe");
byte[] t_data = File.ReadAllBytes("1.txt");
byte[] file_data = new byte[s_data.Length+t_data.Length];
Array.Copy(s_data, 0, file_data, 0, s_data.Length);
Array.Copy(t_data, 0, file_data, s_data.Length, t_data.Length);
File.WriteAllBytes("self_extracting.exe", file_data);

运行这段程序请创建一个1.txt文件,并写入一些内容,我这里为了展示原理,所以很多东西就写死了,如果你搞明白这些原理,就可以做个界面和很牛的效果,我就看过一个加密软件是用的自解压技术。

用法是:
把self.exe pack.exe 1.txt放在同一目录,先运行打包程序pack.exe,会生成self_extracting.exe,再运行self_extracting.exe就会解压出2.txt文件,然后对比1.txt和2.txt文件,如果一样就成功了。

根据这个原理可以打包任何文件,还可以多个文件打包,甚至可以打包文件夹。多文件打包,我可以提供一个思路,就是写入pe文件末尾时,可以先定义一些数据,例如文件的数量和文件名,规定多少字节是文件数量和文件名信息,读取时就读取多少字节,然后再读取文件。

好了,本章内容就完毕了,如果有什么错误的地方,请大家多包涵,毕竟都是人工输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值