一、破解目标:EncryptPE V2.2004.7.27加壳的XX软件
二、破解工具:OllyDbg v1.10,ImportREC 1.6 Final
三、破解作者:DarkBull@email.com.cn
四、破解过程:
1.用OllyDbg载入,提示该程序为坏的或未知格式的32位执行文件,不必理会。该壳程序运行流程大致为:第一次运行时,先在系统目录内创建V22004727.EPE,然后加载该模块,初始化时通过SetWindowsHookEx设置远程系统钩子,再给Explorer.exe的Progman发送消息,将该钩子插入Explorer.exe中,如果用OD调试,该钩子会调用TerminateProcess结束OD进程,最后通过调用V22004727.EPE模块的EncryptPE_Init函数给Explorer.exe的Progman发送特定的消息,该消息被钩子函数捕获后,V22004727.EPE就创建一个新的进程,通过调用一系列调试函数来完成解压缩工作;第二次运行时,由于该钩子已被插入Explorer.exe中,所以程序自己跳过SetWindowsHookEx过程,我们就可以用OD调试了。
2.OK!第二次加载,程序停在如下处:
GraspNet.>  60         PUSHAD
009C0001    9C         PUSHFD
009C0002    64:FF35 00>PUSH DWORD PTR FS:[0]
009C0009    E8 7A01000>CALL GraspNet.009C0188
下断点BP EncryptPE_Init,拦截后代码如下:
V2200472.>  55         PUSH EBP          
711E39F9    8BEC       MOV EBP,ESP
711E39FB    51         PUSH ECX
711E39FC    E8 0100000>CALL V2200472.711E3A02      ;有花指令,F7步入
711E3A01    EB 58      JMP SHORT V2200472.711E3A5B        
711E3A03    8B4424 40  MOV EAX,DWORD PTR SS:[ESP+40]
711E3A07    8945 FC    MOV DWORD PTR SS:[EBP-4],EAX
直到如下代码处:
711E3C2E    6A 01      PUSH 1          ;lParam=1
711E3C30    68 C81B000>PUSH 1BC8        ;wParam=1BC8
711E3C35    A1 0CDC1F7>MOV EAX,DWORD PTR DS:[711FDC0C]
711E3C3A    8B00       MOV EAX,DWORD PTR DS:[EAX]
711E3C3C    50         PUSH EAX          ;MSG=IsDebuggerPresentExEdLl(=wfs=)32EXPLORER.EXE
711E3C3D    A1 20DE1F7>MOV EAX,DWORD PTR DS:[711FDE20]
711E3C42    8B00       MOV EAX,DWORD PTR DS:[EAX]
711E3C44    50         PUSH EAX
711E3C45    E8 063DF4F>CALL V2200472.71127950                  ;JMP to USER32.SendMessageA
711E3C4A    EB 0A      JMP SHORT V2200472.711E3C56
711E3C4C    E8 FB7FFCF>CALL V2200472.711ABC4C
711E3C51    E8 3E81FCF>CALL V2200472.711ABD94
711E3C56    E8 E188FCF>CALL V2200472.711AC53C      ;ExitProcess
该进程已完成任务,新的进程已被创建。
3.在出现EncryptPE注册窗口时,用OD附加于explorer.exe,下断HE WaitForDebugEvent,拦截后堆栈为:
0166FD28   711B081C  /CALL to WaitForDebugEvent from V2200472.711B0817
0166FD2C   0166FE8C  |pDebugEvent = 0166FE8C
0166FD30   FFFFFFFF  \Timeout = INFINITE
注意0166FE8C处为:
0166FE8C  01 00 00 00 74 01 00 00 3C 07 00 00 03 00 00 80  ...t..<....
0166FE9C  00 00 00 00 00 00 00 00 B7 F1 1A 71 03 00 00 00  ........否q...
按F9运行,直到0166FEA4处为711AC53A时,向上观察发现:
0166FE4C  00 00 00 00 3B 00 00 00 23 00 00 00 23 00 00 00  ....;...#...#...
0166FE5C  00 00 00 00 00 00 00 00 00 F0 FD 7F 04 03 FE 7F  .........瘕?
0166FE6C  B0 FF 12 00 38 2C 72 00 F0 FF 12 00 38 2C 72 00  ?.8,r.?.8,r.
0166FE7C  1B 00 00 00 86 02 00 00 C4 FF 12 00 23 00 00 00  ...?..?.#...
OK,此时OEP为00722C38。
4.DUMP下整个进程,用ImportREC结合OD修复IAT,以下为加密IAT的关键部分(以CloseHandle为例):
711AC910   /74 04      JE SHORT V2200472.711AC916
711AC912   |75 02      JNZ SHORT V2200472.711AC916
711AC914   |FF25 9C505>JMP NEAR DWORD PTR DS:[7453509C]
711AC91A    0375 01    ADD ESI,DWORD PTR SS:[EBP+1]
711AC91D    E8 E845A7F>CALL 68C20F0A
711AC922    FF9C58 A35>CALL FAR FWORD PTR DS:[EAX+EBX*2+2006>
711AC929    71 74      JNO SHORT V2200472.711AC99F
711AC92B    04 75      ADD AL,75
711AC92D    02FF       ADD BH,BH
711AC92F    15 E8BF000>ADC EAX,0BFE8
711AC934    0031       ADD BYTE PTR DS:[ECX],DH
711AC936    C0A0 85062>SHL BYTE PTR DS:[EAX+71200685],83
711AC93D    F8         CLC
711AC93E    0075 36    ADD BYTE PTR SS:[EBP+36],DH
711AC941    8B4424 0C  MOV EAX,DWORD PTR SS:[ESP+C]
711AC945    89C3       MOV EBX,EAX
711AC947    83C0 02    ADD EAX,2
711AC94A    8B00       MOV EAX,DWORD PTR DS:[EAX]
711AC94C    8B00       MOV EAX,DWORD PTR DS:[EAX]
711AC94E    31D8       XOR EAX,EBX
711AC950    89C3       MOV EBX,EAX        ;kernel32.CloseHandle
711AC952    894424 0C  MOV DWORD PTR SS:[ESP+C],EAX
711AC956    8B03       MOV EAX,DWORD PTR DS:[EBX]
711AC958    3C CC      CMP AL,0CC        ;断点检查
711AC95A    74 14      JE SHORT V2200472.711AC970
711AC95C    80FC CC    CMP AH,0CC        
711AC95F    74 0F      JE SHORT V2200472.711AC970
711AC961    C1E8 10    SHR EAX,10
711AC964    3C CC      CMP AL,0CC
711AC966    74 08      JE SHORT V2200472.711AC970
711AC968    80FC CC    CMP AH,0CC
711AC96B    74 03      JE SHORT V2200472.711AC970
711AC96D    EB 08      JMP SHORT V2200472.711AC977
711AC96F  - E9 C605850>JMP SHELL32.779FCF3A
711AC974    2071 01    AND BYTE PTR DS:[ECX+1],DH
711AC977    5B         POP EBX
711AC978    58         POP EAX
711AC979    9D         POPFD
711AC97A    C3         RETN          ;返回到函数入口
5.后记:老王老师的EPEv2真的很厉害啊,偶等菜鸟苦心钻研多日,也才略知皮毛。