DirectMediaXtra.x32 V2.01 注册码的计算 (13千字)
题外话:以前每逢寒暑假,都能有时间找来几个软件练练手,但这个假期不行,参编的一本书的几万字还没动笔,也就没时间破解了。还有,现在我只是对注册的计算过程感兴趣,而对暴破兴趣不大,但这需要更多的时间去分析,无疑增加了难度,而且现在很多软件越来越破了,也没有那么大的精力去做,只好将放假前做的这个破解整理一下发表在这。下载地址: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给我的,可以找他联系
