• 标 题: 标 题:DirectMediaXtra.x32 V2.01 注册码的计算 (13千字)
  • 作 者: robot
  • 时 间: 2001-8-3 23:37:29
  • 链 接:http://bbs.pediy.com

题外话:以前每逢寒暑假,都能有时间找来几个软件练练手,但这个假期不行,参编的一本书的几万字还没动笔,也就没时间破解了。还有,现在我只是对注册的计算过程感兴趣,而对暴破兴趣不大,但这需要更多的时间去分析,无疑增加了难度,而且现在很多软件越来越破了,也没有那么大的精力去做,只好将放假前做的这个破解整理一下发表在这。
下载地址:http://media2.533.net/source/DirectMediaXtra201_FullDownload.exe
软件简介:一个Authorware多媒体XTRA插件,安装后可以很方便地插入MIDI、视频、FLASH等多媒体文件,并能很方便地对它们进行控制。
破解工具:IDA Pro 4.15,SoftICE 4.05 for Win9X
破解过程:首先,将DirectMediaXtra安装到Authorware的xtras文件夹下,这是安装程序会在xtras下面DirectMediaXtra.x32,这个就是外部多媒体插件。安装好后,运行Authorware 5.2,选择Insert->Tabuleiro Xtras->DirectMediaXtra,出现DirectMediaXtra Properties后,会显示Unregisted,单击register后,随便输入用户名和序列号,激活SoftICE,下bpx hmemcpy(当然,还有更好的断点可下,好像是getwindowtexta,时间长了,记不清了),按F12、F10直到来到下面

.text:100086A0 arg_0          = dword ptr  4              ====> 注册码
.text:100086A0 arg_4          = dword ptr  8              ====> 用户名

