原創-XNview v1.65演算法分析

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

XNview v1.65演算法分析

【軟體簡介】:支援多達 70 種格式的圖形瀏覽、轉換、編輯軟體,還可製作 Slide Show。是否嫌ACDSEE太大功能太少?這個軟體能很好地解決問題,他具有抓圖、編輯圖象、增加特效的功能,支援你所知道的所有格式及你不知道的格式(包括電影、MP3)。支援簡體中文語言。 
  
【聲    明】:破解旨在學習技術,無其它目的。失誤之處敬請諸位大俠賜教!

【程 序 名】:XNview.exe
【版    本】:v1.65   <-不知道它現在的版本是多少,管它的先看看再說。:)
【大    小】:730KB
【語    言】:Microsoft Visual C++ 6.0
【執行平臺】:W9x/NT/W2K/WXP
【保護方式】:ASPack / ASProtect x.xx殼/註冊碼
【分析方式】:追註冊碼/分析註冊演算法
【難    度】:簡單
【工    具】:AspackDie141/PEid0.9/W32Dasm8.93+/TRW2000 v1.23
【程式下載】:http://www.xnview.com

【作    者】:xbb_NCG

【分    析】:

    用PEid0.9檢視程式被ASPack加殼,AspackDie141脫殼(本想嘗試手動脫殼,不過功能不夠,還需要學習)。檢視脫殼後的程式是用Microsoft Visual C++ 6.0編的,點選軟體選單 幫助->註冊 會彈出一個註冊對話方塊,輸入xbb-NCG和假註冊碼123456789提示"非法註冊"。於是用ResHacker3.4.0.79版開啟它。在對話方塊資源中我們可以找到以NVIEWREGISTRATION名的對話方塊資源,點選它左邊的+號,點選展開的1033項會顯示一個一程式中一樣的對話方塊,並且右邊視窗中可以找到CAPTION"Registration"字樣。OK,複製Registration。用W32Dasm8.93+反彙編程式,開啟串式參考,在Search欄貼上Registration然後搜尋,我們會發現第一個字元是"Invalid registration"(非法註冊<---:)HOHO就是它)。這個字串的中文含義和我們前面在程式中輸入假註冊碼後的提示資訊是一樣的:)。現在雙擊它我們會看到如下程式碼。
    如果我們要找出軟體的註冊演算法的話就要在TRW2000中下bpx 466E40斷點,因為在466E52下面我們可清楚地看到GetDlgItemTextA這個API,很明顯程式呼叫了它來獲取註冊對話方塊裡的字元。當然直接下bpx getdlgitemtexta斷點也行,隨個人喜好。因為我要跟蹤註冊碼的演算法,所以從前面一步步地跟下來要好些。:)
    OK,開工了(對了,不要忘了準備一些紙和筆,隨時在紙上對一些語句做註釋,這樣不會退出TRW2000後就忘了,以後寫手記也要靠它的。做為新手這點一定要做到,不要怕累,做多了,你會對一些彙編語句非常熟悉的,一看就知道是幹什麼的。遇到不懂的彙編語句就去看彙編的書找找,這樣你會記得更牢些。這是我個人的一些做法,你不一定要像我這樣。:))

*******************************************************************************

:00466E3C 90                      nop
:00466E3D 90                      nop
:00466E3E 90                      nop
:00466E3F 90                      nop
:00466E40 81EC68010000            sub esp, 00000168
:00466E46 8D442468                lea eaxdword ptr [esp+68]
:00466E4A 56                      push esi
:00466E4B 8BB42470010000          mov esidword ptr [esp+00000170]
:00466E52 57                      push edi

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                  |
:00466E53 8B3D40A55300            mov edidword ptr [0053A540]

* Possible Ref to Menu: BROWSERMENU, Item: "Create Panorama..."
                                  |
:00466E59 6800010000              push 00000100
:00466E5E 50                      push eax

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D0, ""
                                  |
:00466E5F 68D0070000              push 000007D0
:00466E64 56                      push esi
:00466E65 FFD7                    call edi
:00466E67 8D4C2410                lea ecxdword ptr [esp+10]

* Possible Ref to Menu: NVIEWMENU, Item: "Crop   Ctrl+Y"
                                  |
:00466E6B 6A20                    push 00000020
:00466E6D 51                      push ecx

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D1, ""
                                  |
