小李登錄檔大師 v1.41 註冊演算法分析--獻給 LILITH 和解密演算法初學者 (10千字)

看雪資料發表於2001-11-09

小李登錄檔大師 v1.41 註冊演算法分析--獻給 LILITH 和解密演算法初學者

作者:PaulYoung ( 屬於 China Cracking Group )
難度:0 級 (共分 10 級,0 級最易)
軟體:小李登錄檔大師 v1.41
下載:http://www.csdn.net/soft/openfile.asp?kind=1&id=14499  ( 456 KB )
簡介:看軟體名就知道幹啥用的了
工具:SoftICE V4.05
日期:2001.11.07

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

  今天,“理你死”??!!哦……不是,是“LILITH”(MM ?!  :)~  No, 靚仔一名 :( ),在看雪論壇發篇關於小李登錄檔大師 v1.41 的註冊碼 D 註冊碼大法,可惜此兄太懶,不願跟演算法,無奈,就讓我這個當師父的來代勞吧。
  這個軟體是明碼比較,非常傻瓜的那種,如何取註冊碼, LILITH 兄已經說得非常清楚了,在此我就省略那些無關枝節吧,重點分析它的註冊演算法。

  Let's Go!! 想學演算法的 Cracker 們!

  為方便大家理解,以我的註冊序列號" 1D6D-17E5 "和輸入的使用者名稱是" CCG "為例,說說這個軟體的註冊演算法。跟蹤法請看 LILITH 大俠的文章 :) 。

== 1 ==

* Possible StringData Ref from Code Obj ->"key"
                                  |
:00490EF1 BAD4104900              mov edx, 004910D4
:00490EF6 E88562FEFF              call 00477180
:00490EFB A1D4034A00              mov eax, dword ptr [004A03D4]
:00490F00 8B00                    mov eax, dword ptr [eax]
:00490F02 E8D95BFEFF              call 00476AE0
:00490F07 8D55E8                  lea edx, dword ptr [ebp-18]
:00490F0A A1EC024A00              mov eax, dword ptr [004A02EC]
:00490F0F 8B00                    mov eax, dword ptr [eax]
:00490F11 E88673F7FF              call 0040829C                //取序列號"1D6D-17E5"
:00490F16 8D45E8                  lea eax, dword ptr [ebp-18]
:00490F19 50                      push eax
:00490F1A 8D55E4                  lea edx, dword ptr [ebp-1C]
:00490F1D 8B83DC020000            mov eax, dword ptr [ebx+000002DC]
:00490F23 E89403FAFF              call 004312BC
:00490F28 8B55E4                  mov edx, dword ptr [ebp-1C]
:00490F2B 58                      pop eax
:00490F2C E8372EF7FF              call 00403D68                //取使用者名稱"CCG"
:00490F31 8B45E8                  mov eax, dword ptr [ebp-18]
:00490F34 8D55EC                  lea edx, dword ptr [ebp-14]
:00490F37 E86875F7FF              call 004084A4  //把序列號小寫和使用者名稱連成一串"1d6d-17e5CCG"
:00490F3C 8B55EC                  mov edx, dword ptr [ebp-14]
:00490F3F A174014A00              mov eax, dword ptr [004A0174]
:00490F44 8B00                    mov eax, dword ptr [eax]
:00490F46 8B8064030000            mov eax, dword ptr [eax+00000364]
:00490F4C E8EB2DFEFF              call 00473D3C                //開始計算,F8跟進
:00490F51 8D45FC                  lea eax, dword ptr [ebp-04]  //下面都是些老掉牙的東東,不用多說
:00490F54 8B1574014A00            mov edx, dword ptr [004A0174]
:00490F5A 8B12                    mov edx, dword ptr [edx]
:00490F5C 8B9264030000            mov edx, dword ptr [edx+00000364]
:00490F62 8B524C                  mov edx, dword ptr [edx+4C]
:00490F65 E80E2CF7FF              call 00403B78
:00490F6A 8D55E0                  lea edx, dword ptr [ebp-20]
:00490F6D 8B83E0020000            mov eax, dword ptr [ebx+000002E0]
:00490F73 E84403FAFF              call 004312BC
:00490F78 8B45E0                  mov eax, dword ptr [ebp-20]
:00490F7B 8B55FC                  mov edx, dword ptr [ebp-04]
:00490F7E E8ED2EF7FF              call 00403E70             
:00490F83 7567                    jne 00490FEC               
:00490F85 8D55D8                  lea edx, dword ptr [ebp-28]
:00490F88 8B83DC020000            mov eax, dword ptr [ebx+000002DC]
:00490F8E E82903FAFF              call 004312BC
:00490F93 8B4DD8                  mov ecx, dword ptr [ebp-28]
:00490F96 8D45DC                  lea eax, dword ptr [ebp-24]

