我近期研究了一下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,
結果與脫殼前一樣,脫殼成功!