首页
社区
课程
招聘
Delphi程序中释放出EXE文件
发表于: 2004-6-26 09:00 6461

Delphi程序中释放出EXE文件

2004-6-26 09:00
6461
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
====================

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2

郁闷,看不懂
2004-6-26 09:32
0
雪    币: 14950
活跃值: (4733)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
看着很糊涂,没理解什么意思。。。偶好菜。。。
2004-6-26 09:41
0
雪    币: 557
活跃值: (2303)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
4
唉,看不懂,我想应该可以直接用资源方式来存放吧,如果是VB就好办了,加一个res,然后
dim szByte() as byte
szByte=loadresdata(类型,id)
open file for mode as filenumber
put NO.,,szByte
close No.
2004-6-26 09:52
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
5
表达不清楚不好意思:(
将一个EXE伪装成BMP,用Image控件保存到程序里面,要用的时候就释放出来。贴子里面主要说明了怎样设置位图的高和宽来控制输出的文件大小。
2004-6-26 10:54
0
雪    币: 291
活跃值: (400)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
其实可以直接把exe文件当资源存进去
2004-6-26 12:29
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
做木马的吧?
2004-6-26 13:13
0
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没看懂~~~~~~~~~~~
2004-6-26 20:14
0
游客
登录 | 注册 方可回帖
返回
//