* Possible StringData Ref from Code Obj ->"小李登錄檔大師已經註冊給"
                                  |
:00490F99 BAE0104900              mov edx, 004910E0

== 2 ==

:00473D3C 55                      push ebp
:00473D3D 8BEC                    mov ebp, esp
:00473D3F 83C4F8                  add esp, FFFFFFF8
:00473D42 53                      push ebx
:00473D43 56                      push esi
:00473D44 33C9                    xor ecx, ecx
:00473D46 894DF8                  mov dword ptr [ebp-08], ecx
:00473D49 8955FC                  mov dword ptr [ebp-04], edx
:00473D4C 8BD8                    mov ebx, eax
:00473D4E 8B45FC                  mov eax, dword ptr [ebp-04]
:00473D51 E8BE01F9FF              call 00403F14
:00473D56 33C0                    xor eax, eax
:00473D58 55                      push ebp
:00473D59 68E33D4700              push 00473DE3
:00473D5E 64FF30                  push dword ptr fs:[eax]
:00473D61 648920                  mov dword ptr fs:[eax], esp
:00473D64 33F6                    xor esi, esi
:00473D66 8D4350                  lea eax, dword ptr [ebx+50]
:00473D69 8B55FC                  mov edx, dword ptr [ebp-04]
:00473D6C E8C3FDF8FF              call 00403B34
:00473D71 8B4350                  mov eax, dword ptr [ebx+50]
:00473D74 E8E7FFF8FF              call 00403D60    //取字串"1d6d-17e5CCG"長度,儲存到 eax
:00473D79 85C0                    test eax, eax
:00473D7B 7E20                    jle 00473D9D
:00473D7D 8B4350                  mov eax, dword ptr [ebx+50]
:00473D80 E8DBFFF8FF              call 00403D60    //取字串"1d6d-17e5CCG"長度,儲存到 eax
:00473D85 85C0                    test eax, eax
:00473D87 7C14                    jl 00473D9D
:00473D89 40                      inc eax          // eax+1 ,即字串長度加1,就是下面的迴圈次數
:00473D8A 33D2                    xor edx, edx    // edx 初始值為 0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00473D9B(C)
|
:00473D8C 8B4B50                  mov ecx, dword ptr [ebx+50]      //載入字串
:00473D8F 0FB64C11FF              movzx ecx, byte ptr [ecx+edx-01] //依次取字串以ASCII形式儲存到 ecx ,第一次迴圈值為0
:00473D94 03F1                    add esi, ecx                    //與上一次迴圈後得到的累加值相加
:00473D96 037354                  add esi, dword ptr [ebx+54]      //當前字元 ASCII 值 + 57791
:00473D99 42                      inc edx                        // edx 遞增
:00473D9A 48                      dec eax                        // eax 即迴圈次數遞減
:00473D9B 75EF                    jne 00473D8C                    // eax>0 ?未算完,繼續吧…… :(

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00473D7B(C), :00473D87(C)
|
:00473D9D 8D55F8                  lea edx, dword ptr [ebp-08]
:00473DA0 8BC6                    mov eax, esi          //把累加值"752094"放到 eax
:00473DA2 E87D48F9FF              call 00408624
:00473DA7 FF7344                  push [ebx+44]
:00473DAA FF75F8                  push [ebp-08]
:00473DAD FF7348                  push [ebx+48]
:00473DB0 8D45F8                  lea eax, dword ptr [ebp-08]
:00473DB3 BA03000000              mov edx, 00000003    //把 edx 置值為3,即下面迴圈的次數
:00473DB8 E86300F9FF              call 00403E20        //再次運算,F8進入
:00473DBD 8D434C                  lea eax, dword ptr [ebx+4C]

