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