作品发布     邀请码    设为首页  收藏 

当前位置:文章免杀 → 文章内容 >> 软件注册算法之查表计算


软件注册算法之查表计算

更新时间:2010-12-25 4:56:34   作者:佚名  来源:不详
文/图 TC-XB
我们已经见识过了各种各样的注册算法,今天要为大家介绍的是一种古老而又经典的算法类型:“查表计算”。什么是查表计算呢?简单说明就是,软件作者在编写软件的时候会在内部设定一张数据表,这个数据表有些密码表的味道,除了软件作者,我们根本就不知道这张表是什么样子的,也不知道它的内容是什么;在平时使用软件的过程中也不会用到这个表,在不涉及到与注册有关的操作时,这张表就一直默默无闻地待在程序里。然而,当我们输入注册名等与注册相关的信息时,这张数据表就开始发挥它的作用了。这个时候,程序会根据我们输入的注册信息,按照一定的规律或是顺序从数据表中取出相对应的内容,然后将这些内容在进行一些处理或是直接组合成注册码。由此可见,这张数据表与软件的注册算法的关系是非常密切的,也可以说是算法的核心内容。
其实,查表计算的原理非常简单,我就举例说明一下吧。想象一下我们正在上课,刚开学老师需要叫一些同学来打扫卫生,老师拿着名单说“所有双号的同学扫地,单号的同学拖地”,大家听到了命令便纷纷干起活来。就是这样一个简单的过程,恰恰反映了查表计算这一类项算法的最基本的原理。我们把程序中的那张数据表比作老师手里的名单,老师根据学号的不同来给大家安排不同的任务。同样,在软件中,程序也会根据注册信息的不同,而从数据表中取出不同的内容。
听起来原理还是挺简单的,具体到程序又是通过怎样的一种形式表现出来的呢?下面我们就以一个Crackme为例,详细介绍一下“查表计算”在程序中的实际应用。
对于用OD载入寻找关键代码等过程在这里就省略了,因为Crackme没有加壳,通过字符串查找很快就可以找到对应的关键代码。详细代码如下,我们来一一进行分析。
 
首先,程序对注册名进行检查。在这里,程序要求注册名的长度必须小于8位,这是第一个要求。
 
检验完了注册名,自然就是对注册码的检验。程序要求注册名与注册码的位数必须相同才能过关。检验完这两个主要的信息,下面就开始算法计算了。究竟查表计算是怎样进行的呢?我们分析看看。
 
在计算之前,程序又对注册名进行了更进一步的检验。第一检验是对注册名的长度作了限制,这里则是对注册名的内容进行检验。我们注意到,程序首先取出了注册名每一位的ASCII码,然后将ASCII码分别与41和7A比较,如果小于41或者大于7A都会直接导致失败。所以,注册名每一位的ASCII码必须在41与7A这个范围之间。现在大家可能就有疑问了,这里的41与7A到底是什么呢?其实,在ASCII码表中41对应的字母是A而7A对应的字母则是字母z。所以,这段代码检验注册名的作用就是,要求注册名的每一位都是字母而不能是数字或者其他符号。当注册名满足是字母的条件后,我们看到,如果注册名某一位的ASCII码大于5A这个值,那么就将这个ASCII码减去20,这又是在干什么呢?我们先看看5A对应的是哪个字母,原来5A对应的是字母Z,也就是大写字母中的最后一位。现在我们就明白了,因为Z是大写字母的最后一位,如果ASCII码大于Z的ASCII码的话,那么就可以判断,这个字母应该是小写字母中的某一个了。既然将大写字母的ASCII码减去0x20,那么这个问题就清楚了,就是将注册名中的小写字母转换成大写字母。例如,注册名是tcxb,那么经过这里的处理就变成了TCXB。
将注册名转换完成之后,下面就开始正式的计算了。我们继续看看这个传说中的“查表计算”是怎么计算的呢?经过了一些无关紧要的代码,我们来到了以下代码处。
 