== 3 ==

:00403E20 53                      push ebx
:00403E21 56                      push esi
:00403E22 52                      push edx
:00403E23 50                      push eax
:00403E24 89D3                    mov ebx, edx
:00403E26 31C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403E34(C)
|
:00403E28 8B4C9410                mov ecx, dword ptr [esp+4*edx+10] -----
:00403E2C 85C9                    test ecx, ecx                          |
:00403E2E 7403                    je 00403E33                            |
:00403E30 0341FC                  add eax, dword ptr [ecx-04]            |迴圈 3 次,
                                                                        |在"752094"前後分別
* Referenced by a (U)nconditional or (C)onditional Jump at Address:      |加上"8" , "2"
|:00403E2E(C)                                                            |
|                                                                        |
:00403E33 4A                      dec edx      //迴圈次數遞減        |
:00403E34 75F2                    jne 00403E28    -----------------------
:00403E36 E869FDFFFF              call 00403BA4
:00403E3B 50                      push eax
:00403E3C 89C6                    mov esi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403E53(C)
|
:00403E3E 8B449C14                mov eax, dword ptr [esp+4*ebx+14] -------------
:00403E42 89F2                    mov edx, esi                                  |
:00403E44 85C0                    test eax, eax                                  |
:00403E46 740A                    je 00403E52                                    |
:00403E48 8B48FC                  mov ecx, dword ptr [eax-04]                    |
:00403E4B 01CE                    add esi, ecx                                  |再迴圈3次,
:00403E4D E8F6EAFFFF              call 00402948                                  |檢查註冊碼格式
                                                 |
* Referenced by a (U)nconditional or (C)onditional Jump at Address:              |
|:00403E46(C)                                     |    
|                                         |
:00403E52 4B                      dec ebx      //迴圈次數遞減            |
:00403E53 75E9                    jne 00403E3E-----------------------------------
:00403E55 5A                      pop edx
:00403E56 58                      pop eax
:00403E57 85D2                    test edx, edx
:00403E59 7403                    je 00403E5E
:00403E5B FF4AF8                  dec [edx-08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00403E59(C)
|
:00403E5E E8D1FCFFFF              call 00403B34    //至此,正確的註冊碼已經生成!
:00403E63 5A                      pop edx
:00403E64 5E                      pop esi
:00403E65 5B                      pop ebx
:00403E66 58                      pop eax
:00403E67 8D2494                  lea esp, dword ptr [esp+4*edx]
:00403E6A FFE0                    jmp eax
:00403E6C C3                      ret


演算法總結:
  1、軟體取你的硬碟序列號並轉換成十六進位制,然後在中間加上"-",作為你的註冊序列號(此步可忽略);
  2、將你的註冊序列號轉換成小寫並與使用者名稱組成一個字串;
  3、將字串的每個字元都轉換成 ASCII ,並逐個迴圈與 57791 相加並將每次的值累加,迴圈次數是字串長度加一,初次迴圈的累加值為 57791 ,直到取完所有字元為止,如以"1d6d-17e5CCG"為例,計算公式為:57791+(49+57791)+(100+57791)+(54+57791)+(100+57791)+(45+57791)+(49+57791)+(55+57791)+(101+57791)+(53+57791)+(67+57791)+(67+57791)+(71+57791)=(49+100+54+100+45+49+55+101+53+67+67+71)+(13*57791)=752094
  4、最後,再在752094前後分別加上8、2,變成 87520942 ,就是正確的序列號了。

  是不是好弱智???序號產生器就有勞偽裝者[CCG]教大家如何寫了,還有我,呵……

相關文章