:00466E6E 68D1070000              push 000007D1
:00466E73 56                      push esi
:00466E74 FFD7                    call edi
:00466E76 8A442470                mov albyte ptr [esp+70]  <-檢測使用者名稱是否為0
:00466E7A 84C0                    test alal
:00466E7C 0F843A010000            je 00466FBC                <-等於0則跳
:00466E82 8A442410                mov albyte ptr [esp+10]  <-檢測註冊碼是否為0
:00466E86 84C0                    test alal
:00466E88 0F842E010000            je 00466FBC                <-等於0測跳
:00466E8E 8D542408                lea edxdword ptr [esp+08]
:00466E92 8D442470                lea eaxdword ptr [esp+70]
:00466E96 52                      push edx
:00466E97 50                      push eax
:00466E98 E8A340FAFF              call 0040AF40                  <-註冊碼計算CALL,後面跟入分析...
:00466E9D 8D4C2418                lea ecxdword ptr [esp+18]    <-ECX=假註冊碼  
:00466EA1 51                      push ecx
:00466EA2 E8BC9F0000              call 00470E63                  <-將假註冊碼轉換成16進位制數
:00466EA7 8B4C2414                mov ecxdword ptr [esp+14]    <-ECX為真註冊碼的16進位制,在此處鍵入? ecx即可見到真註冊碼
:00466EAB 83C40C                  add esp, 0000000C                問題:為什麼用?而不用D。答:因為註冊碼是以16進位制顯示的。:) 
:00466EAE 3BC8                    cmp ecxeax                   <-真假註冊碼比較
:00466EB0 745D                    je 00466F0F                    <-真假註冊碼相等則跳到註冊成功處
:00466EB2 A1288C5800              mov eaxdword ptr [00588C28]
:00466EB7 8D542430                lea edxdword ptr [esp+30]

* Possible Ref to Menu: NVIEWMENU, Item: "16 Grey scale (Dither)"
                                  |
:00466EBB 6A40                    push 00000040
:00466EBD 52                      push edx

* Possible Reference to String Resource ID=05011: "Invalid registration"  <-雙擊後我們來到這裡
                                  |
:00466EBE 6893130000              push 00001393
:00466EC3 50                      push eax

* Reference To: USER32.LoadStringA, Ord:01ABh
                                  |
:00466EC4 FF15F8A55300            Call dword ptr [0053A5F8]

* Possible Ref to Menu: NVIEWDEFAULTME, Item: "Slide Show...   Ctrl+L"
                                  |
:00466ECA 6A10                    push 00000010
:00466ECC 8D4C2434                lea ecxdword ptr [esp+34]
:00466ED0 689C325800              push 0058329C
:00466ED5 51                      push ecx
:00466ED6 56                      push esi

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00466ED7 FF157CA55300            Call dword ptr [0053A57C]          <-非法註冊提示

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D0, ""
                                  |
:00466EDD 68D0070000              push 000007D0
:00466EE2 56                      push esi

* Reference To: USER32.GetDlgItem, Ord:0102h
                                  |
:00466EE3 FF151CA65300            Call dword ptr [0053A61C]
:00466EE9 50                      push eax

* Reference To: USER32.SetFocus, Ord:022Fh
                                  |
:00466EEA FF1558A55300            Call dword ptr [0053A558]
:00466EF0 689C325800              push 0058329C

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D1, ""
                                  |
:00466EF5 68D1070000              push 000007D1
:00466EFA 56                      push esi

* Reference To: USER32.SetDlgItemTextA, Ord:022Ch
                                  |
:00466EFB FF15FCA55300            Call dword ptr [0053A5FC]
:00466F01 5F                      pop edi

* Possible Ref to Menu: BROWSERMENU, Item: "Open..."
                                  |
:00466F02 B801000000              mov eax, 00000001
:00466F07 5E                      pop esi
:00466F08 81C468010000            add esp, 00000168
:00466F0E C3                      ret



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00466EB0(C)                                             <--------註冊碼比對正確後跳來此處
|
:00466F0F 8D542470                lea edxdword ptr [esp+70]

* Possible Ref to Menu: BROWSERMENU, Item: "Create Panorama..."
                                  |
:00466F13 6800010000              push 00000100
:00466F18 52                      push edx

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D0, ""
                                  |
:00466F19 68D0070000              push 000007D0
:00466F1E 56                      push esi
:00466F1F FFD7                    call edi
:00466F21 8D442410                lea eaxdword ptr [esp+10]

