本次破解为只对软件的分析爆款,不分析软件的算法(本菜还没有实力)。
软件:OllyDbg
软件:OllyDbg
因为软件需要获取输入框的内容,载入od之后,可以直接对GetWindowTextA下断点(也可以直接搜索字符串)
运行程序,输入任意数值,发现程序运行到下图位置断下了。
在提示失败代码下面的位置,我们发现了。注册成功的提示!
分析代码发现,下面这个跳转如果实现就会提示成功,所以对注册信息验证的函数应该是就是XoftSpy.00417690
00417495 . E8 F6010000 call XoftSpy.00417690
0041749A 84C0 test al,al
0041749C . 75 45 jnz short XoftSpy.004174E3
查看这个函数我们发现,跳转成功之前会给al赋值为0x1,跳转失败之前则会使al为0;其实说到这里破解的思路也有了,但这个程序有点狡猾。
//注册成功
0041789B |. B0 01 mov al,0x1
0041789D |. 5B pop ebx ; XoftSpy.004868C4
0041789E |. 8B4C24 1C mov ecx,dword ptr ss:[esp+0x1C]
004178A2 |. 64:890D 00000>mov dword ptr fs:[0],ecx
004178A9 |. 83C4 28 add esp,0x28
004178AC |. C2 0800 retn 0x8 ; 注册成功
//注册失败
00417918 |. 5F pop edi ; XoftSpy.004868C4
00417919 |. 5E pop esi ; XoftSpy.004868C4
0041791A |. 32C0 xor al,al
0041791C |. 5B pop ebx ; XoftSpy.004868C4
0041791D |. 64:890D 00000>mov dword ptr fs:[0],ecx
00417924 |. 83C4 28 add esp,0x28
00417927 \. C2 0800 retn 0x8 ; 注册失败
然而当我们修改了跳转,虽然提示注册成功,但软件还是未注册版本
重新载入程序,搜索提示未注册的字符串,找到提示注册成功的代码,显然XoftSpy.004350A0就是关键call,
00401492 . E8 093C0300 call XoftSpy.004350A0
00401497 . 84C0 test al,al
00401499 . 74 12 je short XoftSpy.004014AD
0040149B . 68 C4514800 push XoftSpy.004851C4 ; This license of XoftSpy has been registered
我们跟进分析一下这个call,看它是如何修改al值的
00435255 |> \B3 01 mov bl,0x1
00435257 |> 8D4C24 10 lea ecx,dword ptr ss:[esp+0x10]
0043525B |. C64424 2C 04 mov byte ptr ss:[esp+0x2C],0x4
00435260 |. E8 3B8F0200 call XoftSpy.0045E1A0
00435265 |. 8D4C24 14 lea ecx,dword ptr ss:[esp+0x14]
00435269 |. C64424 2C 01 mov byte ptr ss:[esp+0x2C],0x1
0043526E |. E8 2D8F0200 call XoftSpy.0045E1A0
00435273 |. 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
00435277 |. C64424 2C 00 mov byte ptr ss:[esp+0x2C],0x0
0043527C |. E8 1F8F0200 call XoftSpy.0045E1A0
00435281 |. 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
00435285 |. C74424 2C FFF>mov dword ptr ss:[esp+0x2C],-0x1
0043528D |. E8 0E8F0200 call XoftSpy.0045E1A0
00435292 |. 8B4C24 24 mov ecx,dword ptr ss:[esp+0x24] ; XoftSpy.0048FB90
00435296 8AC3 mov al,bl
00435298 |. 5E pop esi ; user32.77D191BE
00435299 |. 64:890D 00000>mov dword ptr fs:[0],ecx
004352A0 |. 5B pop ebx ; user32.77D191BE
004352A1 |. 83C4 28 add esp,0x28
004352A4 \. C3 retn
上述代码我只截取了跳转成功的修改,程序通过修改bl的值,从而修改al,如果注册成功则bl为1,然后把bl赋值给al,注册失败则把bl赋值为0,再把bl赋值给al。修改程序使它跳转成功,运行程序,发现这个程序已经是注册版本了
一般来说,我们对于有输入的程序都是在GetWindowTextA处下断点,再进行分析。但这个程序不一样。因为这个程序的判断注册码正误有点小复杂(菜),所以就对算法进行分析了。