注意这里的第一句代码,它指向了一个地址。我们去这个地址看看,在OD的命令行中输入这个命令:“D esi+402017”就可以在数据窗口中看到以下的内容。
 
00402017  41 31 4C 53 4B 32 44 4A 46 34 48 47 50 33 51 57  A1LSK2DJF4HGP3QW
00402027  4F 35 45 49 52 36 55 54 59 5A 38 4D 58 4E 37 43  O5EIR6UTYZ8MXN7C
00402037  42 56 39   BV9
 
这是一个什么东西呢?经过对代码的跟踪与分析我们发现,这些数据其实是一张数据表:A1LSK2DJF4HGP3QWO5EIR6UTYZ8MXN7CBV9,程序会将注册名中的字母在这里一一找到,并且记下它们各自的位置。为了方便大家理解,我们给数据表中的这些字符按照顺序标上1~35的序号,例如TCXB这四个字母,在这个数据表中对应的位置就分别是24、32、29、33。保存了对应的位置后,程序开始进行下一步计算。
 
这里的代码又指向了一个内存中的地址,我们还是采用命令的方法到内存中去看看里面到底有些什么内容。输入命令“D ESI+40203C”便看到了以下内容。
 
00402033  53 55 37 43 53 4A 4B  SU7CSJK
00402043  46 30 39 4E 43 53 44 4F 39 53 44 46 30 39 53 44  F09NCSDO9SDF09SD
00402053  52 4C 56 4B 37 38 30 39 53 34 4E 46   RLVK7809S4NF
 
由此,我们就又可以整理出来一张数据表了:SU7CSJKF09NCSDO9SDF09SDRLVK7809S4NF。这个表又是干什么用的呢?还是按照1~35为它们分别标上序号吧。
原来,在这里程序按照从第一张表中得到的位置信息,在这里寻找对应位置上的字符。呵呵,这么说大家可能有些听不懂了,还是举例来说吧。联系上一步的计算,注册名TCXB在数据表1中对应的位置分别是:23、31、28、32,那么在这里程序就将在表2中寻找对应位置的字母,即将表2中第23、31、28、32位字符取出来。在SU7CSJKF09NCSDO9SDF09SDRLVK7809S4N中,对应位置的字母分别是RS84,这个字符串就很重要了,我们接着分析后面的代码。
 
看能到了吗?标准的一个真假注册码比较的过程,1234是我们输入的注册码,当然是假码了。但是上面的RS84这个字符串刚好是我们刚才推算出来的。到了这里,相信大家都已经很明白了,真正的注册码就是RS84。
这样的计算方法是不是很有趣呢?总结一下整个计算过程:首先,程序中已经设置好了两张数据表,我们分别设为表1和表2;其次,根据注册名每一位的字符,在数据表1中找到相同的字符,并且记下在数据表中的位置;再次,根据字符在数据表1中的位置,找到数据表2中相同位置上的字符,并记录下;最后,将每一位对应的字符取出来进行合并,就得到了最后的注册码。
由此我们可以看出,查表计算应用在软件的注册算法中具有很明显的优点的。如果不分析程序的算法,是不可能做出注册机的。实例中的小程序并没有对查表计算后的结果再进行处理,如果应用到软件中,加上适当的处理并避免明码在内存中出现,肯定会给我们的分析造成更大的困难。此外,大家很容易看出,如果不深入的对内存中的数据进行观察的话,是很难找到完整的“数据表”的。本例中所使用的数据表是以明文的方式出现在内存中的,大家试想一下,如果将两个数据表分别进行加密处理,使得数据表不会以真实的面目出现在内存中,我们能看到的只是一堆奇形怪状的数据,如果想写出注册机,还真得费好大一番功夫才行呢

责任编辑:华中帝国        



本文引用网址: 

软件注册算法之查表计算的相关文章
发表评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码