1.载入PEID
PEncrypt 4.0 Gamma / 4.0 Phi -> junkcode [Overlay]
2.载入OD,没什么头绪,忽略所有异常,用最后一次异常法shift+F9运行两次,因为第三次会跑飞,所以运行两次,另外这个壳使用单步太费劲了,一不小心就跑飞了,所以直接使用的最后一次异常法进行脱壳的
00401000 > FC cld ; //入口点 00401001 FC cld 00401002 FC cld 00401003 90 nop 00401004 - E9 BDBA0000 jmp PEncrypt.0040CAC6 00401009 - E3 D5 jecxz short PEncrypt.00400FE0 0040100B 04 4F add al,0x4F 0040100D - 74 A4 je short PEncrypt.00400FB3 0040100F D248 74 ror byte ptr ds:[eax+0x74],cl
3.最后一次异常法的落脚点,落脚后,右键—转到—表达式—输入SE句柄(也叫SE处理程序)”0040CCD7”—回车
0040CCD0 9D popfd 0040CCD1 90 nop 0040CCD2 4B dec ebx ; //最后一次异常法落脚点 0040CCD3 6F outs dx,dword ptr es:[edi] 0040CCD4 6368 69 arpl word ptr ds:[eax+0x69],bp 0040CCD7 8B4424 04 mov eax,dword ptr ss:[esp+0x4] 0040CCDB 8B00 mov eax,dword ptr ds:[eax] 0040CCDD 3D 04000080 cmp eax,0x80000004 0012FF88 0040CCD7 SE处理程序
4.回车后的位置,然后F2,SHIFT+F9,F2,也就是让程序运行到转到的位置上,然后继续F8,F8过程中,记得在向上跳转的下一行F4,也就是让程序运行到向上跳转的下一行,这是脱壳的基本原则,尽量不让程序往回跳
0040CCD3 6F outs dx,dword ptr es:[edi] 0040CCD4 6368 69 arpl word ptr ds:[eax+0x69],bp 0040CCD7 8B4424 04 mov eax,dword ptr ss:[esp+0x4] ; //回车的位置 0040CCDB 8B00 mov eax,dword ptr ds:[eax] 0040CCDD 3D 04000080 cmp eax,0x80000004 0040CCE2 74 06 je short PEncrypt.0040CCEA 0040CCE4 4B dec ebx
5.找到关键跳,指向OEP的关键跳
0040CD26 9D popfd 0040CD27 61 popad 0040CD28 BD CC104000 mov ebp,PEncrypt.004010CC 0040CD2D - FFE5 jmp ebp ; //指向OEP的关键跳 0040CD2F 0000 add byte ptr ds:[eax],al 0040CD31 0000 add byte ptr ds:[eax],al 0040CD33 0000 add byte ptr ds:[eax],al
6.来到OEP,进行脱壳,需要注意的是脱壳后无法正常运行,需要使用loadPE重建PE表才可以正常运行
004010CC 55 push ebp ; PEncrypt.004010CC 004010CD 8BEC mov ebp,esp 004010CF 83EC 44 sub esp,0x44 004010D2 56 push esi 004010D3 FF15 E4634000 call dword ptr ds:[<&KERNEL32.Get>; kernel32.GetCommandLineA 004010D9 8BF0 mov esi,eax 004010DB 8A00 mov al,byte ptr ds:[eax] 004010DD 3C 22 cmp al,0x22 004010DF 75 1B jnz short PEncrypt.004010FC
7.运行查壳
运行OK,查壳:Microsoft Visual C++ v6.0 SPx