班門弄斧之GoldView32 2.0 Build168演算法分析 (8千字)

看雪資料發表於2002-01-24

GoldView32 2.0 build 168破解過程
【軟體簡介】是一個對檔案的所在結構進行瀏覽的軟體。就是能顯示檔案有關結            構和物件的相關資訊,是一種只能顯示不能修改的工具,對於不想            查詢資料詞典而想知道有關資訊的人非常有用,能讓人們安全瀏覽            檔案。
【下載地址】http://newhua.infosail.com/Goldview.htm
【破解工具】Language2000、DeDe 3.0、Ollydbg 1.4
【文章作者】eCool[BCG][FCG][CNCG]
【出版時間】2002年1月24日
【鄭重宣告】轉載請保持文章完整,謝謝。

      很久沒有搞破解了有點手癢,所以立馬去華軍一趟,隨便選了個軟體下載,結果就搞到了這個東東,安裝完成後,執行,註冊,原來是單Serial型的註冊,看來有點困難,隨便輸入一個註冊碼,點Ok,出來一個錯誤對話方塊,呵呵,有戲看了。退出程式,立即用Language2000分析一下GoldView.exe,不錯沒有加殼,而且是DeDe的,so,用Dede分析一下,很快在Nag Unit中找到個RegisterButtonClick,進入這個事件,來到這裡:
* Reference to field TNagDlg.OFFS_0314
|
004E0626  8B9314030000          mov    edx, [ebx+$0314]
004E062C  8D45FC                lea    eax, [ebp-$04]

|
004E062F  E8B445F2FF            call    00404BE8
004E0634  8B45FC                mov    eax, [ebp-$04]

|
004E0637  E894F8FFFF            call    004DFED0
004E063C  84C0                  test    al, al==》經典的比較啊,因此在4E0637處下斷。
004E063E  743C                  jz      004E067C
004E0640  8D55F4                lea    edx, [ebp-$0C]
      好的,馬上執行Ollydbg,載入,執行,輸入假註冊碼AB1234,然後在4E0637下斷,點OK按鈕,馬上背攔下,按F7跟入。
004DFED0  55                    push    ebp
004DFED1  8BEC                  mov    ebp, esp
004DFED3  33C9                  xor    ecx, ecx
004DFED5  51                    push    ecx
004DFED6  51                    push    ecx
004DFED7  51                    push    ecx
004DFED8  51                    push    ecx
004DFED9  51                    push    ecx
004DFEDA  51                    push    ecx
004DFEDB  53                    push    ebx
004DFEDC  56                    push    esi
004DFEDD  8945FC                mov    [ebp-$04], eax
004DFEE0  8B45FC                mov    eax, [ebp-$04]

|
004DFEE3  E89C4EF2FF            call    00404D84
004DFEE8  33C0                  xor    eax, eax
004DFEEA  55                    push    ebp

* Possible String Reference to: 'B?脬E^[]@'
|
004DFEEB  68F5FF4D00            push    $004DFFF5

***** TRY
|
004DFEF0  64FF30                push    dword ptr fs:[eax]
004DFEF3  648920                mov    fs:[eax], esp
004DFEF6  C645FB00              mov    byte ptr [ebp-$05], $00
004DFEFA  8D55EC                lea    edx, [ebp-$14]
004DFEFD  8B45FC                mov    eax, [ebp-$04]

|
004DFF00  E8DB8EF2FF            call    00408DE0==》取字串"Goldview32"
004DFF05  8B55EC                mov    edx, [ebp-$14]
004DFF08  8D45FC                lea    eax, [ebp-$04]

|
004DFF0B  E86C4AF2FF            call    0040497C==》將"Goldview32"加上我們的註冊碼
004DFF10  8D45F0                lea    eax, [ebp-$10]所以變成"Goldview32AB1234"

|
004DFF13  E8CC49F2FF            call    004048E4==》轉換成大寫
004DFF18  8B45FC                mov    eax, [ebp-$04]"GOLDVIEW32AB1234"

|
004DFF1B  E87C4CF2FF            call    00404B9C
004DFF20  8BD8                  mov    ebx, eax
004DFF22  EB01                  jmp    004DFF25
004DFF24  4B                    dec    ebx
004DFF25  8B45FC                mov    eax, [ebp-$04]            -+
004DFF28  8A4418FF              mov    al, byte ptr [eax+ebx-$01] |這段程式碼的作用是
004DFF2C  04D0                  add    al, -$30                  |判斷輸入的註冊碼的
004DFF2E  2C0A                  sub    al, $0A                    |最後幾位是不是數字。
004DFF30  7304                  jnb    004DFF36                  |(最起碼最後一位必須
004DFF32  85DB                  test    ebx, ebx                  |是數字)
004DFF34  7FEE                  jnle    004DFF24                  -+
004DFF36  8D45F0                lea    eax, [ebp-$10]
004DFF39  50                    push    eax
004DFF3A  8B45FC                mov    eax, [ebp-$04]

