演算法分析: <獻給初學者> 之二 (7千字)

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

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

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

▲軟體名稱▲解除安裝精靈v1.22
▲下載地址▲
http://www.softreg.com/download.asp?id={C3347316-B547-4DDC-80C3-884F2FBF3BA8}

▲軟體簡介▲
  已經厭倦了WINDOWS控制皮膚那個功能很弱的“新增/刪除程式”了嗎?你是否發現你的電腦裡面有些軟體無法解除安裝?****的智慧解除安裝功能可以乾淨徹底地解除安裝軟體,包括那些無法正常解除安裝的程式它都可以幫您解除安裝。

▲破解難度▲ 非明碼,較難。(此軟體非演算法不可解。當然,除爆破!)

▲演算法難度▲ 較難

  請隨我來一步步看看它的演算法吧!!LET'S GO!!!!!!

  下斷點BPX HMEMCPY,然後填寫註冊名與註冊碼(註冊名任意,註冊碼必須8位,不能多也不能少。為什麼?請看下邊嘛!)。當然,在不知道的情況下,可以任意填寫註冊碼。然後確定,然後中斷,然後清斷,然後19次F12(為什麼19次?不會吧,這個問題不用回答了吧?),會到達下邊:

:00403BF0 E8ED580100 call 004194E2
:00403BF5 8D4C2414 lea ecx, dword ptr [esp+14] //我們到達這裡
:00403BF9 8DBE98000000 lea edi, dword ptr [esi+00000098]
:00403BFF 51 push ecx
:00403C00 8BCF mov ecx, edi
:00403C02 E8DB580100 call 004194E2
:00403C07 8B542414 mov edx, dword ptr [esp+14]

* Possible Reference to Dialog:
|
:00403C0B 6874134300 push 00431374
:00403C10 52 push edx
:00403C11 E8AB830000 call 0040BFC1
:00403C16 83C408 add esp, 00000008
:00403C19 85C0 test eax, eax
:00403C1B 0F8458010000 je 00403D79
:00403C21 8B442410 mov eax, dword ptr [esp+10]

* Possible Reference to Dialog:
|
:00403C25 6874134300 push 00431374
:00403C2A 50 push eax
:00403C2B E891830000 call 0040BFC1
:00403C30 83C408 add esp, 00000008
:00403C33 85C0 test eax, eax
:00403C35 0F843E010000 je 00403D79
:00403C3B 51 push ecx
:00403C3C 8D542414 lea edx, dword ptr [esp+14]
:00403C40 8BCC mov ecx, esp
:00403C42 89642420 mov dword ptr [esp+20], esp
:00403C46 52 push edx
:00403C47 E89F7D0100 call 0041B9EB
:00403C4C 8B0D70134300 mov ecx, dword ptr [00431370]
:00403C52 E8D9FCFFFF call 00403930 //F8跟入
:00403C57 3BC3 cmp eax, ebx
:00403C59 0F84DC000000 je 00403D3B //跳則死

================進入雷區嘍================

:00403930 64A100000000 mov eax, dword ptr fs00000000]
:00403936 6AFF push FFFFFFFF
:00403938 6848394200 push 00423948
:0040393D 50 push eax
:0040393E 64892500000000 mov dword ptr fs00000000], esp
:00403945 56 push esi
:00403946 8B442414 mov eax, dword ptr [esp+14]
:0040394A 8B48F8 mov ecx, dword ptr [eax-08]
:0040394D 83F908 cmp ecx, 00000008 //註冊碼與8比較
:00403950 7425 je 00403977 //不等就不跳,不跳就死嘍!
:00403952 8D4C2414 lea ecx, dword ptr [esp+14]
:00403956 C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:0040395E E813830100 call 0041BC76
:00403963 33C0 xor eax, eax
:00403965 8B4C2404 mov ecx, dword ptr [esp+04]
:00403969 64890D00000000 mov dword ptr fs00000000], ecx
:00403970 5E pop esi
:00403971 83C40C add esp, 0000000C
:00403974 C20400 ret 0004


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403950(C)
|
:00403977 8A10 mov dl, byte ptr [eax] //取註冊碼第一位字母的16 進位制值放入DL

:00403979 0FBE4802 movsx ecx, byte ptr [eax+02] //取註冊碼第三位字母的16 進位制值,賦給ECX

:0040397D 0FBEF2 movsx esi, dl //第一位值賦給ESI

:00403980 8D4C31A0 lea ecx, dword ptr 計算結果儲存到ECX

:00403984 83F907 cmp ecx, 00000007 //比較剛才計算的結果是否等於7
:00403987 7425 je 004039AE //不等就不跳,那就死嘍!
:00403989 8D4C2414 lea ecx, dword ptr [esp+14]
:0040398D C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:00403995 E8DC820100 call 0041BC76
:0040399A 33C0 xor eax, eax
:0040399C 8B4C2404 mov ecx, dword ptr [esp+04]
:004039A0 64890D00000000 mov dword ptr fs00000000], ecx
:004039A7 5E pop esi
:004039A8 83C40C add esp, 0000000C
:004039AB C20400 ret 0004 //不跳就從這裡退出此CALL了,
那就GAME OVER了!(下同)


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403987(C)
|
:004039AE 8A4801 mov cl, byte ptr [eax+01] //取第二位字母的16進位制 值放入CL

