长路漫漫
我们可不能就这样匆匆而过

序列号保护方式

简介

        序列号有时也称机器码。当用户从网络上下载某个共享软件后,一般都是有使用时间或功能限制的,当过了共享软件的试用期后,必须注册该软件方能使用。注册后,软件就会取消各种限制,比如时间限制、功能限制等。

        序列号保护方式是一些软件开发商为了防止盗版而采取的一定保护措施。目前在网络上最常见的软件保护方式就是序列号保护。因为其实现方式简单,不需要额外的成本,用户购买也非常方便,所以很多软件的作者采取序列号的保护方式。

序列保护方式的实质

        序列号保护就是验证用户名和序列号的数学映射关系,而这个映射的关系则是由软件的作者自己定义的,显然,这个映射的关系越复杂,注册码就越不容易被破解。根据映射关系的不同,程序有四种基本检测注册码的方法。

(1)利用用户名等信息,通过函数运算得到注册码。

        将这个注册码和用户输入的注册码进行字符串或者数值的比较,以确定用户是否为合法用户。实际上,这是一种非常不安全的验证手段。因为作者不论采用多么复杂的函数运算,解密者只需提取函数最终执行的结果,就可以轻易达到破解的效果。

(2)利用注册码来反向验证用户名的合法性

        此种方法相比第一种要安全一点,因为在软件的验证中,正确的注册码的明文不会出现在内存中。这样就防止了解密者的直接提取。

(3)通过对等函数检验注册码

        采用此种方法,同样可以做到在内存中不直接出现明文的注册码。

(4)采用二元函数来检验

        顾名思义,就是把用户名和序列号同时当作自变量,通过函数运算,将结果和特定的值进行比较,如果相同,则通过程序的检验。

序列号保护的逆向

        要破解基于序列号保护的软件,我们可以采用以下两种方法

一、追踪正确的注册码。
二、修改程序的流程。
追踪正确的注册码

        这种破解序列号保护的方式自然是最理想的方式。因为软件本身就存在一个用户名和序列号的映射关系,如若正常通过了这两者之间的关系,那么我们可以说,我们使用的软件为“正版”软件。

        以“4U AVI MPEG Converter Ver 6.0.2”这款软件为例。首先用PEiD载入要分析的程序,可以看到程序是采用Borland Delphi 6.0 - 7.0编写。

ser

        确认程序无壳后,用OD载入,OD会自动分析并中断在如下入口处:

004BC928 > $  55                push ebp
004BC929   .  8BEC              mov ebp,esp
004BC92B   .  83C4 F0           add esp,-0x10
004BC92E   .  B8 68C64B00       mov eax,AVIMPEGC.004BC668       
004BC933   .  E8 D8A2F4FF       call AVIMPEGC.00406C10
004BC938   .  A1 8CEF4B00       mov eax,dword ptr ds:[0x4BEF8C]
004BC93D   .  8B00              mov eax,dword ptr ds:[eax]
004BC93F   .  E8 4C8EFAFF       call AVIMPEGC.00465790
004BC944   .  E8 DB95FEFF       call AVIMPEGC.004A5F24
004BC949   .  84C0              test al,al
004BC94B   .  75 05             jnz short AVIMPEGC.004BC952
004BC94D   .  E8 D27BF4FF       call AVIMPEGC.00404524
004BC952   >  A1 8CEF4B00       mov eax,dword ptr ds:[0x4BEF8C]

        按F9让程序跑起来,可以看到,程序告诉我们这是一个20天的试用版本。

ser2

        我们单击程序上的“Register”,输入我们的用户名和注册码,当然这里我们输入的注册码肯定是个错误的注册码 (如果你一不小心注册成功了,那我劝你赶紧去买彩票),俗称假码。

        再单击“Regiter”后,程序会弹出错误提示。

ser3

        在这里我们记录下提示的信息“Invalid Registration Code!”然后返回到OD窗口,使用插件“超级字符串参考”选择“查找ASCⅡ

ser4

        在OD搜索完成之后会自动打开如图所示的“超级字符串参考”窗口

ser5

       在“超级字符串参考”窗口中执行右键菜单的“Find”功能,打开如图所示的查找窗口

ser6

        输入刚刚我们记录下的信息“Invalid Registration Code!”单击确定进行查找,查找完成之后,OD会自动定位到相应的字符串处

ser7

        双击第二行字符串就来到了相应的代码处,按F2下好断点(前面地址变红色说明下断点成功),回到程序界面再次输入用户名和假码,单击“Register”,这时程序断了下来,我们回到OD窗口。这时我们可以思考一下了,程序已经运行到了要弹出我们注册错误的窗口,那么这说明了程序已经完成了用户名和注册码的验证,也就是说,如果程序是采用的第一种方式来验证序列号的话,那么真正的注册码现在极有可能还在内存中。我们转到OD的堆栈窗口,可以看到一些信息

ser8

        最后一行是我们的用户名,上一行是我们输入的假码,那么第三行是什么呢?没错,就是真正的注册码。我们复制出来,在程序中进行注册,程序弹出了注册成功的提示。程序Help菜单中也没有了注册的选项,现在可以说程序已经被完美破解了。

        到这里程序的追码过程就算完成了,在这次调试的过程中需要注意,虽然通过调试可以得到正确的注册码,但是在再次注册的过程中使用的用户名必须是第一次注册时使用的注册名,如果此时使用调试得到的注册码而使用不同的用户名进行注册,程序是无法注册成功的。

文章由来:2011年受一位朋友所托,帮他写书内的一章,可是最后不了了之。我不愿让这篇文章在磁盘里吃灰,今天放于博客内,希望能给有兴趣的朋友以入门,最后,Have Fun! 
赞(0) 打赏
未经允许不得转载:Young » 序列号保护方式
分享到: 更多 (0)

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