我最近研究了UPX壳的脱壳方法。 以下是脱壳的例子。
UPX作为元老级的PE加密外壳,在以前的时代盛行,有名的病毒【熊猫烧香】使用了这个加密外壳。
脱下UPX的外壳揭开神秘的面纱吧。
首先,PEiD加载包含upx shell的程序,结果如下:
upx0. 89.6-1.02/1.05-1.24-Markus Laszlo
然后用OD加载后,OEP如下所示。
0040E8C0 60 PUSHAD
0040E8C1 BE 15B04000 MOV ESI,UPX.0040B015
040E8C68DBEB5FFFFleaEDI,DWORD PTR DS:[ESI FFFF5FEB]
0040E8CC 57 PUSH EDI
0040E8CD 83CD FF OR EBP,FFFFFFFF
040 e 8d0EB 10 jmpshortupx.0040 e8e 2
0040E8D2 90 NOP
0040E8D3 90 NOP
0040E8D4 90 NOP
0040E8D5 90 NOP
0040E8D6 90 NOP
0040E8D7 90 NOP
然后一步一步地……直到大跳跃:
040 ea0f-e9b 826 ffffjmpupx.004010 cc
040 ea 140000 addbyteptrds : [ eax ],AL
040 ea 160000 addbyteptrds : [ eax ],AL
040 ea 180000 addbyteptrds : [ eax ],AL
040 ea1a 0000 addbyteptrds : [ eax ],AL
040 ea1c 0000 addbyteptrds : [ eax ],AL
040 ea1 e 0000 addbyteptrds : [ eax ],AL
040 ea 200000 addbyteptrds : [ eax ],AL
跟进到此,发现后面是填充位,所以跟进跳跃:
004010CC 55 PUSH EBP
004010CD 8BEC MOV EBP,ESP
04010cf83EC44子esp,44
004010D2 56 PUSH ESI
04010 d 3f f15 e 4634000 calldwordptrds : [ 4063 E4 ]; kernel32.GetCommandLineA
004010D9 8BF0 MOV ESI,EAX
004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]
004010DD 3C 22 CMP AL,22
04010 df 751 bjnzshortupx.004010 fc
004010E1 56 PUSH ESI
04010 e 2f f15 f 4644000 calldwordptrds : [ 4064 F4 ]; USER32.CharNextA
004010E8 8BF0 MOV ESI,EAX
004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]
找到了熟悉的Win32API。 程序的入口在这里。
下定决心使用OllyDump,
EIP作为OEP,作为外壳,
将新的PE程序另存为aaa.exe,
然后运行aaa.exe,
结果和脱壳前一样,脱壳成功了!