:004039B1 0FBE7003 movsx esi, byte ptr [eax+03] //取第四位字母的16進位制
值,賦給ESI

:004039B5 0FBEC9 movsx ecx, cl //CL值送ECX

:004039B8 8D4C0EA0 lea ecx, dword ptr [esi+ecx-60]//計算結果存入ECX

:004039BC 83F908 cmp ecx, 00000008 //結果與8比較
:004039BF 7425 je 004039E6 //不等就死嘍!!!
:004039C1 8D4C2414 lea ecx, dword ptr [esp+14]
:004039C5 C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:004039CD E8A4820100 call 0041BC76
:004039D2 33C0 xor eax, eax
:004039D4 8B4C2404 mov ecx, dword ptr [esp+04]
:004039D8 64890D00000000 mov dword ptr fs00000000], ecx
:004039DF 5E pop esi
:004039E0 83C40C add esp, 0000000C
:004039E3 C20400 ret 0004


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004039BF(C)
|
:004039E6 8A4804 mov cl, byte ptr [eax+04] //取第五位字母值入CL

:004039E9 0FBE7006 movsx esi, byte ptr [eax+06] //取第七位字母值入ESI
:004039ED 0FBEC9 movsx ecx, cl //CL送ECX
:004039F0 8D4C0EA0 lea ecx, dword ptr [esi+ecx-60]//同上計算,結果入ECX
:004039F4 83F909 cmp ecx, 00000009 //結果與9比較
:004039F7 7425 je 00403A1E //不等就死嘍!!!
:004039F9 8D4C2414 lea ecx, dword ptr [esp+14]
:004039FD C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:00403A05 E86C820100 call 0041BC76
:00403A0A 33C0 xor eax, eax
:00403A0C 8B4C2404 mov ecx, dword ptr [esp+04]
:00403A10 64890D00000000 mov dword ptr fs00000000], ecx
:00403A17 5E pop esi
:00403A18 83C40C add esp, 0000000C
:00403A1B C20400 ret 0004


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004039F7(C)
|
:00403A1E 8A4805 mov cl, byte ptr [eax+05] //取第六位字母值入CL
:00403A21 8A4007 mov al, byte ptr [eax+07] //取第八位字母值入AL
:00403A24 0FBEF0 movsx esi, al //AL 送 ESI
:00403A27 0FBEC9 movsx ecx, cl //CL 送 ECX
:00403A2A 8D4C0EA0 lea ecx, dword ptr [esi+ecx-60]//同上計算,結果入ECX
:00403A2E 83F90A cmp ecx, 0000000A //結果與10比較
:00403A31 7425 je 00403A58 //不等就死嘍!
:00403A33 8D4C2414 lea ecx, dword ptr [esp+14]
:00403A37 C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:00403A3F E832820100 call 0041BC76
:00403A44 33C0 xor eax, eax
:00403A46 8B4C2404 mov ecx, dword ptr [esp+04]
:00403A4A 64890D00000000 mov dword ptr fs00000000], ecx
:00403A51 5E pop esi
:00403A52 83C40C add esp, 0000000C
:00403A55 C20400 ret 0004


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403A31(C)
|
:00403A58 0FBEC0 movsx eax, al //第八位值送EAX
:00403A5B 0FBECA movsx ecx, dl //第一位值送ECX
:00403A5E C744240CFFFFFFFF mov [esp+0C], FFFFFFFF
:00403A66 8D5408A0 lea edx, dword ptr [eax+ecx-60]//計算,結果入EDX
:00403A6A 8D4C2414 lea ecx, dword ptr [esp+14]
:00403A6E 83FA08 cmp edx, 00000008 //結果等於8嗎?
:00403A71 7419 je 00403A8C //不等就死嘍!!!!
:00403A73 E8FE810100 call 0041BC76
:00403A78 33C0 xor eax, eax
:00403A7A 8B4C2404 mov ecx, dword ptr [esp+04]
:00403A7E 64890D00000000 mov dword ptr fs00000000], ecx
:00403A85 5E pop esi
:00403A86 83C40C add esp, 0000000C
:00403A89 C20400 ret 0004

▲演算法總結▲

  從上邊的分析可以看出,此軟體的演算法是這樣的:

1、輸入的註冊碼必須是8位,且註冊碼與註冊名無關。(但是,不能讓註冊名空)

2、涉及的計算公式是統一的,x先後取值為7、8、9、10、8。

3、具體計算過程:
①註冊碼的第一位16進位制值+第三位16進位制值-60=7
②註冊碼的第二位16進位制值+第四位16進位制值-60=8
③註冊碼的第五位16進位制值+第七位16進位制值-60=9
④註冊碼的第六位16進位制值+第八位16進位制值-60=10
⑤註冊碼的第一位16進位制值+第八位16進位制值-60=8

所以,只要滿足以上條件,就可以任意註冊嘍!!!!!!!

那就隨便編一個註冊碼吧:12666337。當然,50283763也行啊!!呵呵,簡直太多啦!!!

呵呵,看來這個軟體拿來編寫序號產生器就合適不過了。呵呵。。。。。。。。


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

相關文章