HappyEO電子琴的新版本2.40中,註冊碼可以直接從記憶體中找到,而在HappyEO203這個老版本中,卻要透過計算才能得出,不知道作者是怎麼想的,演算法比較簡單,很適合初學者學習,有興趣的朋友可以拿它來練手,我們開始吧:
1. 執行TRW2K
2. 使用者名稱輸入:wdfdiablo 註冊碼:7878787878
3. 下斷bpx hmemcpy,後回到主程式,點註冊,被攔下,用bd *清除斷點,下pmodule回到HappyEO的領空,按F10數次,來到:
:51084189 E8F2FCF7FF call
51003E80
:5108418E 8D85C0FEFFFF
lea eax, dword ptr [ebp+FFFFFEC0]
:51084194 50
push eax
:51084195
8D95B8FDFFFF lea edx, dword ptr [ebp+FFFFFDB8]
:5108419B A1D4630D51 mov
eax, dword ptr [510D63D4]
:510841A0 8B00
mov eax, dword ptr [eax]
:510841A2 8B80D0020000
mov eax, dword ptr [eax+000002D0]
:510841A8
E89BCDFAFF call 51030F48
:510841AD 8B95B8FDFFFF mov edx, dword
ptr [ebp+FFFFFDB8]
:510841B3 8D85BCFDFFFF
lea eax, dword ptr [ebp+FFFFFDBC]
:510841B9 B9FF000000
mov ecx, 000000FF
:510841BE E8BDFCF7FF
call 51003E80
:510841C3 8D85BCFDFFFF
lea eax, dword ptr [ebp+FFFFFDBC] ;D
EAX,看見wdfdiablo
:510841C9 5A
pop edx
;D EDX,看見7878787878
:510841CA E881EEFFFF
call 51083050
;算註冊碼的CALL,F8進入
:510841CF 84C0
test al, al
:510841D1 0F849C000000 je 51084273
;若al為0,則註冊失敗
:510841D7 A188600D51 mov
eax, dword ptr [510D6088]
:510841DC C60001
mov byte ptr [eax], 01
:510841DF 8D95B4FDFFFF
lea edx, dword ptr [ebp+FFFFFDB4]
:510841E5
A1D4630D51 mov eax, dword ptr
[510D63D4]
:510841EA 8B00
mov eax, dword ptr [eax]
進入算註冊碼的CALL:
* Referenced
by a CALL at Address:
|:510841CA
|
:51083050 53
push ebx
:51083051
56
push esi
:51083052 57
push edi
;儲存現場
:51083053 83C4CC
add esp, FFFFFFCC
:51083056 8BF2
mov esi, edx
;EDX=.7878787878,其中的“.”是0xA,即註冊碼的位數為10位
:51083058 8D3C24
lea edi, dword ptr [esp]
:5108305B 33C9
xor ecx, ecx ;計數器清0
:5108305D
8A0E mov
cl, byte ptr [esi] ;將註冊碼位數放入cl
:5108305F 80F908
cmp cl, 08
;位數是否大於8
:51083062 7202
jb 51083066
;不大於則開始下一步
:51083064 B108
mov cl, 08
;若大於8,則只取前8位
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:51083062(C)
|
:51083066 880F
mov byte ptr [edi], cl
;將位數放在EDI所指位址中
:51083068 46
inc esi
;指向註冊碼第一位
:51083069 47
inc edi
;指向存放註冊碼最後一位的下一位址
:5108306A F3A4
repz movsb
;將ESI位址內的內容挎貝到EDI所指位址上,每次取1個Byte,共迴圈8次(cl=8),即78787878
:5108306C
8BF0 mov
esi, eax ;D ESI=.wdfdiablo,其中的“.”是0x9,即使用者名稱的位數為9位
:5108306E 8D7C240A
lea edi, dword ptr [esp+0A] ;
:51083072 33C9
xor ecx, ecx
;計數器清0
:51083074 8A0E
mov cl, byte ptr [esi]
:51083076 80F928
cmp cl, 28
:51083079
7202 jb 5108307D
:5108307B B128
mov cl, 28 ;若使用者名稱位數大於40位,則只取40位
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:51083079(C)
|
:5108307D 880F
mov byte ptr [edi], cl
:5108307F 46
inc esi
:51083080 47
inc edi
:51083081 F3A4
repz movsb
;同上,挎貝使用者名稱
:51083083 C644240900
mov [esp+09], 00
:51083088 8A44240A
mov al, byte ptr [esp+0A]
;將使用者名稱位數放入al
:5108308C 3C04
cmp al, 04
;使用者名稱位數是否為4
:5108308E 723D
jb 510830CD ;小於則註冊失敗
:51083090 803C2408
cmp byte ptr [esp], 08 ;註冊碼位數是否為8
:51083094 7537
jne 510830CD
;小於則註冊失敗
:51083096 33C9
xor ecx, ecx
;計數器清0
:51083098 25FF000000
and eax, 000000FF ;將EAX高16位清0,即EAX=9(使用者名稱位數)
:5108309D 85C0
test eax, eax
:5108309F 7E0C
jle 510830AD
;EAX若為0,則註冊失敗
:510830A1 8D54240B
lea edx, dword ptr [esp+0B] ;EDX指向使用者名稱第一個字母
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510830AB(C)
|
:510830A5 8A1A
mov bl, byte ptr [edx]
;取使用者名稱第一個字母“w”
:510830A7 02CB
add cl, bl
;將“w”的ASCII值加入cl
:510830A9 42
inc edx
;指向使用者名稱下一個字母“d”
:510830AA 48
dec eax
;使用者名稱位數減1
:510830AB
75F8 jne
510830A5 ;共迴圈9次,將所有使用者名稱字母的ASCII和相加放
入cl,注意,因cl是8個位,故總和只取低8位,即1個位元組,
這裡得出cl=0xAC
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:5108309F(C)
|
:510830AD 33D2
xor edx, edx
;EDX初始化為0
:510830AF 33C0
xor eax, eax
;EAX初始化為0
:510830B1 8A0424
mov al, byte ptr [esp]
;註冊碼位數放al,al=8
:510830B4 85C0
test eax, eax
;以下和算使用者名稱的方法相同,不再贅述
:510830B6 7E0C
jle 510830C4
:510830B8 8D742401
lea esi, dword ptr [esp+01]
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:510830C2(C)
|
:510830BC 8A1E
mov bl, byte ptr [esi]
:510830BE 02D3
add dl, bl
:510830C0 46
inc esi
:510830C1
48
dec eax
:510830C2 75F8
jne 510830BC
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510830B6(C)
|
:510830C4 3AD1
cmp dl, cl
;使用者名稱每個字母ACSII值的和與假註冊碼每個ASCII的和的低8位作比較
:510830C6 7505
jne 510830CD
;若不正確則註冊失敗
:510830C8 C644240901
mov [esp+09], 01
;註冊成功的標誌
* Referenced by a (U)nconditional or (C)onditional
Jump at Addresses:
|:5108308E(C), :51083094(C), :510830C6(C)
|
:510830CD 8A442409 mov
al, byte ptr [esp+09] ;返回的al值為1
:510830D1 83C434
add esp, 00000034
:510830D4
5F
pop edi
:510830D5 5E
pop esi
:510830D6 5B
pop ebx
;恢復算註冊碼前的現場,返回主程式
:510830D7 C3
ret
可以看出,註冊碼有很多,只要滿足最後的比較條件即可,這裡我算出一個:
使用者名稱:wdfdiablo 註冊碼:55555559
大波羅破解
我的主頁http://wdfdiablo.myetang.com
轉載請保持完整,謝謝。
2001.9.20