破解HappyEO電子琴203版的註冊碼。 (7千字)

看雪資料發表於2001-09-28

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

相關文章