要实现自解压或自定义安装包,那么首先要简单了解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文件末尾时,可以先定义一些数据,例如文件的数量和文件名,规定多少字节是文件数量和文件名信息,读取时就读取多少字节,然后再读取文件。
好了,本章内容就完毕了,如果有什么错误的地方,请大家多包涵,毕竟都是人工输入。