HappyEO電子琴3.05標準版註冊演算法分析(重啟驗證,簡單,給初學者)

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

標 題:HappyEO電子琴3.05標準版註冊演算法分析(重啟驗證,簡單,給初學者) 

發信人:yqmjch 

時 間:2003/06/28 10:52pm 

詳細資訊:



HappyEO電子琴3.05標準版破解手記---演算法分析
作者:yqmjch

檔案大小:1901kb
軟體授權:共享軟體
下載頁面:http://www.happyeo.com/Download.htm
軟體簡介:是否早已對樂器店裡的電子琴心儀已久卻又囊中羞澀?是否早就想學習音樂卻無老師指導?是否想給孩子進行音樂教育卻力不從心?是否早就想學習電腦音樂?試試《HappyEO電子琴》!它將把你的電腦變成一架高階電子琴!初學者可以用它來學習樂理和識譜,高手則可用它在電腦鍵盤上彈奏出美妙的樂曲。還可用它來在電腦上練習架子鼓。128種音色。支援鍵盤分離、多種效果、自動伴奏、錄音、放音、多音軌錄音,支援MIDI檔案的播放、輸入和輸出,支援音色和效果的編輯,支援外接MIDI鍵盤或帶MIDI介面的電子琴!讓你充分領略電腦音樂的美妙!

   執行軟體,在軟體介面上點滑鼠右鍵選註冊,依次填入註冊資訊(姓名不少於4以上、地址12位以上、註冊碼8位,不然會出錯),
   註冊名:yqmjch
   地  址:abcdefg@163.com
   註冊碼:qwertyui
   點確定後,發現是重啟後比較註冊碼的。再次啟動軟體,用RegSnap監視註冊,發現註冊資訊存放在登錄檔HKEY_USERS\.DEFAULT\Software\Happye03SC下。關閉軟體,用PEiD查,有ASPack 2.12殼,用AspackDie可輕鬆脫掉。w32Dasm反彙編,在字串參考中查詢\Software\HappyEO3SC,共三處,經分析,可知510C227D處為啟動時驗證註冊碼處。用ICE裝入軟體,下bpx regqueryvalueexa,中斷後下bc *,再下g 510c227d來到下面:
* Possible StringData Ref from Code Obj ->"\Software\HappyEO3SC"
:510C227D              mov edx, 510C2364
:510C2282              mov eax, dword ptr [ebp-10]
……
省略
……
* Possible StringData Ref from Code Obj ->"UserName"(讀註冊名)
:510C22B4              mov edx, 510C23A4
:510C22B9              mov eax, dword ptr [ebp-10]
……
省略
……
* Possible StringData Ref from Code Obj ->"Address"(讀地址)
:510C22CE              mov edx, 510C23B8
:510C22D3              mov eax, dword ptr [ebp-10]
:510C22D6              call 5106F4A0
……
省略
……
* Possible StringData Ref from Code Obj ->"RegisterCode"(讀假註冊碼)
:510C22E8              mov edx, 510C23C8
:510C22ED              mov eax, dword ptr [ebp-10]
:510C22F0              call 5106F4A0
……
省略
……
單步跟蹤後跳到此處:
:510C247B             call 510C23D8
:510C2480             mov edx, dword ptr [51104238]
:510C2486             mov byte ptr [edx], al
:510C2488             mov eax, dword ptr [51104238]
:510C248D             cmp byte ptr [eax], 00
:510C2490             je 510C249B(不為零就跳)
:510C2492             call 5100A334
:510C2497             fstp qword ptr [ebp-10]


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510C2490(C)
|
:510C249B              mov eax, dword ptr [ebx]
:510C249D              call 51004898(讀註冊名位數入EAX)
:510C24A2              cmp eax, 00000004
:510C24A5              jl 510C24E2(小於4位就跳,跳則over)
:510C24A7              mov eax, dword ptr [esi]
:510C24A9              call 51004898(讀地址位數入EAX)
:510C24AE              cmp eax, 0000000C
:510C24B1              jl 510C24E2(小於12位就跳,跳則over)
:510C24B3              mov eax, dword ptr [ebp+08]
:510C24B6              mov eax, dword ptr [eax]
:510C24B8              call 51004898(讀註冊碼位數入EAX)
:510C24BD              cmp eax, 00000008
:510C24C0              jne 510C24E2(不等於8位就跳,跳則over)
:510C24C2              lea ecx, dword ptr [ebp-1C]
:510C24C5              mov edx, dword ptr [esi]
:510C24C7              mov eax, dword ptr [ebx]
:510C24C9              call 510C1F98(演算法call跟進)
:510C24CE              mov eax, dword ptr [ebp-1C]
:510C24D1              mov edx, dword ptr [ebp+08]
:510C24D4              mov edx, dword ptr [edx]
:510C24D6              call 510049DC(關鍵call,比較真假註冊碼)
:510C24DB              jne 510C24E2(關鍵跳,不相等就跳,跳則over)
:510C24DD              mov byte ptr [edi], 04
:510C24E0              jmp 510C252D


跟進演算法call:
:510C1F98              push ebp
:510C1F99              mov ebp, esp
……
省略
……
:510C1FCA              mov eax, ebx
:510C1FCC              call 510045C4