.text:100086A0
.text:100086A0                sub    esp, 18h
.text:100086A3                mov    eax, dword_1003AA90
.text:100086A8                push    ebx
.text:100086A9                push    ebp
.text:100086AA                mov    ebp, [esp+20h+arg_0]
.text:100086AE                push    esi
.text:100086AF                push    edi
.text:100086B0                mov    [esp+28h+var_C], eax
.text:100086B4                mov    edi, ebp
.text:100086B6                or      ecx, 0FFFFFFFFh
.text:100086B9                xor    eax, eax
.text:100086BB                repne scasb
.text:100086BD                not    ecx
.text:100086BF                dec    ecx
.text:100086C0                cmp    ecx, 14h                  ====> 注册码是否20位
.text:100086C3                jnz    loc_100088D6              ====> 不是则错
.text:100086C9                mov    cl, [ebp+3]              ====> 第4位注册码
.text:100086CC                mov    dl, [ebp+4]              ====> 第5位注册码
.text:100086CF                mov    [esp+28h+var_16], al
.text:100086D3                lea    eax, [esp+28h+var_18]
.text:100086D7                push    eax
.text:100086D8                mov    [esp+2Ch+var_18], cl
.text:100086DC                mov    [esp+2Ch+var_17], dl
.text:100086E0                call    _atoi                    ====> 将第4、5位注册码转为数字
.text:100086E5                add    esp, 4
.text:100086E8                cmp    eax, 14h                  ====> 是否是"20"
.text:100086EB                jnz    loc_100088D6              ====> 不是则错
.text:100086F1                mov    al, [ebp+2]            \
.text:100086F4                mov    cl, [ebp+0]            > ====> 取注册码的前3位
.text:100086F7                mov    dl, [ebp+1]            /
.text:100086FA                mov    byte ptr [esp+28h+arg_0+2], al
.text:100086FE                mov    byte ptr [esp+28h+arg_0], cl
.text:10008702                mov    byte ptr [esp+28h+arg_0+1], dl
.text:10008706                mov    byte ptr [esp+28h+arg_0+3], 0
.text:1000870B                lea    esi, [esp+28h+var_C]      ====> esi指向"DMX"
.text:1000870F                lea    eax, [esp+28h+arg_0]      ====> 指向注册码的前3位
.text:10008713                mov    dl, [eax]              \
.text:10008715                mov    bl, [esi]              |
.text:10008717                mov    cl, dl                  |
.text:10008719                cmp    dl, bl                  |
.text:1000871B                jnz    short loc_1000873B      |
.text:1000871D                test    cl, cl                  |
.text:1000871F                jz      short loc_10008737      |
.text:10008721                mov    dl, [eax+1]            |
.text:10008724                mov    bl, [esi+1]            |
.text:10008727                mov    cl, dl                  \
.text:10008729                cmp    dl, bl                  /====> 比较注册码的前3位是否是"DMX"
.text:1000872B                jnz    short loc_1000873B      |
.text:1000872D                add    eax, 2                  |
.text:10008730                add    esi, 2                  |
.text:10008733                test    cl, cl                  |
.text:10008735                jnz    short loc_10008713      |
.text:10008737                xor    eax, eax                |
.text:10008739                jmp    short loc_10008740      |
.text:1000873B                sbb    eax, eax                |
.text:1000873D                sbb    eax, 0FFFFFFFFh        |
.text:10008740                test    eax, eax                |
.text:10008742                jnz    loc_100088D6            /
.text:10008748                mov    al, [ebp+7]              ====> Regcode(8)
.text:1000874B                lea    ecx, [esp+28h+arg_0]
.text:1000874F                push    ecx
.text:10008750                mov    byte ptr [esp+2Ch+arg_0], al
.text:10008754                call    _atoi                    ====> 转为数字
.text:10008759                mov    dl, [ebp+0Bh]            ====> Regcode(12)
.text:1000875C                mov    edi, eax                  ====> edi=Regcode(8)
.text:1000875E                lea    eax, [esp+2Ch+arg_0]
.text:10008762                mov    byte ptr [esp+2Ch+arg_0], dl
.text:10008766                push    eax
.text:10008767                call    _atoi                    ====> 转为数字
.text:1000876C                mov    cl, [ebp+11h]            ====> Regcode(18)
.text:1000876F                lea    edx, [esp+30h+arg_0]
.text:10008773                push    edx
.text:10008774                mov    ebx, eax                  ====> ebx=Regcode(12)
.text:10008776                mov    byte ptr [esp+34h+arg_0], cl
.text:1000877A                call    _atoi
.text:1000877F                mov    [esp+34h+var_8], eax      ====> Regcode(18)放到这里
.text:10008783                mov    al, [ebp+0Ch]            ====> Regcode(13)
.text:10008786                lea    ecx, [esp+34h+arg_0]
.text:1000878A                mov    byte ptr [esp+34h+arg_0], al
.text:1000878E                push    ecx
.text:1000878F                call    _atoi
.text:10008794                mov    dl, [ebp+10h]            ====> Regcode(17)
.text:10008797                mov    esi, eax                  ====> esi=Regcode(13)
.text:10008799                lea    eax, [esp+38h+arg_0]
.text:1000879D                mov    byte ptr [esp+38h+arg_0], dl
.text:100087A1                push    eax
.text:100087A2                call    _atoi
.text:100087A7                mov    cl, [ebp+8]              ====> Regcode(9)
.text:100087AA                lea    edx, [esp+3Ch+arg_0]
.text:100087AE                push    edx
.text:100087AF                mov    [esp+40h+var_4], eax      ====> Regcode(17)放到这里
.text:100087B3                mov    byte ptr [esp+40h+arg_0], cl
.text:100087B7                call    _atoi
.text:100087BC                mov    ecx, [esp+40h+var_8]      ====> Regcode(18)
.text:100087C0                mov    edx, [esp+40h+var_4]      ====> Regcode(17)
.text:100087C4                add    eax, ecx                  ====> Regcode(9)+Regcode(18)
.text:100087C6                lea    ecx, [esi+esi*2]          ====> Regcode(13)*3
.text:100087C9                mov    [esp+40h+var_11], 0
.text:100087CE                mov    [esp+40h+var_D], 0
.text:100087D3                lea    eax, [eax+edx*4]          ====> Regcode(17)*4+Regcode(9)+Regcode(18)
.text:100087D6                add    ecx, eax                  ====> Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)
.text:100087D8                movsx  eax, byte ptr [esp+40h+var_C+2]    ====> eax="X"
.text:100087DD                add    ecx, ebx                  ====> Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)
.text:100087DF                lea    esi, [ecx+edi+0Eh]        ====> Regcode(8)+Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)+0Eh
.text:100087E3                mov    ecx, [esp+40h+var_C]      ====> ecx="DM"
.text:100087E7                movsx  edx, ch                  ====> edx="M"
.text:100087EA                movsx  ecx, cl                  ====> ecx="D"
.text:100087ED                add    eax, edx
.text:100087EF                add    eax, ecx                  ====> eax="D"+"M"+"X"=E9h
.text:100087F1                mov    ecx, 3E8h                ====> ecx=3E8h=1000
.text:100087F6                lea    eax, [eax+eax*4]          ====> eax*5=48Dh
.text:100087F9                shl    eax, 2                    ====> eax*4=1234h
.text:100087FC                cdq
.text:100087FD                idiv    esi                      ====> 整除
.text:100087FF                add    eax, 73h                  ====> 商+73h
.text:10008802                cdq
.text:10008803                idiv    ecx                      ====> 除以1000,取余数
.text:10008805                mov    al, [ebp+0Dh]            ====> Regcode(14)
.text:10008808                mov    cl, [ebp+12h]            ====> Regcode(19)
.text:1000880B                mov    [esp+40h+var_13], al
.text:1000880F                mov    al, [ebp+9]              ====> Regcode(10)
.text:10008812                mov    [esp+40h+var_12], cl
.text:10008816                mov    cl, [ebp+0Eh]            ====> Regcode(15)
.text:10008819                mov    [esp+40h+var_F], al
.text:1000881D                mov    [esp+40h+var_E], cl
.text:10008821                mov    esi, edx                  ====> esi=余数
.text:10008823                mov    dl, [ebp+6]              ====> Regcode(7)
.text:10008826                mov    [esp+40h+var_14], dl
.text:1000882A                mov    dl, [ebp+13h]            ====> Regcode(20)
.text:1000882D                mov    [esp+40h+var_10], dl
.text:10008831                lea    edx, [esp+40h+var_14]    ====> 位置顺序:R(7)R(14)R(19)
.text:10008835                push    edx
.text:10008836                call    _atoi                    ====> 转为整数
.text:1000883B                mov    edi, eax                  ====> 放到edi中
.text:1000883D                lea    eax, [esp+44h+var_10]    ====> 位置顺序:R(20)R(10)R(15)
.text:10008841                push    eax
.text:10008842                call    _atoi                    ====> 转为整数
.text:10008847                add    esp, 20h
.text:1000884A                mov    ecx, eax                  ====> 放到ecx中
.text:1000884C                cmp    edi, esi                  ====> 与余数比较
.text:1000884E                jnz    loc_100088D6              ====> 不等则错误
.text:10008854                mov    eax, 55555556h
.text:10008859                imul    esi                      ====> 乘以余数
.text:1000885B                mov    eax, edx                  ====> 取高位数放到eax中
.text:1000885D                mov    esi, 3E8h
.text:10008862                shr    eax, 1Fh                  ====> 右移1F位,即除以2^31
.text:10008865                lea    eax, [edx+eax+159h]      ====> +345(159h)
.text:1000886C                cdq
.text:1000886D                idiv    esi                      ====> 除以1000
.text:1000886F                cmp    ecx, edx                  ====> 进行比较
.text:10008871                jnz    short loc_100088D6        ====> 不等则错误
.text:10008873                mov    edx, [esp+28h+arg_4]      ====> 用户名
.text:10008877                or      ecx, 0FFFFFFFFh
.text:1000887A                mov    edi, edx
.text:1000887C                xor    eax, eax
.text:1000887E                repne scasb
.text:10008880                not    ecx
.text:10008882                dec    ecx
.text:10008883                test    ecx, ecx                  ====> 用户名是否为空
.text:10008885                jle    short loc_100088D6        ====> 为空则错误
:
:
:
.text:100088C2                mov    eax, 1                    ====> 成功的旗标eax=1
.text:100088C7                and    ecx, 3
.text:100088CA                repe movsb
.text:100088CC                pop    edi
.text:100088CD                pop    esi
.text:100088CE                pop    ebp
.text:100088CF                pop    ebx
.text:100088D0                add    esp, 18h
.text:100088D3                retn    8
.text:100088D6                pop    edi
.text:100088D7                pop    esi
.text:100088D8                pop    ebp
.text:100088D9                xor    eax, eax                  ====> 失败的旗标eax=0
.text:100088DB                pop    ebx
.text:100088DC                add    esp, 18h
.text:100088DF                retn    8
.text:100088DF sub_100086A0    endp

注册码的计算过程:前5个字符必须为"DMX20"
设X=Regcode(8)+Regcode(13)*3+Regcode(17)*4+Regcode(9)+Regcode(18)+Regcode(12)+14
  Y=(hex("D")+hex("M")+hex("X"))*20
  Z=((Y \ X)+115) mod 1000
  Z=Regcode(7,14,19)
  (Z*55555556h的高位+345) mod 1000=Regcode(20,10,15)

根据上面的计算过程,随机生成第8、9、12、13、17、18和6、11、16位的注册码后,再推算出第7、10、14、15、19、20位的注册码即可,注册机已做成。
注册成功后,会在DirectMediaXtra.x32所在的文件夹下生成一个名为dmx2.lic的隐藏注册文件,里面就是注册名和注册码,可以用文本编辑器打开,以后只要把这个注册文件复制到相应文件夹即可。
附记:该公司的另一个插件,WebXtra 3.0的注册过程跟DirectMediaXtra.x32完全一样,只是稍有不同,有兴趣的可以试一试,至于下载url,我没有,是CrackerABC email给我的,可以找他联系