原創-XNview v1.65演算法分析
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 eax, dword ptr [esp+68]
:00466E4A 56 push esi
:00466E4B 8BB42470010000 mov esi, dword ptr [esp+00000170]
:00466E52 57 push edi
* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:00466E53 8B3D40A55300 mov edi, dword 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 ecx, dword 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 al, byte ptr [esp+70] <-檢測使用者名稱是否為0
:00466E7A 84C0 test al, al
:00466E7C 0F843A010000 je 00466FBC <-等於0則跳
:00466E82 8A442410 mov al, byte ptr [esp+10] <-檢測註冊碼是否為0
:00466E86 84C0 test al, al
:00466E88 0F842E010000 je 00466FBC <-等於0測跳
:00466E8E 8D542408 lea edx, dword ptr [esp+08]
:00466E92 8D442470 lea eax, dword ptr [esp+70]
:00466E96 52 push edx
:00466E97 50 push eax
:00466E98 E8A340FAFF call 0040AF40 <-註冊碼計算CALL,後面跟入分析...
:00466E9D 8D4C2418 lea ecx, dword ptr [esp+18] <-ECX=假註冊碼
:00466EA1 51 push ecx
:00466EA2 E8BC9F0000 call 00470E63 <-將假註冊碼轉換成16進位制數
:00466EA7 8B4C2414 mov ecx, dword ptr [esp+14] <-ECX為真註冊碼的16進位制,在此處鍵入? ecx即可見到真註冊碼
:00466EAB 83C40C add esp, 0000000C 問題:為什麼用?而不用D。答:因為註冊碼是以16進位制顯示的。:)
:00466EAE 3BC8 cmp ecx, eax <-真假註冊碼比較
:00466EB0 745D je 00466F0F <-真假註冊碼相等則跳到註冊成功處
:00466EB2 A1288C5800 mov eax, dword ptr [00588C28]
:00466EB7 8D542430 lea edx, dword 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 ecx, dword 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 edx, dword 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 eax, dword 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 ecx, dword 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 edx, dword 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 eax, dword 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 edx, dword ptr [00588C28] 問題:你怎麼知道這裡是對選單的禁用?答:因為EnableMenuItem,
:00466F7F 8D4C2430 lea ecx, dword 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 eax, dword 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 edx, dword ptr [00588C28]
:00466FC2 8D4C2430 lea ecx, dword 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 eax, dword 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 edx, dword ptr [esp+04] <-EDX為使用者名稱
:0040AF44 53 push ebx
:0040AF45 55 push ebp
:0040AF46 56 push esi
:0040AF47 57 push edi
:0040AF48 8BFA mov edi, edx <-EDIX=使用者名稱
:0040AF4A 83C9FF or ecx, FFFFFFFF
:0040AF4D 33C0 xor eax, eax <-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 ebp, ecx <-使用者名稱位數入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 esi, eax <-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 cl, byte ptr [esi+edx]---- <-CL為使用者名稱的ASCII碼
:0040AF6E 8AD9 mov bl, cl
:0040AF70 3298A8325800 xor bl, byte 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 eax, eax <-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 esi, ebp / <-計數器是否等於使用者名稱位數
:0040AF8A 72DF jb 0040AF6B__________________/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AF69(C)
|
:0040AF8C 33FF xor edi, edi
:0040AF8E 33C9 xor ecx, ecx
:0040AF90 85ED test ebp, ebp
:0040AF92 7626 jbe 0040AFBA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFB8(C)
|
:0040AF94 8A9FAD325800 mov bl, byte ptr [edi+005832AD]- <-BL指向字元表第6位
:0040AF9A 8BF5 mov esi, ebp <-ESI=使用者名稱位數
:0040AF9C 2BF1 sub esi, ecx
:0040AF9E 4E dec esi <-ESI-1 |
:0040AF9F 8A0416 mov al, byte ptr [esi+edx] |<-ESI+EDX=中間數1
:0040AFA2 32D8 xor bl, al |此迴圈將第一次迴圈的結果從右向左依次
: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 edi, edi |
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |第二次迴圈
|:0040AFB1(C) /
| /
:0040AFB5 41 inc ecx /
:0040AFB6 3BCD cmp ecx, ebp / <-迴圈結束了嗎?
:0040AFB8 72DA jb 0040AF94 __________________/ <-沒結束就跳
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AF92(C)
|
:0040AFBA 33F6 xor esi, esi
:0040AFBC 33FF xor edi, edi
:0040AFBE 85ED test ebp, ebp
:0040AFC0 7621 jbe 0040AFE3
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFE1(C)
|
:0040AFC2 8A0417 mov al, byte ptr [edi+edx]---- <-EDI+EDX=中間數2
:0040AFC5 8A8EB2325800 mov cl, byte ptr [esi+005832B2]
:0040AFCB 32C8 xor cl, al <-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 esi, esi |存在EDI+EDX中。
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |結果:1E33B537612293 <---中間數3
|:0040AFDA(C) |第三次迴圈
| /
:0040AFDE 47 inc edi / <-計數器
:0040AFDF 3BFD cmp edi, ebp /
:0040AFE1 72DF jb 0040AFC2___________________/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFC0(C)
|
:0040AFE3 33FF xor edi, edi
:0040AFE5 33C9 xor ecx, ecx
:0040AFE7 85ED test ebp, ebp
:0040AFE9 7626 jbe 0040B011
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040B00F(C)
|
:0040AFEB 8A9FB7325800 mov bl, byte ptr [edi+005832B7]
:0040AFF1 8BF5 mov esi, ebp
:0040AFF3 2BF1 sub esi, ecx
:0040AFF5 4E dec esi
:0040AFF6 8A0416 mov al, byte ptr [esi+edx] | <-ESI+EDX=1E33B537612293
:0040AFF9 32D8 xor bl, al | <-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 edi, edi |結果:3CA0C667A83926 <---中間數4
|
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |第四次迴圈
|:0040B008(C) /
| /
:0040B00C 41 inc ecx / <-計數器
:0040B00D 3BCD cmp ecx, ebp /
:0040B00F 72DA jb 0040AFEB___________________/
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040AFE9(C)
|
:0040B011 8B7C2418 mov edi, dword ptr [esp+18] <-EDI=假註冊碼
:0040B015 33C0 xor eax, eax
:0040B017 85ED test ebp, ebp
: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 ecx, eax---------------
:0040B023 83E103 and ecx, 00000003 <-ECX=4時,EAX=0
:0040B026 8A1C39 mov bl, byte ptr [ecx+edi]
:0040B029 8D3439 lea esi, dword ptr [ecx+edi]
:0040B02C 8A0C10 mov cl, byte ptr [eax+edx] |此迴圈將中間數4前4位依次放入EDI所指向的
:0040B02F 02D9 add bl, cl |地址中,第5位數繼續放入地址的第一位,但
:0040B031 40 inc eax <-EAX加1,計數器 / 要加上此地址中原來存在的數;第6位放入地址
:0040B032 3BC5 cmp eax, ebp / 的第二位並加上原來存在的數,依此類推,直
: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 上午
相關文章
- [原創] KCP 原始碼分析(上)2024-03-15原始碼
- 【原創】Linux PCI驅動框架分析(二)2020-12-29Linux框架
- [原創] Linux ptrace詳細分析系列(一)2021-02-02Linux
- 【原創】Linux PCI驅動框架分析(一)2020-12-20Linux框架
- 【原創】Linux虛擬化KVM-Qemu分析(一)2020-08-15Linux
- Hollis原創|深入分析Java的編譯原理2019-05-14Java編譯原理
- 【原創】InnoDB 和TokuDB的讀寫分析與比較2021-09-09
- [原創]分散式 Mutual Exclusion 演算法的 Go 語言 Demo2018-05-15分散式演算法Go
- 原創佛系紅包演算法,瞭解一下?2018-05-02演算法
- V原創2019-05-11
- [原創]兩個樣本分析,兩種程式注入學習2019-02-25
- 【原創】Linux虛擬化KVM-Qemu分析(十一)之virtqueue2021-03-28Linux
- [原創]事件分析 | Linux watchdogs 感染性隱藏挖礦病毒入侵還原錄2020-09-03事件Linux
- [原創]Drupal SA-CORE-2019-003 遠端命令執行分析2019-02-25
- web效能之資源載入時間分析【Resource Timing】【原創】2020-04-03Web
- 【原創】Linux虛擬化KVM-Qemu分析(八)之virtio初探2021-01-24Linux
- 原創文章檢測工具,檢測原創文章,過不了原創賬號的原因在這2020-06-29
- 自媒體原創太難?這4個原創技巧,讓你的文章原創質量翻倍2022-06-23
- 【原創】Linux虛擬化KVM-Qemu分析(九)之virtio裝置2021-02-13Linux
- 【原創】Linux虛擬化KVM-Qemu分析(十)之virtio驅動2021-02-24Linux
- 二分查詢演算法詳講(三種版本寫法)原創2024-05-28演算法
- [原創]Brida操作指南2019-01-16
- 【原創】Linux虛擬化KVM-Qemu分析(六)之中斷虛擬化2020-11-21Linux
- 【原創】Linux虛擬化KVM-Qemu分析(三)之KVM原始碼(1)2020-09-12Linux原始碼
- 【原創】Linux虛擬化KVM-Qemu分析(七)之timer虛擬化2020-12-05Linux
- [原創]請問需求捕獲、需求分析、系統分析之間的關係是怎樣的?2019-06-24
- 演算法分析2024-10-09演算法
- 【原創】Linux虛擬化KVM-Qemu分析(四)之CPU虛擬化(2)2020-10-11Linux
- [原創]Blowfish Cipher淺析2020-01-16
- RSA及其證明 [原創]2021-09-14
- 2024.4.17 需求分析創意2024-04-18
- 【原創】Linux中斷子系統(一)-中斷控制器及驅動分析2020-05-31Linux
- 【原創】Linux虛擬化KVM-Qemu分析(二)之ARMv8虛擬化2020-08-29Linux
- 【原創】Linux虛擬化KVM-Qemu分析(五)之記憶體虛擬化2020-11-07Linux記憶體
- 原創文章檢測工具,原創文章檢測軟體,檢測文章相似度2020-06-15
- 文章原創度檢測工具,可以讓自媒體賬號過原創嗎?2020-06-29
- 文章原創度檢測軟體,增加你原創賬號透過機率2020-06-08
- 視訊偽原創消重,搬運視訊怎麼做成原創視訊2020-10-15
- 引導分析原則2018-11-16