文章作者:Vxer(也可以叫tankaiha或者hmx)
说来丢脸,下了注册机,却没找到在哪里注册,算了,自已跟一下。
入口处如下
代码
00568000 g> E8 00000000 call gifan.00568005
00568005 58 pop eax
00568006 83D8 05 sbb eax,5
00568009 89C3 mov ebx,eax
0056800B 83C3 30 add ebx,30
0056800E 8B43 39 mov eax,dword ptr ds>
00568011 05 00004000 add eax,gifan.004000>; ASCII "MZP"
00568016 8B4B 3D mov ecx,dword ptr ds>
00568019 89C6 mov esi,eax
0056801B 89C7 mov edi,eax
0056801D 8CD8 mov ax,ds
0056801F 8EC0 mov es,ax
00568021 B4 00 mov ah,0
00568023 AC lods byte ptr ds:[es>
00568024 30E0 xor al,ah
00568026 88C4 mov ah,al
00568028 AA stos byte ptr es:[ed>
00568029 ^ E2 F8 loopd short gifan.00>
0056802B 8B43 08 mov eax,dword ptr ds>
0056802E 50 push eax
0056802F C3 retn
向下看几行就可以知道这是一个简单的解码过程,直接将断点设在最下面的retn处,F9运行。F8来到第二处解码(要是我没想错的话)
代码
005633C0 60 db 60 ; CHAR '`'
005633C1 BE db BE
005633C2 00604E00 dd gifan.004E6000
005633C6 8D db 8D
005633C7 BE db BE
005633C8 00 db 00
005633C9 B0 db B0
005633CA F1 db F1
...
...
这里出现了反汇编错误,不管他,向下翻,到了代码的尾部
代码
...
...
00563522 .^\EB E1 jmp short gifan.0056>
00563524 > FF96 E4671600 call dword ptr ds:[e>
0056352A > 61 popad
0056352B .^ E9 184AFAFF jmp gifan.00507F48
00563530 48355600 dd gifan.00563548
00563534 64355600 dd gifan.00563564
00563538 A0905000 dd gifan.005090A0
0056353C 00 db 00
0056353D 00 db 00
0056353E 00 db 00
...
...
这段代码怎么那么像某个壳呢?将断点设在0056352B处,F9运行.F8步进一下,终于来到了原程序的入口:
代码
00507F48 > /55 push ebp
00507F49 . |8BEC mov ebp,esp
00507F4B . |83C4 F0 add esp,-10
00507F4E . |53 push ebx
00507F4F . |B8 387A5000 mov eax,gifan.00507A>
00507F54 . |E8 97E8EFFF call gifan.004067F0
00507F59 . |8B1D 34B55000 mov ebx,dword ptr ds>; gifan.0050CBF0
00507F5F . |68 14805000 push gifan.00508014
00507F64 . |6A 00 push 0
00507F66 . |6A 00 push 0
00507F68 . |E8 EFEAEFFF call gifan.00406A5C
00507F6D . |8B03 mov eax,dword ptr ds>
00507F6F . |BA 28805000 mov edx,gifan.005080>; ASCII "Easy GIF Animator"
00507F74 . |E8 0B2CF7FF call gifan.0047AB84
00507F79 . |8B03 mov eax,dword ptr ds>
00507F7B . |83C0 50 add eax,50
00507F7E . |BA 44805000 mov edx,gifan.005080>; ASCII "gifan.chm"
00507F83 . |E8 30C7EFFF call gifan.004046B8
00507F88 . |E8 477FFEFF call gifan.004EFED4
00507F8D . |84C0 test al,al
00507F8F . |75 3D jnz short gifan.0050>
...
...
将最下面那个jnz改为jmp,F9运行,果然不再弹出没有注册的窗口了。这样思路就确定了,先脱壳,再爆破。
重复上述的过程,重新来到原程序入口00507F48,然后OllyDump保存一下,可以用PEiD下,原来是Borland Delphi 6.0 - 7.0。再运行Import Rec修复注册表,入口地址填00107F48,点自动获取,成功且全部有效,修复刚才保存的文件。
最后,用OllyDbg打开修复过的文件,将00507F8F处的jnz改为jmp,保存一下。运行,爆破成功!