|
004DFF3D  E85A4CF2FF            call    00404B9C
004DFF42  8BC8                  mov    ecx, eax
004DFF44  2BCB                  sub    ecx, ebx
004DFF46  8D5301                lea    edx, [ebx+$01]
004DFF49  8B45FC                mov    eax, [ebp-$04]

|
004DFF4C  E8A34EF2FF            call    00404DF4
004DFF51  8D45F4                lea    eax, [ebp-$0C]
004DFF54  50                    push    eax
004DFF55  8B45FC                mov    eax, [ebp-$04]

|
004DFF58  E83F4CF2FF            call    00404B9C
004DFF5D  50                    push    eax
004DFF5E  8B45F0                mov    eax, [ebp-$10]

|
004DFF61  E8364CF2FF            call    00404B9C
004DFF66  59                    pop    ecx
004DFF67  2BC8                  sub    ecx, eax
004DFF69  BA01000000            mov    edx, $00000001
004DFF6E  8B45FC                mov    eax, [ebp-$04]

|
004DFF71  E87E4EF2FF            call    00404DF4
004DFF76  33F6                  xor    esi, esi
004DFF78  8B45F4                mov    eax, [ebp-$0C]

|
004DFF7B  E81C4CF2FF            call    00404B9C
004DFF80  85C0                  test    eax, eax
004DFF82  7E4E                  jle    004DFFD2
004DFF84  8B45F4                mov    eax, [ebp-$0C]

|
004DFF87  E8104CF2FF            call    00404B9C
004DFF8C  85C0                  test    eax, eax
004DFF8E  7E42                  jle    004DFFD2
004DFF90  8B45F4                mov    eax, [ebp-$0C]

|
004DFF93  E8044CF2FF            call    00404B9C==》取去掉最後幾位數字的字元
004DFF98  85C0                  test    eax, eax      這裡是GOLDVIEW32AB
004DFF9A  7E1B                  jle    004DFFB7
004DFF9C  BB01000000            mov    ebx, $00000001
004DFFA1  8B55F4                mov    edx, [ebp-$0C]
004DFFA4  0FB6541AFF            movzx  edx, byte ptr [edx+ebx-$01]-+對GOLDVIEW32AB進行運算
004DFFA9  0FAFD3                imul    edx, ebx                    |s="GOLDVIEW32AB":y=0
004DFFAC  6BCB0B                imul    ecx, ebx, $0B              |for i=1 to len(s)
004DFFAF  03D1                  add    edx, ecx                    |  x=asc(mid$(s,i,1))
004DFFB1  03F2                  add    esi, edx                    |  x=x*i
004DFFB3  43                    inc    ebx                        |  x=i*&hb+x
004DFFB4  48                    dec    eax                        |  y=y+x
004DFFB5  75EA                  jnz    004DFFA1                  -+next i
004DFFB7  8D55E8                lea    edx, [ebp-$18]
004DFFBA  8BC6                  mov    eax, esi

|
004DFFBC  E80395F2FF            call    004094C4==》獲得最後幾位是數字的字元,這裡是1234
004DFFC1  8B45E8                mov    eax, [ebp-$18]==》eax=y=6100
004DFFC4  8B55F0                mov    edx, [ebp-$10]==》edx=1234

|
004DFFC7  E8144DF2FF            call    00404CE0==》比較是否相等
004DFFCC  7504                  jnz    004DFFD2
004DFFCE  C645FB01              mov    byte ptr [ebp-$05], $01
004DFFD2  33C0                  xor    eax, eax
004DFFD4  5A                    pop    edx
004DFFD5  59                    pop    ecx
004DFFD6  59                    pop    ecx
004DFFD7  648910                mov    fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: 'E^[]@'
|
004DFFDA  68FCFF4D00            push    $004DFFFC
004DFFDF  8D45E8                lea    eax, [ebp-$18]
004DFFE2  BA04000000            mov    edx, $00000004

|
004DFFE7  E81C49F2FF            call    00404908
004DFFEC  8D45FC                lea    eax, [ebp-$04]

|
004DFFEF  E8F048F2FF            call    004048E4
004DFFF4  C3                    ret

004DFFF5  E98E42F2FF            jmp    00404288
004DFFFA  EBE3                  jmp    004DFFDF

****** END
|
004DFFFC  8A45FB                mov    al, byte ptr [ebp-$05]
004DFFFF  5E                    pop    esi
004E0000  5B                    pop    ebx
004E0001  8BE5                  mov    esp, ebp
004E0003  5D                    pop    ebp
004E0004  C3                    ret

到此,我們可以得到一個合法的註冊碼是:AB6100.

相關文章