简单脱壳EncryptPE 2003.5.18篇
【目 标】:win98's notepad
【工 具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F
【任 务】:当然是脱马甲了
【操作平台】:WINDOWS 2000 ADV
【作 者】:loveboom[DFCG]
【相关链接】: 不记得了,自己去搜一下吧。
【简要说明】:今天有点时间,也算是打发一下,不想自己太难过了。所以就玩了一下,不知道和fly的同不同,我现在还没看fly的,不是说fly写的不好,只是我觉得如果自己能够脱了之后再看别人的文章更能学到点东西,如果没能力脱的话就先看再脱(非常感谢fly给我等菜鸟这么多好的文章)。这个壳还比较好玩的。如果可能的话,最好自己动手后再看文章。
【详细过程】:
设置:
取消int3异常,其它选上加上0EEDFADE和C0000008(INVALID HANDLE)两个异常地址。
加壳后用peid找一下它说是upx的,好晕呀 ,不过我是我自己加的所以当然知道它是“冒牌”的了。这样我的petools也就多“认识”一款壳了。
第一步找OEP:
这步不难,在第八次int 3异常之后,在内存CODE(一般是40xxxx)段下断,这样就到了入口处。
第二步修复输入表
按第二次Shift+f9之后,下Mr GetProcAddress如果发现像这样子就第二次没错:
0012FECC 004061B4 ASCII "6e"
0012FED0 785C0000 OFFSET shell32.#465
0012FED4 00000202
0012FED8 77E69AC1 kernel32.GetProcAddress
0012FEDC 711A41BE RETURN to V1200351.711A41BE from V1200351.71126CF4
0012FEE0 785C0000 OFFSET shell32.#465
0012FEE4 00CFC77C ASCII "DragFinish"
0012FEE8 0012FEF4 Pointer to next SEH record
如果是这样子的话就要第三次Shift+f9后下mr GetProcAddress了:
0012FF90 0040D29A /CALL to GetProcAddress from notepad.0040D298
0012FF94 71120000 |hModule = 71120000 (V1200351)
0012FF98 0040D170 \ProcNameOrOrdinal = "EncryptPE_Init"
下断后第一次到这里:
7119D310 8B00 MOV EAX,DWORD PTR DS:[EAX]
7119D312 3C CC CMP AL,0CC
7119D314 74 14 JE SHORT V1200351.7119D32A
再按F9一次中断在系统中,现在看看当前堆栈的地址:
0012FEDC 711A41BE /CALL to GetProcAddress from V1200351.711A41B9
0012FEE0 785C0000 |hModule = 785C0000 (shell32)
直接在711A41BE处下断,按F9停下,向下不远处看到这段代码:
711A41FE 8B55 B8 MOV EDX,DWORD PTR SS:[EBP-48]
711A4201 E8 E2F0FFFF CALL V1200351.711A32E8 //这里跟进
711A4206 E9 B7010000 JMP V1200351.711A43C2
711A420B 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
跟进后,我们要找IAT了,这个不难, 看代码先。
711A32E8 55 PUSH EBP
711A32E9 8BEC MOV EBP,ESP
711A32EB 83C4 F8 ADD ESP,-8
711A32EE 53 PUSH EBX
711A32EF 56 PUSH ESI
711A32F0 57 PUSH EDI
711A32F1 8BF9 MOV EDI,ECX ; notepad.004063F8
//在数据窗口里直接到4063f8(ECX的值),这样向上找一下就可以看到IAT的位置和大小了
711A32F3 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
再一直按F8来到这里:
711A3379 8908 MOV DWORD PTR DS:[EAX],ECX
711A337B 8BC3 MOV EAX,EBX
711A337D 83C0 0B ADD EAX,0B
711A3380 8BCA MOV ECX,EDX
711A3382 83C1 05 ADD ECX,5
711A3385 334D FC XOR ECX,DWORD PTR SS:[EBP-4] //这里[EBP-4]=正确API
//所以这里改成mov ecx, dword ptr ss:[ebp-4]
711A3388 8908 MOV DWORD PTR DS:[EAX],ECX
711A338A 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX //这里改IAT的成员
//所以这里改成NOP。
711A338D 85FF TEST EDI,EDI
711A338F 74 29 JE SHORT V1200351.711A33BA
711A3391 33D2 XOR EDX,EDX
改好后,md删除内存断点,再按f9异常后按Shift+f9直到全部解压完成(判断很易的,看看状态栏就知道了)。完成后CTRL+P打开Patches窗口,这里可以看到我们改过的代码,双击代码并"清场"(反原代码),这样不会让壳发现你已经改了的。
后面就按Shift+f9准备到入口处,到入口之后你就会发现全部API修复好了。现在用lordpe dumped下来并去掉壳启动的那个节(如果是delphi的程序就不要去了,去了程序无法运行的),修复输入表,Rebuilder之后就可以。壳也就此脱完了。
献给我亲爱的DFCG,愿它能够蒸蒸日上!
Thank all of my friends,best wish for you!
Thanks:
Fly 辉仔yock、jingulong、二哥、tDasm、所有曾经关心支持或帮助过我的朋友!谢谢您们!