Delphi程序中释放出EXE文件
kongfoo/2004.6.26
近来用Delphi练一下手写个简单的壳,要实现一个功能:加了壳后再释放出
UPX压缩一下,这样就不用到处找压缩库了,够懒:D
BMP文件格式:
ID 2bytes =='BM'
FileSize 1dword ==整个文件的大小
Reserved 1dword ==保留
BitmapDataOffset 1dword ==从文件开始到位图数据开始之间的偏移量
BitmapHeaderSize 1dword ==位图信息头的长度
Width 1dword ==位图的宽度
Height 1dword ==位图高度
Planes 1word ==位图的位面数
BitsPerPixel 1word ==每个象素的位数
Compression 1dword ==压缩类型
BitmapDataSize 1dword ==位图数据的大小
HResolution 1dword ==水平分辨率
VResolution 1dword ==垂直分辩率
Colors 1dword ==位图使用的颜色数
ImportantColors 1dword ==指定重要的颜色数
Palette N*4byte ==调色板规范
BitmapData xxxxbytes ==图象数据
首先随便找个BMP文件,我找到的是winxp\blue lace 16.bmp,这个文
件的图像大小是48*48,复制文件头:
42 4D F8 04 00 00 00 00 00 00 76 00 00 00 28 00
00 00 30 00 00 00 30 00 00 00 01 00 04 00 00 00
00 00 00 00 00 00 C3 0E 00 00 C3 0E 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80
00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80
00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF
00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF
00 00 FF FF FF 00
将这个文件头插入到UPX头(工具我用UE)。Delphi程序中加入一个Image
控件,picture选手工制作的BMP文件,再来一句:
Form1.Image1.Picture.SaveToFile(tmp_upx_fname);
这样解出来的文件大小只有原BMP的大小,而UPX程序有92K,94208字节,
没解全。经过试验,只需改变位图的宽和高就可以控制输出的文件大小了。
计算公式:文件大小≈宽×高/2
比如要输出94208字节,先确定高为256,哪么宽就应该为:文件大小*2/高=736了。
将文件头中的30 00 00 00 30 00 00 00改为e0 02 00 00 00 01 00 00,
输出文件大小为94214,比较准确了,但还要减去BMP文件头的大小112字节,所以
要调大一点,改高为257,宽还是736,输出文件94582字节,OK了,剩下的就是
处理一下输出文件,去掉BMP文件头,就可以用了。
过程中可以发现Delphi的Image控件的SaveToFile功能对BMP格式的处理方式:
根据位图的高和宽输出文件,而不理会FileSize或BitmapDataSize等数据。
====================
环境:Delphi 7 winXP
====================
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!