本次破解为只对软件的分析爆款,不分析软件的算法(本菜还没有实力)。
软件:OllyDbg

因为软件需要获取输入框的内容,载入od之后,可以直接对GetWindowTextA下断点(也可以直接搜索字符串)

1.jpg
运行程序,输入任意数值,发现程序运行到下图位置断下了。

2.png
3.jpg
在提示失败代码下面的位置,我们发现了。注册成功的提示!

4.jpg
分析代码发现,下面这个跳转如果实现就会提示成功,所以对注册信息验证的函数应该是就是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                                 ;  注册失败

然而当我们修改了跳转,虽然提示注册成功,但软件还是未注册版本

6.jpg
重新载入程序,搜索提示未注册的字符串,找到提示注册成功的代码,显然XoftSpy.004350A0就是关键call,

7.jpg


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。修改程序使它跳转成功,运行程序,发现这个程序已经是注册版本了

8.jpg
一般来说,我们对于有输入的程序都是在GetWindowTextA处下断点,再进行分析。但这个程序不一样。因为这个程序的判断注册码正误有点小复杂(菜),所以就对算法进行分析了。

最后修改:2020 年 10 月 28 日
如果觉得我的文章对你有用,请随意赞赏