被害者:Easy Video to 3GP Converter 1.4.2
工具:FastScanner(查壳工具) OllyDbg(调试器)
作案者:Xelloss
之前也看了不少教程,自己也尝试过,但运气不好,找来的软件都是网络注册的,本地破不了 。这次总算是找到个正常的了...
首先先打 卡软件点Register,在User Name里我们填上这边要注册的名字(我填的Xelloss),在Registration Code里随便填一点东西(我填了fark)。点OK之后弹出了“Invalid user name or registeration code”。
接下来对软件用OD进行调试。在里面搜索 ACSII,输入关键字“Invalid user name or registeration code”找到一条Enter进行追踪,调查立即参数,发现只有一个地址,不用管它。接下来光标往上移一点发现
004060A5 > \6A 40 push 40
是被
00405FC0 . /0F85 DF000000 jnz 004060A5
从老远跳过来的。
锁定那个jnz,看看它的周围
00405FA9 . 8D8424 880000>lea eax, dword ptr [esp+88]
00405FB0 . 8D4C24 48 lea ecx, dword ptr [esp+48]
00405FB4 . 50 push eax
00405FB5 . 51 push ecx
00405FB6 . E8 35F8FFFF call 004057F0
00405FBB . 83C4 08 add esp, 8
00405FBE . 85C0 test eax, eax
00405FC0 . 0F85 DF000000 jnz 004060A5
00405FC6 > 8A4C04 08 mov cl, byte ptr [esp+eax+8]
00405FCA . 8888 98964100 mov byte ptr [eax+419698], cl
00405FD0 . 40 inc eax
00405FD1 . 84C9 test cl, cl
00405FD3 .^ 75 F1 jnz short 00405FC6
00405FD5 . 33C0 xor eax, eax
00405FD7 > 8A4C04 48 mov cl, byte ptr [esp+eax+48]
00405FDB . 8888 50924100 mov byte ptr [eax+419250], cl
我们可以看 出00405FB6 . E8 35F8FFFF call 004057F0
是关键点。
在00405FA9 . 8D8424 880000>lea eax, dword ptr [esp+88]
上按F2下个断点按F9运行程序,注册,输入Name和Code后OK,OllyDBG 跳了出来,暂停在我们下的断点处。看信息窗口
Stack address=0012A310, (ASCII "7E87237D")
eax=00000001
这东西一会儿有用。F8单步一次后可以看到信息窗口里我们刚刚输入的信息:
Stack address=0012A2D0, (ASCII "fark")
ecx=77A7E910 (ntdll.77A7E910)
也就是我们输入的Code。根据经验可以看出这儿准备要比对注册码。继续F8单步。
走到00405FB6 . E8 35F8FFFF call 004057F0
这步,按F7跟进去。我们看到的是这么一段函数:
004057F0 /$ 53 push ebx
004057F1 |. 8B5C24 08 mov ebx, dword ptr [esp+8]
004057F5 |. 56 push esi
004057F6 |. 57 push edi
004057F7 |. 8BFB mov edi, ebx
004057F9 |. 83C9 FF or ecx, FFFFFFFF
004057FC |. 33C0 xor eax, eax
004057FE |. 33D2 xor edx, edx
00405800 |. F2:AE repne scas byte ptr es:[edi]
00405802 |. F7D1 not ecx
00405804 |. 49 dec ecx
00405805 |. 85C9 test ecx, ecx
00405807 |. 7E 15 jle short 0040581E
00405809 |> 8A041A /mov al, byte ptr [edx+ebx]
0040580C |. 3C 61 |cmp al, 61
0040580E |. 7C 09 |jl short 00405819
00405810 |. 3C 7A |cmp al, 7A
00405812 |. 7F 05 |jg short 00405819
00405814 |. 2C 20 |sub al, 20
00405816 |. 88041A |mov byte ptr [edx+ebx], al
00405819 |> 42 |inc edx
0040581A |. 3BD1 |cmp edx, ecx
0040581C |.^ 7C EB \jl short 00405809
0040581E |> 8B7424 14 mov esi, dword ptr [esp+14]
00405822 |. 8BC3 mov eax, ebx
00405824 |> 8A10 /mov dl, byte ptr [eax]
00405826 |. 8A1E |mov bl, byte ptr [esi]
00405828 |. 8ACA |mov cl, dl
0040582A |. 3AD3 |cmp dl, bl
0040582C |. 75 20 |jnz short 0040584E
0040582E |. 84C9 |test cl, cl
00405830 |. 74 16 |je short 00405848
00405832 |. 8A50 01 |mov dl, byte ptr [eax+1]
00405835 |. 8A5E 01 |mov bl, byte ptr [esi+1]
00405838 |. 8ACA |mov cl, dl
0040583A |. 3AD3 |cmp dl, bl
0040583C |. 75 10 |jnz short 0040584E
0040583E |. 83C0 02 |add eax, 2
00405841 |. 83C6 02 |add esi, 2
00405844 |. 84C9 |test cl, cl
00405846 |.^ 75 DC \jnz short 00405824
00405848 |> 5F pop edi
00405849 |. 5E pop esi
0040584A |. 33C0 xor eax, eax
0040584C |. 5B pop ebx
0040584D |. C3 retn
0040584E |> 1BC0 sbb eax, eax
00405850 |. 5F pop edi
00405851 |. 5E pop esi
00405852 |. 5B pop ebx
00405853 |. 83D8 FF sbb eax, -1
00405856 \. C3 retn
继续单步。经过分析可以发现前面只是在检验注册码的合法性和大小写转换。接下来是重点。
0040581E |> \8B7424 14 mov esi, dword ptr [esp+14]
00405822 |. 8BC3 mov eax, ebx
00405824 |> 8A10 /mov dl, byte ptr [eax]
00405826 |. 8A1E |mov bl, byte ptr [esi]
00405828 |. 8ACA |mov cl, dl
0040582A |. 3AD3 |cmp dl, bl
0040582C |. 75 20 |jnz short 0040584E
0040582E |. 84C9 |test cl, cl
00405830 |. 74 16 |je short 00405848
00405832 |. 8A50 01 |mov dl, byte ptr [eax+1]
00405835 |. 8A5E 01 |mov bl, byte ptr [esi+1]
00405838 |. 8ACA |mov cl, dl
0040583A |. 3AD3 |cmp dl, bl
0040583C |. 75 10 |jnz short 0040584E
0040583E |. 83C0 02 |add eax, 2
00405841 |. 83C6 02 |add esi, 2
00405844 |. 84C9 |test cl, cl
00405846 |.^ 75 DC \jnz short 00405824
一边单步以 便注意信息窗口和寄存器窗口。这步0040581E |> \8B7424 14 mov esi, dword ptr [esp+14]
将一个ASCII为“7E87237D”的值移入esi之后的循环就是将这个值和我们输入的Code一位一位地 比较,一旦不等就跳走,函数返回code错误。根据这个,我们可以知道我们的注册码就是那个ASCII码 值“7E87237D”。接下来禁用掉刚刚下的断点,F9重新运行,注册,输入Name Xelloss,Code 7E87237D。点OK,显示“This copy is licensed to:Xelloss”注册成功~
查看帮助关于信息: