• 标 题:翻译一篇文章,希望大家喜欢。呵呵…… (4千字)
  • 作 者:夜月
  • 时 间:2001-11-7 18:01:06
  • 链 接:http://bbs.pediy.com

程序名称:Audio Sphere v2.57
作者:    LaptoniC
目标下载地址: http://www.svet-soft.com
软件类型: Sound application 
工具: SoftICE,IDA 

前言:
越来越多的程序在他们的注册码验证流程中使用了密码学算法。不过,虽然他们大部分使用的是著名的强度很高的算法,或者是HASH函数,但是,它们在实现这些算法的时候存在着很多的漏洞和弱点。在这篇文章中,我将告诉你,如何在几分钟之内破解一个强度极高的注册码验证算法。

正文:
我们的目标是AudioSphere.就我所知,这个公司所有的程序都使用同一个算法加密。这个软件的老版本已
经做出了注册机。这个公司的职员们监视着各个破解站点,在了他们一个版本的软件的注册机发布之后,
他们就会升级他们的程序。并且他们的有些软件内部还有CRC校验。例如:George's Notes。由于这些软
件都是用Dephi写的,所以,要跟踪分析程序的代码有一些难度。所以,你需要使用Dede和IDA来帮助你
更好地分析程序。好了,让我们来尝试着注册它。

在注册对话框中,随便输入一些数字。跟踪程序的流程。你会看到把名字和注册码都进行了一些运算,把
结果存放到注册表中。所以,我们最好关闭程序,在它启动的时候对注册表操作下断点,那样,我们可以更快地到达算法的核心。

程序从SOFTWARE\Svetlana Software\AudioSphere中读取rName和rKey两个键值,所以,我们的断点设置
如下:

bpx RegQueryValueExA IF *(ESP->8) == 'rKey' DO "D ESP->14;" 

当你打开程序的时候,你会被中断2次,在第二次中断以后,你可以看到程序对注册表里的值进行了一些
运算,还原得到我们输入的数值。然后,你会看到如下代码:
        mov    edx, offset aAusp2471492081 ; "AUSP2471-4920818318240628-66436089"    call    LStrCmp    
        jz    loc_48C61A    
        lea    ecx, [ebp+var_30]
        mov    eax, [ebp+var_4]    
        mov    edx, [eax+454h]        
        mov    eax, [ebp+var_4]    
        call    sub_485760    
        mov    eax, [ebp+var_30]    
        mov    edx, offset aAusp0765983246 ; "AUSP0765-9832461809369656-14032654"    call    LStrCmp    
        jz    short loc_48C61A
        lea    ecx, [ebp+var_34]
        mov    eax, [ebp+var_4]    
        mov    edx, [eax+454h]        
        mov    eax, [ebp+var_4]    
        call    sub_485760    
        mov    eax, [ebp+var_34]
        mov    edx, offset aAusp5902329790 ; "AUSP5902-3297905884364589-44425670"    call    LStrCmp

程序把我们输入的数值和黑名单中的进行比较。这样,我们就可以知道正确的注册码的格式了。我按照这
个格式输入了一个假的注册码:AUSP0123-123456789012345-12345678,然后继续跟踪。为了减少跟踪的
时间,我们可以在注册码上面设一个bpm断点。中断后,我们可以看到如下代码:
        MOV      EAX,[EBP-10] ; Here our serial is at eax
        CALL      004914D8

我跟进了这个Call,发现在这里,它把我们输入的注册码分成2部分,然后调用44DB38处的子程序对它们
进行处理,我跟进44DB38处的子程序,在这个子程序的第一个Call里头,我看到如下代码:
        push    ebx
        add    esp, 0FFFFFFF0h
        mov    ebx, eax
        mov    [esp+10h+var_10], 67452301h
        mov    [ESP+10h+var_C], 0EFCDAB89h
        mov    [ESP+10h+var_8], 98BADCFEh
        mov    [ESP+10h+var_4], 10325476h
        lea    edx, [ebx+7Ch]
        mov    eax, ESP
        mov    ecx, 4
        call    Move_int

很明显,这些数是MD5和MD4算法初始化中要用到的。我猜这个程序在这里使用的是MD5对我们注册码的一
半进行Hash运算。为了验证我的猜测,在这个Call执行完后,我检查了AUSP0123-12345678的MD5值,结果
和程序运算的结果:d1c40a23337b9c55905e64ddfa460305完全一样.程序把这个结果和它内部的3,5百个
值进行比较,如果有相等的,就认为正确。对我们注册码的第2部分也进行同样操作。

由于作比较的值有300-500个,而且注册码是以AUSP开头的,所以,我们可以用穷举法搜索合适的注册
码。我从AUSP0000-00000000 穷举到 AUSP0000-99999999。在PIII 450上,我用了13-15分钟完成穷举。
如果你想自己写一个穷举程序的话,我建议你使用SSLeay库,因为它作了一些优化,可以加快我们的速
度。

其实,如果你仅仅是想注册这个程序的话,并不需要穷举的。程序就是把你序列号的MD5值和内部的一些
数进行比较,所以,你只要把黑名单中的注册码都分成两部分,进行一下新的组合,就可以得到10多个
可用的序列号了。

后记:今天在Fravia闲逛,看到这篇文章,觉得真的很不错。于是拿着蹩脚的E文翻译了一下,推荐给大
      家,主要是介绍一个新的思路。我觉得,对于一个初学者,从这里至少能学到如下几点东西:

1.)条件断点的设置。断点的设置,很大程度上取决于个人对逆向工程的理解程度,一个好的断点,会
    给你的工作带来很大的便利。Trw虽然也可以设置条件断点,不过总的来说功能没有Sice强大。

2.)如何识别程序使用了何种加密算法。当然,这个问题不是一两篇文章就能说的清楚的。要认出程序
    使用的算法,自己首先要对该算法很熟悉,才能从一些蛛丝马迹中推测出来。就我的经验,要识别
    出算法主要有2个方法:
    a.)反汇编
    b.)看算法初始化
    前者是静态的分析,后者是动态的跟踪。
    我发现有些初学者拿到一个软件,不管三七二十一,拿着Trw就Load,然后一步一步地跟踪。忽略了
    对目标软件的考察,这样是非常不利于提高自己的水平的。至少,用FileInfo考察文件信息,然后
    用W32dasm或者Dede进行反汇编。我觉得这两步是必不可少的。

3.)不要忽视软件的黑名单。有时它会起到意想不到的作用。最重要的就是我们可以用它得到序列号的    格式。这对于破解来说很重要。

最后给出几个可能初学者不太熟悉的名词的解释,算是科普吧?呵呵……
Hash:把输入进行运算,得到定长的输出。最大的特点是不可逆。著名的Hash算法有MD5,SHA1等
SSLeay:一个数学运算库,主要应用在大数运算领域。著名的运算库还有:FreeLip,Miracl等。