通用電腦語音系統(V-2000版)註冊碼分析

看雪資料發表於2000-12-02

軟體名稱: 通用電腦語音系統(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',這就是正確的註冊碼。
    演算法的實現參看前面所寫的序號產生器。

相關文章