* Possible Ref to Menu: NVIEWMENU, Item: "Crop   Ctrl+Y"
                                  |
:00466F25 6A20                    push 00000020
:00466F27 50                      push eax

* Possible Reference to Dialog: NVIEWAUTOCROP, CONTROL_ID:07D1, ""
                                  |
:00466F28 68D1070000              push 000007D1
:00466F2D 56                      push esi
:00466F2E FFD7                    call edi
:00466F30 8D4C2470                lea ecxdword ptr [esp+70]
:00466F34 51                      push ecx

* Possible StringData Ref from Data Obj ->"LicenseName"
                                  |
:00466F35 6828365600              push 00563628
:00466F3A 6A00                    push 00000000
:00466F3C E8FF5DFDFF              call 0043CD40              <-使用者名稱寫入登錄檔
:00466F41 8D54241C                lea edxdword ptr [esp+1C]
:00466F45 52                      push edx

* Possible StringData Ref from Data Obj ->"LicenseNumber"
                                  |
:00466F46 6818365600              push 00563618
:00466F4B 6A00                    push 00000000
:00466F4D E8EE5DFDFF              call 0043CD40              <-註冊碼寫入登錄檔
:00466F52 A12C8C5800              mov eaxdword ptr [00588C2C]
:00466F57 83C418                  add esp, 00000018             問題:你怎麼知道上面是寫登錄檔?答:因為我用Regmon這個軟體
                                                                      對軟體啟動時的動作進行了監測的。:)
* Possible Ref to Menu: BROWSERMENU, Item: "Open..."
                                  |
:00466F5A C705488C580001000000    mov dword ptr [00588C48], 00000001

* Possible Ref to Menu: BROWSERMENU, Item: "Open..."
                                  |
:00466F64 6A01                    push 00000001

* Possible Ref to Menu: BROWSERMENU, Item: "Registration"
                                  |
:00466F66 68DE000000              push 000000DE
:00466F6B 50                      push eax

* Reference To: USER32.GetMenu, Ord:011Ch
                                  |
:00466F6C FF154CA55300            Call dword ptr [0053A54C]
:00466F72 50                      push eax

* Reference To: USER32.EnableMenuItem, Ord:00B5h
                                  |
:00466F73 FF1530A55300            Call dword ptr [0053A530]      <-將幫助選單中註冊選項禁用(顯示為灰色)
:00466F79 8B15288C5800            mov edxdword ptr [00588C28]    問題:你怎麼知道這裡是對選單的禁用?答:因為EnableMenuItem,
:00466F7F 8D4C2430                lea ecxdword ptr [esp+30]            這在程式設計中是對一個控制元件的可用或不可能進行控制的,當它的
                                                                         為TRUE時,可用;為FALSE時,則不可用。:)
* Possible Ref to Menu: NVIEWMENU, Item: "16 Grey scale (Dither)"
                                  |
:00466F83 6A40                    push 00000040
:00466F85 51                      push ecx

* Possible Reference to String Resource ID=05012: "Registration succesfull"
                                  |
:00466F86 6894130000              push 00001394
:00466F8B 52                      push edx

* Reference To: USER32.LoadStringA, Ord:01ABh
                                  |
:00466F8C FF15F8A55300            Call dword ptr [0053A5F8]

* Possible Ref to Menu: NVIEWMENU, Item: "16 Grey scale (Dither)"
                                  |
:00466F92 6A40                    push 00000040
:00466F94 8D442434                lea eaxdword ptr [esp+34]
:00466F98 689C325800              push 0058329C
:00466F9D 50                      push eax
:00466F9E 56                      push esi

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00466F9F FF157CA55300            Call dword ptr [0053A57C]    <-註冊成功提示
:00466FA5 6A00                    push 00000000
:00466FA7 56                      push esi

* Reference To: USER32.EndDialog, Ord:00B9h
                                  |
:00466FA8 FF15F4A55300            Call dword ptr [0053A5F4]
:00466FAE 5F                      pop edi

* Possible Ref to Menu: BROWSERMENU, Item: "Open..."
                                  |
:00466FAF B801000000              mov eax, 00000001
:00466FB4 5E                      pop esi
:00466FB5 81C468010000            add esp, 00000168
:00466FBB C3                      ret

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00466E7C(C), :00466E88(C)                                          <-使用者名稱和註冊碼為空跳到這裡
|
:00466FBC 8B15288C5800            mov edxdword ptr [00588C28]
:00466FC2 8D4C2430                lea ecxdword ptr [esp+30]

