• 标 题:通用电脑语音系统(V-2000版)注册码分析
  • 作 者:chn-boy
  • 时 间:2000-12-2 23:10:26
  • 链 接:http://bbs.pediy.com

软件名称: 通用电脑语音系统(V-2000版)
下载地址: http://www.newhua.com.cn
此文目的: 如何获得该软件的注册码
调试工具: SoftICE4.05、W32dsm89.exe
调试平台: Win2K

作者:    chn-boy
写作日期: 2000-12-02

    运行程序,进入软件注册对话框,输入Virtual Code,我输入的是:
        软件编号:  573445893. <-- 此编号为程序固有,不能改动。
        输入注册码:32194866
CTRL+D启用SoftICE4.05,下中断bpx MessageBoxExA,当出错对话框弹出时,
程序会被拦断,bc *去掉MessageBoxExA中断,按F12回到程序领空,接下来就
是我们艰苦的破解历程。
    往上察看程序代码,看看有没有可疑的跳转?如果有,那么在该处下中断
后重新再来一次注册。这是一般常识了。。:)(啊,谁又拿臭鸡蛋扔我?)。
我仔细看了一下,好像没有什么可疑的跳转处,那么我们就按F12回到上一级
Call(为什么?因为在这个Call里出现的错误对话框嘛),再往上看看有没有
可疑之处?就这样一路按F12,忽然发现指标不再进入程序领空,一通狂按F12
后,程序就退回到Windows了,是不是出错了?嘿嘿,不要急嘛,其实程序并没
有完全退出来,SoftICE仍然纪录着信息,只不过在一个Call中循回运行罢了,
再次点击注册,在密码框中输入32194866,然后点击注册,看看,哈,SoftICE
出来了(so beautiful)。F12进入程序领空,在进入领空处下个中断,以后会
用到,得到的程序代码段为:

:00405511 C745FC00000000          mov [ebp-04], 00000000
:00405518 8D4D8C                  lea ecx, dword ptr [ebp-74]
:0040551B E840F30000              Call 00414860
:00405520 8D45EC                  lea eax, dword ptr [ebp-14] <-- 进入领空处   

           
:00405523 50                      push eax  <-- 断点下在该处,此时要是
                                            <-- d *eax,你可以看到你输
                                            <-- 入的Virtual Code

:00405524 8D4DF0                  lea ecx, dword ptr [ebp-10]
:00405527 E80EF50000              Call 00414A3A
:0040552C C645FC01                mov [ebp-04], 01
:00405530 8D8D28FEFFFF            lea ecx, dword ptr [ebp+FFFFFE28]
:00405536 51                      push ecx
:00405537 8B8D14FEFFFF            mov ecx, dword ptr [ebp+FFFFFE14]

:0040553D E807FEFFFF              call 00405349  <-- 这个Call里面就是
                                                <-- 注册码的算法,我
                                                <-- 将在下面给出分析

:00405542 898510FEFFFF            mov dword ptr [ebp+FFFFFE10], eax
:00405548 8B9510FEFFFF            mov edx, dword ptr [ebp+FFFFFE10]
:0040554E 89950CFEFFFF            mov dword ptr [ebp+FFFFFE0C], edx
:00405554 C645FC02                mov [ebp-04], 02
:00405558 8B850CFEFFFF            mov eax, dword ptr [ebp+FFFFFE0C]
:0040555E 50                      push eax
:0040555F 8D4DF0                  lea ecx, dword ptr [ebp-10]
:00405562 51                      push ecx

:00405563 E8380E0000              call 004063A0  <-- 当程序运行到此处时,
                                                <-- d *ecx,你可以看到
                                                <-- 你输入的Virtual Code
                                                <-- d *eax,你就能看到
                                                <-- 正确的密码了。:)

:00405568 25FF000000              and eax, 000000FF
:0040556D 85C0                    test eax, eax
:0040556F 755C                    jne 004055CD
:00405571 8D9520FEFFFF            lea edx, dword ptr [ebp+FFFFFE20]
:00405577 52                      push edx


【算法分析】
    整个算法是这样:先将你的软件编号(比如我的是573445893.)中每个字符值
*1000,和累加,再加上100000(0x186A0)。得到的值取补——C语言的实现就是
name_number = ~name_number + 1; 取补后的值减去0x00D9C8FD,得到的name_number
是个负数,我的是:-14898765(0xFF1CA9B3),并将其转换成字符串'-14898765'。
然后将第0个字符和第3个字符交换,第2个字符和第5个字符交换,得到一个新的字符
串'818-94765',这就是正确的注册码。
    算法的实现参看前面所写的注册机。