標 題:DirectMediaXtra.x32 V2.01 註冊碼的計算 (13千字)

看雪資料發表於2015-11-15

題外話:以前每逢寒暑假,都能有時間找來幾個軟體練練手,但這個假期不行,參編的一本書的幾萬字還沒動筆,也就沒時間破解了。還有,現在我只是對註冊的計算過程感興趣,而對暴破興趣不大,但這需要更多的時間去分析,無疑增加了難度,而且現在很多軟體越來越破了,也沒有那麼大的精力去做,只好將放假前做的這個破解整理一下發表在這。
下載地址: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給我的,可以找他聯絡

相關文章