* Possible Ref to Menu: NVIEWMENU, Item: "16 Grey scale (Dither)"
                                  |
:00466FC6 6A40                    push 00000040
:00466FC8 51                      push ecx

* Possible Reference to String Resource ID=05011: "Invalid registration"
                                  |
:00466FC9 6893130000              push 00001393
:00466FCE 52                      push edx

* Reference To: USER32.LoadStringA, Ord:01ABh
                                  |
:00466FCF FF15F8A55300            Call dword ptr [0053A5F8]

* Possible Ref to Menu: NVIEWDEFAULTME, Item: "Slide Show...   Ctrl+L"
                                  |
:00466FD5 6A10                    push 00000010
:00466FD7 8D442434                lea eaxdword ptr [esp+34]
:00466FDB 689C325800              push 0058329C
:00466FE0 50                      push eax
:00466FE1 56                      push esi

* Reference To: USER32.MessageBoxA, Ord:01BEh
                                  |
:00466FE2 FF157CA55300            Call dword ptr [0053A57C]        <-非法註冊提示
:00466FE8 5F                      pop edi

* Possible Ref to Menu: BROWSERMENU, Item: "Open..."
                                  |
:00466FE9 B801000000              mov eax, 00000001
:00466FEE 5E                      pop esi
:00466FEF 81C468010000            add esp, 00000168
:00466FF5 C3                      ret


*************************************************************************************
    跟入註冊碼演算法call 0040AF40...
    
.............

* Referenced by a CALL at Addresses:
|:0040B0FC   , :00466E98       <-程式有兩處呼叫此CALL檢查註冊碼的正確性,40B0FC顯然為程式啟動時的呼叫。
|
:0040AF40 8B542404                mov edxdword ptr [esp+04]         <-EDX為使用者名稱
:0040AF44 53                      push ebx
:0040AF45 55                      push ebp
:0040AF46 56                      push esi
:0040AF47 57                      push edi
:0040AF48 8BFA                    mov ediedx                        <-EDIX=使用者名稱
:0040AF4A 83C9FF                  or ecx, FFFFFFFF
:0040AF4D 33C0                    xor eaxeax                        <-EAX=0
:0040AF4F F2                      repnz                               <_取使用者名稱
:0040AF50 AE                      scasb                               < 的位數
:0040AF51 F7D1                    not ecx
:0040AF53 49                      dec ecx

* Possible StringData Ref from Data Obj ->"寧Fx鸚琪綣?Ps"
                                  |
:0040AF54 BE80355600              mov esi, 00563580                   <-字元表道地址入ESI
:0040AF59 8BE9                    mov ebpecx                        <-使用者名稱位數入EBP

* Possible Ref to Menu: NVIEWMENU, Item: "Reopen   Ctrl+R"
                                  |
:0040AF5B B905000000              mov ecx, 00000005                   <-ECX=5
:0040AF60 BFA8325800              mov edi, 005832A8                   <-EDI=5832A8這個地址
:0040AF65 F3                      repz                                <_將563580處的字元表移到
:0040AF66 A5                      movsd                               < 5832A8處,共20位
:0040AF67 8BF0                    mov esieax                        <-ESI=0
:0040AF69 7421                    je 0040AF8C                               +---------------------+
                                                                            |字元表:             |
