-
-
upx压缩问题
-
发表于:
2004-7-1 07:55
10139
-
upx压缩问题
kongfoo/2004.6.28
在调用UPX压缩程序时发现的。
1.24w和1.90beta版都存在这个问题:对XP的notepad.exe压缩失败,提示
upx: notepad.exe: CantPackException: section size problem
notepad.exe各节参数:
Section VirtualSize VirtualOffset RawSize RawOffset
.text 00006d72 00001000 00006e00 00000400
.data 00001ba8 00008000 00000600 00007200
.rsrc 00008948 0000a000 00008a00 00007800
可正常压缩的acp132 patcher.exe各节参数:
Section VirtualSize VirtualOffset RawSize RawOffset
.text 00000ffe 00001000 00001000 00000400
.rdata 000007b6 00002000 00000800 00001400
.data 00001870 00003000 00000200 00001c00
.rsrc 0002e4c8 00005000 0002e600 00001e00
2种参数比较看不出问题。upx带参数运行,下断_open。
0041A49D FF15 10A14300 CALL DWORD PTR DS:[<&msvcrt._open>] ; msvcrt._open
这里是打开notepad.upx。之后出2次异常就退出了。
压缩函数从410840开始,先一大段检查代码。
00410BFE 8B50 0C MOV EDX,DWORD PTR DS:[EAX+C] ==VirtualOffset
00410C01 8B40 10 MOV EAX,DWORD PTR DS:[EAX+10] ==RawSize
00410C04 03C2 ADD EAX,EDX
00410C06 8B5424 20 MOV EDX,DWORD PTR SS:[ESP+20] ==SizeOfImage
00410C0A 3BC2 CMP EAX,EDX
00410C0C 76 11 JBE SHORT upx.00410C1F ==VirtualOffset+RawSize大于SizeOfImage就报错
00410C0E 68 38B34200 PUSH upx.0042B338 ; ASCII "section size problem"
00410C13 E8 D808FFFF CALL upx.004014F0
00410C18 8B4C24 14 MOV ECX,DWORD PTR SS:[ESP+14]
00410C1C 83C4 04 ADD ESP,4
notepad.exe的SizeOfImage=12948,最后一节VirtualOffset+RawSize=a000+8a00=12a00,
大于12948所以报错。解决办法很简单了,把SizeOfImage项以100对齐即可。或者把jbe改成jmp。
notepad的例子对齐代码:
01006AE0 > B8 48290100 MOV EAX,12948
01006AE5 3C 00 CMP AL,0
01006AE7 74 05 JE SHORT notepad.01006AEE
01006AE9 80C4 01 ADD AH,1
01006AEC 32C0 XOR AL,AL
另外,UPX好像是有损压缩,我在notepad第一节的尾部加了3个字节的内容,经过UPX压缩
解压出来后不见了。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!