首页
社区
课程
招聘
[旧帖] 这样的PE文件为什么能正常运行? 0.00雪花
发表于: 2009-7-16 20:18 1377

[旧帖] 这样的PE文件为什么能正常运行? 0.00雪花

2009-7-16 20:18
1377
今天找到一个PE文件,用加密软件加密下,结果等了很久提示我加壳失败,原因是内存不足!
很不解,折腾半天才发现奇怪的地方。用LordPE查看该文件,如下图所示

划红线的2个,第一个(SizeOfImage是映像装入内存后的总尺寸)大小是480GB左右大小,
第二个(BaseOfDate是数据区块起始RVA)大小是2GB多。

很好奇,这个文件居然能正常运行,我是命令行运行的。想问下:这个程序有没有可能是编译器编译出来的?这2个值这样修改,为什么不出错呢?
这个加壳程序应该是取这2个值来作为压缩的参数所以出错了。那么想正确的取参数,我们应该取区块的对齐值大小,而不取实际大小吗?对文件总大小,也应该用GetFileSize函数取大小吗?

迷惑中,请高人指教。

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
是480MB和2MB,不是480GB和2GB……
如果这是一个用于数值计算的程序,比如Visual Fortran写的程序,用到的数据量非常大,的确有可能达到这个级别。从各区段大小可以看出,.data段很大,符合这个特征。
2009-7-16 21:51
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个文件确实用于数值计算,程序本身只有2MB多一点。对哦,确实是480MB和2MB,我算错了,不好意思。
还有一点疑惑:.test段为什么这么大呢,比.data段还大。
2009-7-16 21:58
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
看VSize明明是.data段大……
.data段的RSize不大,因为很多数据是程序运行时才初始化的。
2009-7-16 22:00
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦谢谢了。对于这个程序,加壳的话,压缩各区块分配内存空间时,用于压缩.data段而分配的内存大小应该是按
RSize而不是VSize来确定,对吧。一般加壳软件是怎么确定要申请内存空间的大小来压缩这样的文件呢?
2009-7-16 22:21
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
6
加壳程序一般是先把文件映像到内存中然后再加密的吧,这样映像到内存中的时候因为需要空间太大就可能失败。
不过这么大的内存体积占用,在Win32下跑比较吃力的。一般来说这应该是数值计算过程中用到的中间变量的数组很多很大,而且都用静态数组。如果楼主是程序作者,应该改良一下程序,用作中间变量的大数组使用动态数组,用完就Free掉,这样既少占内存也提高效率。
2009-7-16 22:34
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢!换个思路,从加壳程序本身出发:我想可以多次压缩同一区块,判断当要压缩数据大于100MB时,100M的数据一压缩,多压缩几次,应该能达到相同的效果。再次感谢!
2009-7-16 22:44
0
游客
登录 | 注册 方可回帖
返回
//