* Referenced by a (U)nconditional or (C)onditional Jump at Address:         |4347622D4E 78F0D003E7|
|:0040AF8A(C)                                                               |F7FDF4E7B9 B51BC95073|
|                                                                           +---------------------+
:0040AF6B 8A0C16                  mov clbyte ptr [esi+edx]----     <-CL為使用者名稱的ASCII碼
:0040AF6E 8AD9                    mov blcl                     
:0040AF70 3298A8325800            xor blbyte ptr [eax+005832A8]    <-BL與EAX+5832A8(字元表1-5位)進行異或運算
:0040AF76 40                      inc eax      <-EAX+1             
:0040AF77 83F805                  cmp eax, 00000005   <-EAX=5嗎?   |此迴圈將使用者名稱逐位與字元表中1-5
:0040AF7A 881C16                  mov byte ptr [esi+edx], bl        |位進行異或運算。迴圈算出的結果
:0040AF7D 8888A7325800            mov byte ptr [eax+005832A7], cl   |放入ESI+EDX中。
:0040AF83 7502                    jne 0040AF87   <-EAX不等於5則跳   |
:0040AF85 33C0                    xor eaxeax   <-EAX=5則EAX=0     |結果:D2EBA6D3083B25  <---中間數1
                                                                    |
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |第一次迴圈
|:0040AF83(C)                                                      /
|                                                                 /
:0040AF87 46                      inc esi   <-計數器             /
:0040AF88 3BF5                    cmp esiebp                  /     <-計數器是否等於使用者名稱位數
:0040AF8A 72DF                    jb 0040AF6B__________________/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AF69(C)
|
:0040AF8C 33FF                    xor ediedi
:0040AF8E 33C9                    xor ecxecx
:0040AF90 85ED                    test ebpebp
:0040AF92 7626                    jbe 0040AFBA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:   
|:0040AFB8(C)
|
:0040AF94 8A9FAD325800            mov blbyte ptr [edi+005832AD]-   <-BL指向字元表第6位
:0040AF9A 8BF5                    mov esiebp                       <-ESI=使用者名稱位數
:0040AF9C 2BF1                    sub esiecx                       
:0040AF9E 4E                      dec esi            <-ESI-1         |
:0040AF9F 8A0416                  mov albyte ptr [esi+edx]         |<-ESI+EDX=中間數1
:0040AFA2 32D8                    xor blal                         |此迴圈將第一次迴圈的結果從右向左依次
:0040AFA4 47                      inc edi            <-計數器        |與字元表中6-10位進行異或運算,結果保
:0040AFA5 881C16                  mov byte ptr [esi+edx], bl         |存在ESI+EDX中。
:0040AFA8 8887AC325800            mov byte ptr [edi+005832AC], al    |
:0040AFAE 83FF05                  cmp edi, 00000005  <-EDI與5比較    |結果:E9CE41D0D8CB5D  <---中間數2
:0040AFB1 7502                    jne 0040AFB5                       |
:0040AFB3 33FF                    xor ediedi                       |
                                                                     |
* Referenced by a (U)nconditional or (C)onditional Jump at Address:  |第二次迴圈
|:0040AFB1(C)                                                       /
|                                                                  / 
:0040AFB5 41                      inc ecx                         /  
:0040AFB6 3BCD                    cmp ecxebp                   /    <-迴圈結束了嗎?
:0040AFB8 72DA                    jb 0040AF94 __________________/     <-沒結束就跳   

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AF92(C)
|
:0040AFBA 33F6                    xor esiesi
:0040AFBC 33FF                    xor ediedi
:0040AFBE 85ED                    test ebpebp
:0040AFC0 7621                    jbe 0040AFE3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFE1(C)
|
:0040AFC2 8A0417                  mov albyte ptr [edi+edx]----     <-EDI+EDX=中間數2
:0040AFC5 8A8EB2325800            mov clbyte ptr [esi+005832B2]
:0040AFCB 32C8                    xor clal                         <-CL與AL做異或運算
:0040AFCD 46                      inc esi                            
:0040AFCE 880C17                  mov byte ptr [edi+edx], cl        |
:0040AFD1 8886B1325800            mov byte ptr [esi+005832B1], al   |
:0040AFD7 83FE05                  cmp esi, 00000005                 |此迴圈將第二次迴圈的結果從左向右依次
:0040AFDA 7502                    jne 0040AFDE                      |與字元表中11-15位進行異或運算,結果保
:0040AFDC 33F6                    xor esiesi                      |存在EDI+EDX中。
                                                                    |
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |結果:1E33B537612293  <---中間數3
|:0040AFDA(C)                                                       |第三次迴圈
|                                                                  /
:0040AFDE 47                      inc edi                         /   <-計數器
:0040AFDF 3BFD                    cmp ediebp                   /  
:0040AFE1 72DF                    jb 0040AFC2___________________/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFC0(C)
|
:0040AFE3 33FF                    xor ediedi
:0040AFE5 33C9                    xor ecxecx
:0040AFE7 85ED                    test ebpebp
:0040AFE9 7626                    jbe 0040B011

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040B00F(C)
|
:0040AFEB 8A9FB7325800            mov blbyte ptr [edi+005832B7]
:0040AFF1 8BF5                    mov esiebp                    
:0040AFF3 2BF1                    sub esiecx                     
:0040AFF5 4E                      dec esi                           
:0040AFF6 8A0416                  mov albyte ptr [esi+edx]         | <-ESI+EDX=1E33B537612293
:0040AFF9 32D8                    xor blal                         | <-BL與AL異或
:0040AFFB 47                      inc edi                            |此迴圈將第三次迴圈的結果從右向左依次
:0040AFFC 881C16                  mov byte ptr [esi+edx], bl         |與字元表中16-20位進行異或運算,結果保
:0040AFFF 8887B6325800            mov byte ptr [edi+005832B6], al    |存在ESI+EDX中。
:0040B005 83FF05                  cmp edi, 00000005                  |
:0040B008 7502                    jne 0040B00C                       |
:0040B00A 33FF                    xor ediedi                       |結果:3CA0C667A83926  <---中間數4
                                                                     |
