學演算法的看過來 》》》演算法分析: <獻給初學者> 之五 (5千字)

看雪資料發表於2002-06-07

演算法分析:  <獻給初學者> 之五

◆ 作  者 ◆ goodbao[P.J.CHINA]

▲軟體名稱▲  網際搜尋 NetSearch V1.0

▲軟體簡介▲  一款網際網路搜尋軟體,能有效的對網站、軟體、新聞、音樂、圖書、購物、股票等進行搜尋,而不用煩索的登入到各大網站,直接在本軟體內部輸入關鍵字進行搜尋,大大的節省了上網時間和費用。

▲破解難度▲  非明碼破解。演算法難度初級。

▲破解背景▲  這幾天真的非常背呀!機器總是當機、重啟,開不開又關不成!唉,命好苦呃。。。。索性上網找了個軟柿子,拼命地狠捏了一通,算是解了心頭之恨!!!!呵呵。。“高不成、低不就”的我在這裡就再現一回眼,把它貼了出來啦!

▲破解過程▲
    這是一個非明碼的註冊方式,如果註冊不對,它會有提示,又沒加過殼,因此反編譯是很容易的。但是,也正由於其非明碼,所以可能對初學的朋友們來說會有些難度。因此,我儘量把過程寫得細些,供大家參考。
    首先,設斷Bpx hmemcpy,然後F5退出,然後填寫名與碼,然後點選註冊認證,會中斷。然後,清斷,然後12下F12(因為13下會出錯),就會來到如下地方:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004AC9C6(C)
|
:004ACA3B 8B45F4                  mov eax, dword ptr [ebp-0C]======>我們停在這兒。

:004ACA3E E87974F5FF              call 00403EBC======>取註冊名的長度並儲存在EAX中。

:004ACA43 8BF0                    mov esi, eax========>ESI=EAX=註冊名的長度
:004ACA45 85F6                    test esi, esi=======>測試ESI是否為0。即:判斷是否什麼都沒輸入。
:004ACA47 7E38                    jle 004ACA81========>什麼都沒輸入就跳了,那就玩完。。
:004ACA49 C745F001000000          mov [ebp-10], 00000001====>給[ebp-10]賦值為01,下邊要用到它進行一次傳送,然後作為迴圈計算時的計數器。

===================迴圈計算開始===================

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA7F(C)
|
:004ACA50 8D45EC                  lea eax, dword ptr [ebp-14]
:004ACA53 50                      push eax
:004ACA54 B901000000              mov ecx, 00000001=============>ECX=01
:004ACA59 8B55F0                  mov edx, dword ptr [ebp-10]===>EDX=[ebp-10],就是上邊提到的已經被賦值為01的那個。這裡給EDX賦值為01,其作用就是為下邊即將進行的迴圈過程計數。

:004ACA5C 8B45F4                  mov eax, dword ptr [ebp-0C]===>EAX=使用者名稱
:004ACA5F E86076F5FF        call 04040C4===============>依次取使用者名稱的每一個字元送給EAX

:004ACA64 8B45EC                  mov eax, dword ptr [ebp-14]===>EAX=使用者名稱第一個字元
:004ACA67 E81476F5FF              call 00404080=================>取字元的$
:004ACA6C 8A00                    mov al, byte ptr [eax]========>AL=所取字元的$
:004ACA6E 25FF000000              and eax, 000000FF=============>EAX和000000FF進行與運算,事實上就是把EAX的值寫為上面所取字元的16進位制值。

:004ACA73 03D8                    add ebx, eax==================>EBX=EBX+EAX。什麼意思呢?就是說,依次取了我們輸入的使用者名稱的字元後,把所取的字元值存入了EAX,然後把這個值與EBX相加,結果存入了EBX。EBX在初始時,值是0,因此,第一次執行到這裡,就是把我們所取的第一個使用者名稱$給了EBX。下次開始再執行到這裡時,就是把後面的計算結果與每次所取的字元值依次相加後,放入EBX了。呵呵。。。。因此,第一次時,EBX=EAX

:004ACA75 81C351EBC900            add ebx, 00C9EB51=============>上面的結果EBX與00C9EB51相加,再把計算的和存在EBX中。
:004ACA7B FF45F0                  inc [ebp-10]==================>[ebp-10]加1,開始計數。
:004ACA7E 4E                      dec esi=======================>ESI減1。前面ESI已經被賦值為使用者名稱$長度了,因此,這裡減1,意味著已經有一個字元被取算完成。

:004ACA7F 75CF                    jne 004ACA50==================>沒取完跳回,取完繼續。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004ACA47(C)
|
:004ACA81 8D55E8                  lea edx, dword ptr [ebp-18]
:004ACA84 8B45FC                  mov eax, dword ptr [ebp-04]
:004ACA87 8B8000090000            mov eax, dword ptr [eax+00000900]
:004ACA8D E8FA07F8FF              call 0042D28C=====================>取註冊碼個數
:004ACA92 8B45E8                  mov eax, dword ptr [ebp-18]=======>EAX=[ebp-18]=輸入的註冊碼
:004ACA95 E8F6C0F5FF              call 00408B90=====================>取註冊碼的值存入EAX
:004ACA9A 3BD8                    cmp ebx, eax======================>比較EBX與EAX。即比較前面計算的結果值與註冊碼的值是否相等
:004ACA9C 7519                    jne 004ACAB7======================>不相等,就完蛋啦!
:004ACA9E C645FB01                mov [ebp-05], 01
:004ACAA2 B8B49A4C00              mov eax, 004C9AB4
:004ACAA7 8B55F4                  mov edx, dword ptr [ebp-0C]
:004ACAAA E8E171F5FF              call 00403C90
:004ACAAF 891DB89A4C00            mov dword ptr [004C9AB8], ebx
:004ACAB5 EB04                    jmp 004ACABB

▲演算法總結▲
        使用者名稱與註冊碼的關係應該是這樣的:比如,我取使用者名稱為ABC。那麼,先經過如下計算得到EBX的值為41+00C9EB51+42+00C9EB51+43+00C9EB51=25DC2B9。然後,將其轉化為10進位制值:39699129。這就是註冊碼了。應該指出的是,這個軟體對註冊碼長度是沒有限制的,哪怕你只在使用者名稱中輸入一個字元,那麼也可以註冊成功!中文名字就更可以啦!只是要注意,中文名字一個字相當於兩個位元組長度的。呵呵。。。。
    收工嘍…………………………@!@

--------------------------------------------------------------------------------
   神龍寶寶
goodbao[P.J.CHINA][BCG][CNCG]

相關文章