我近期研究了一下UPX壳的脱壳方法,下面给出脱壳示例:
UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒【熊猫烧香】就是使用这款加密壳。
现在我们一起来脱UPX壳来揭开它的神秘面纱。
首先,PEiD载入含UPX壳的程序,结果如下:
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
然后用OD载入,OEP如下:
0040E8C0 > 60 PUSHAD
0040E8C1 BE 15B04000 MOV ESI,UPX.0040B015
0040E8C6 8DBE EB5FFFFF LEA EDI,DWORD PTR DS:[ESI+FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
0040E8D0 EB 10 JMP SHORT UPX.0040E8E2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
0040E8D5 90 NOP
0040E8D6 90 NOP
0040E8D7 90 NOP
然后单步跟踪……直到大跳转:
0040EA0F - E9 B826FFFF JMP UPX.004010CC
0040EA14 0000 ADD BYTE PTR DS:[EAX],AL
0040EA16 0000 ADD BYTE PTR DS:[EAX],AL
0040EA18 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1A 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1C 0000 ADD BYTE PTR DS:[EAX],AL
0040EA1E 0000 ADD BYTE PTR DS:[EAX],AL
0040EA20 0000 ADD BYTE PTR DS:[EAX],AL
跟踪到这里,发现后面均为填充位,于是跟进跳转:
004010CC 55 PUSH EBP
004010CD 8BEC MOV EBP,ESP
004010CF 83EC 44 SUB ESP,44
004010D2 56 PUSH ESI
004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; kernel32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
004010DF 75 1B JNZ SHORT UPX.004010FC
004010E1 56 PUSH ESI
004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; USER32.CharNextA
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
发现熟悉的Win32API了,程序入口就在这里了。
果断使用OllyDump,
EIP作为OEP,脱壳,
将新PE程序保存为aaa.exe,
然后运行aaa.exe,
结果与脱壳前一样,脱壳成功!