* Referenced by a (U)nconditional or (C)onditional Jump at Address:  |第四次迴圈
|:0040B008(C)                                                       /
|                                                                  /
:0040B00C 41                      inc ecx                         /    <-計數器
:0040B00D 3BCD                    cmp ecxebp                   /
:0040B00F 72DA                    jb 0040AFEB___________________/

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFE9(C)
|
:0040B011 8B7C2418                mov edidword ptr [esp+18]          <-EDI=假註冊碼
:0040B015 33C0                    xor eaxeax
:0040B017 85ED                    test ebpebp
:0040B019 C70700000000            mov dword ptr [edi], 00000000        <-將[EDI]所指向的地址按DW格式清零
:0040B01F 7617                    jbe 0040B038

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040B036(C)
|                                                                    第五次迴圈
:0040B021 8BC8                    mov ecxeax---------------
:0040B023 83E103                  and ecx, 00000003                   <-ECX=4時,EAX=0
:0040B026 8A1C39                  mov blbyte ptr [ecx+edi]   
:0040B029 8D3439                  lea esidword ptr [ecx+edi]  
:0040B02C 8A0C10                  mov clbyte ptr [eax+edx]     |此迴圈將中間數4前4位依次放入EDI所指向的
:0040B02F 02D9                    add blcl                     |地址中,第5位數繼續放入地址的第一位,但
:0040B031 40                      inc eax     <-EAX加1,計數器  / 要加上此地址中原來存在的數;第6位放入地址
:0040B032 3BC5                    cmp eaxebp                 /  的第二位並加上原來存在的數,依此類推,直
:0040B034 881E                    mov byte ptr [esi], bl      /   至中間數取完。得到的4位數的十進位制就是註冊碼。
:0040B036 72E9                    jb 0040B021________________/ 結果:E4D9EC67=67ECD9E4=174375524 <-註冊碼:)
                                                                         
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040B01F(C)
|
:0040B038 5F                      pop edi
:0040B039 5E                      pop esi
:0040B03A 5D                      pop ebp
:0040B03B 5B                      pop ebx
:0040B03C C3                      ret                          <-返回ESI=67ECD9E4到主程式

*************************************************************************************
【演算法總結】:

    透過上面對演算法CALL的逐句分析我們可以看出,軟體是透過我們輸入的使用者名稱與給定的字元表中的字元進行四次迴圈計算後得出一箇中間數,然後把這個中間數進行按4位拆分進行相加計算,即如果中間數是七位,則把第一位與第五位相加,結果放入第一位地址;第二位與第六位相加,結果放入第二位地址,依此類推,直到中間數取完為止。最後得到一個4位數(16進位制的),這個數由演算法CALL返回到主程式,與我們輸入的假註冊碼的16進位制進行比對。正確就寫登錄檔,錯誤就提示註冊碼錯誤。
    另,使用者名稱超過10位註冊碼會是個負數,不過一樣註冊碼,沒事的。:)
*************************************************************************************
【註冊資訊】:

用Regmon可以監測到軟體在註冊成功後在註冊裡寫入註冊資訊:

HKCUSoftwareXnViewLicenseName  <-使用者名稱"xbb-NCG"  
  
HKCUSoftwareXnViewLicenseNumber  <-註冊碼"1743575524"  

取註冊註冊只需把LicenseName和LicenseNumber兩個鍵值刪除即可。

*************************************************************************************
【注 冊 機】:

    我的程式設計非常差,雖然能找追演算法,可還不夠能力用程式碼還原它,正在學習C,爭取能在以後能寫出序號產生器。
    
                            xbb-NCG
                                                2003.12.15 上午

相關文章