:510C1FD1              mov eax, dword ptr [ebp-04]
:510C1FD4              call 51004898
:510C1FD9              cmp eax, 00000004
:510C1FDC              jl 510C2008
:510C1FDE              mov eax, dword ptr [ebp-08]
:510C1FE1              call 51004898
:510C1FE6              cmp eax, 0000000C
:510C1FE9              jl 510C2008
以上這段程式仍是對註冊名、地址位數的比較。

:510C1FEB              lea eax, dword ptr [ebp-0C]
:510C1FEE              mov ecx, dword ptr [ebp-08](地址abcdefg@163.com入ECX)
:510C1FF1              mov edx, dword ptr [ebp-04](註冊名yqmjch入EDX)
:510C1FF4              call 510048E4(將註冊名與地址連線)
:510C1FF9              mov eax, dword ptr [ebp-0C](連線後的yqmjchabcdefg@163.com入EAX)
:510C1FFC              call 510C1EA0(跟進此call①,作用:用yqmjchabcdefg@163.com算出一個引數)
:510C2001              mov edx, ebx
:510C2003              call 510C1F18(跟進此call②,作用:將引數運算後查表得出註冊碼)


跟進call①:
* Referenced by a CALL at Address:
|:510C1FFC  
|
:510C1EA0             push ebp
:510C1EA1             mov ebp, esp
……
省略
……
:510C1EC0             or ebx, FFFFFFFF
:510C1EC3             mov eax, dword ptr [ebp-04](yqmjchabcdefg@163.com入EAX)
:510C1EC6             call 51004898(取yqmjchabcdefg@163.com的位數)
:510C1ECB             mov esi, eax
:510C1ECD             test esi, esi
:510C1ECF             jle 510C1EEA
:510C1ED1             mov edi, 00000001
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510C1EE8(C)
|
:510C1ED6             mov eax, dword ptr [ebp-04] (yqmjchabcdefg@163.com入EAX)
:510C1ED9             mov al, byte ptr [eax+edi-01](取第一位“y”)
:510C1EDD             mov edx, ebx
:510C1EDF             call 510C1E80(運算call跟進)
                          :510C1E80       xor al, dl(與dl引數值進行異或運算)
                          :510C1E82       and eax, 000000FF(與運算)
                          :510C1E87       mov eax, dword ptr [4*eax+511012B0](乘、加運算)
                          :510C1E8E       shr edx, 08(邏輯右移)
                          :510C1E91       and edx, 00FFFFFF(與運算)
                          :510C1E97       xor eax, edx(與edx異或運算)
                          :510C1E99       ret
:510C1EE4               mov ebx, eax
:510C1EE6               inc edi
:510C1EE7               dec esi
:510C1EE8               jne 510C1ED6(向上迴圈,直到取完yqmjchabcdefg@163.com)

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510C1ECF(C)
|
:510C1EEA              mov eax, ebx(得出的引數值入eax)
:510C1EEC              call 510C1E9C(再與-1作異或運算後作為返回值)
                           :510C1E9C       xor eax, FFFFFFFF
                           :510C1E9F       ret
:510C1EF1              mov ebx, eax
:510C1EF3              xor eax, eax
:510C1EF5              pop edx
:510C1EF6              pop ecx
:510C1EF7              pop ecx
:510C1EF8              mov dword ptr fs:[eax], edx
:510C1EFB              push 510C1F10


跟進call②:
* Referenced by a CALL at Address:
|:510C2003  
|
:510C1F18              push ebp
:510C1F19              mov ebp, esp
……
省略
……
:510C1F2F              mov dword ptr fs:[eax], esp
:510C1F32              mov eax, edi
:510C1F34              call 510045C4
:510C1F39              mov esi, 00000008(註冊碼位數入esi)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:510C1F72(C)
|
:510C1F3E              mov eax, ebx(call①計算出的引數入eax)
:510C1F40              mov ecx, 00000024(引數24入ecx)
:510C1F45              xor edx, edx
:510C1F47              div ecx(call①計算出的引數除以24,餘數入edx)
:510C1F49              mov eax, dword ptr [5110419C](此處有一註冊碼錶:$3456789BCDEFGHIJKLMNOPQRSTUVWXYZ012A)
:510C1F4E              mov dl, byte ptr [eax+edx+01](查表取值入dl)
:510C1F52              lea eax, dword ptr [ebp-04]
:510C1F55              call 510047A4
:510C1F5A              mov edx, dword ptr [ebp-04](得出的註冊碼入edx)
:510C1F5D              mov eax, edi
:510C1F5F              call 510048A0(將得出的註冊碼連線)
:510C1F64              mov eax, ebx(call①計算出的引數入eax)
:510C1F66              mov ecx, 00000007(引數7入ecx)
:510C1F6B              xor edx, edx
:510C1F6D              div ecx(call①計算出的引數除以7,商入eax)
:510C1F6F              mov ebx, eax(將eax的值存入ebx,作為下次計算求值的引數)
:510C1F71              dec esi
:510C1F72              jne 510C1F3E(迴圈計算取值,得出註冊碼)
:510C1F74              xor eax, eax


整理:
   註冊名:yqmjch
   地  址:abcdefg@163.com
   註冊碼:QWXS2O58
   註冊資訊存放在登錄檔HKEY_USERS\.DEFAULT\Software\Happye03SC下。
   再有就是不知是否有暗樁,初學破解,不妥之處還望高手指點。


相關文章