File Compare Utility 3.0.002

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

作者:xikug
Email: xikug@163.com
難度:中
目標:File Compare Utility 3.0.002
      開發必備的檔案比較工具,很好用。。。

型別:分析演算法,寫出序號產生器

啊。。。這個軟體的作者居然是Walter Oney,我的偶像啊。。。對作業系統底層如此

的瞭解,功力如此的深厚。。。。省略N字。。。

這個軟體比較老了,我想不會給作者造成什麼經濟損失吧。。。(呵呵。。。剛剛看

了他的主頁,上面還有這個軟體了)

http://www.oneysoft.com/

大師不愧為大師啊,跟蹤分析完大師軟體,使我又學到了一點加密演算法知識。。。
大師的註冊碼演算法跟一般的軟體註冊碼演算法不同,一般的軟體比較註冊碼的方法是根

據某一項(如:硬體標識碼或使用者輸入Name),計算出正確的註冊碼,再與
你輸入的註冊碼比較,如果相同就註冊成功,如果不同就不給註冊。。。這種方法又

分明文或密文比較。。。

而這個軟體的註冊碼演算法是不同的。。。我也是追了幾次才追出來。。。,我第一次

遇到這種形式的註冊演算法。。。怎麼個不同法?哦。。。慢慢來,如果你有興趣的話

,我帶你去發現其中的秘密。。。

Cracker的最高境界就是分析演算法,寫出序號產生器
費話少說,拿出工具SoftIce。。。

先註冊看看。。。哦。。。彈出一個訊息框

於是,下斷點messageboxa

向上找。。。找到下面這一段。。。。


00408F8B  |> 8D8D 0CFFFFFF  /LEA ECX,DWORD PTR SS:[EBP-F4]
00408F91  |. E8 1D800100    |CALL FCOMPARE.00420FB3
00408F96  |. 83F8 01        |CMP EAX,1
00408F99  |. 75 2A          |JNZ SHORT FCOMPARE.00408FC5
00408F9B  |. 8B45 E8        |MOV EAX,DWORD PTR SS:[EBP-18]
00408F9E  |. 8B4D E0        |MOV ECX,DWORD PTR SS:[EBP-20]
00408FA1  |. 50             |PUSH EAX
00408FA2  |. 8B55 E4        |MOV EDX,DWORD PTR SS:[EBP-1C]
00408FA5  |. 51             |PUSH ECX
00408FA6  |. 52             |PUSH EDX
00408FA7  |. E8 54020000    |CALL FCOMPARE.00409200                  ;  關

鍵CAll
00408FAC  |. 83C4 0C        |ADD ESP,0C
00408FAF  |. 85C0           |TEST EAX,EAX
00408FB1  |. 75 31          |JNZ SHORT FCOMPARE.00408FE4
00408FB3  |. 6A 11          |PUSH 11                                 ; 

/Arg2 = 00000011
00408FB5  |. A1 DC5D4400    |MOV EAX,DWORD PTR DS:[445DDC]           ; |
00408FBA  |. 50             |PUSH EAX                                ; 

|Arg1 => 0012F4B4 ASCII "(yC"
00408FBB  |. E8 706B0000    |CALL FCOMPARE.0040FB30                  ; 

FCOMPARE.0040FB30  這裡會彈出註冊失敗的訊息框
00408FC0  |. 83C4 08        |ADD ESP,8
00408FC3  |.^EB C6          JMP SHORT FCOMPARE.00408F8B


看到關鍵Call了嗎了嗎?他就是計算註冊碼,的比較。。。
跟進。。。

00409200  /$ 56             PUSH ESI
00409201  |. 57             PUSH EDI
00409202  |. 33F6           XOR ESI,ESI
00409204  |. 8B7C24 14      MOV EDI,DWORD PTR SS:[ESP+14]
00409208  |. 57             PUSH EDI                                 ; 

/String
00409209  |. FF15 48A84400  CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; 

lstrlenA
0040920F  |. 83F8 08        CMP EAX,8
00409212  |. 74 05          JE SHORT FCOMPARE.00409219               ;  注

冊碼位數不等於8,掛
00409214  |. 33C0           XOR EAX,EAX
00409216  |. 5F             POP EDI
00409217  |. 5E             POP ESI
00409218  |. C3             RETN
00409219  |> 8A07           MOV AL,BYTE PTR DS:[EDI]         ; 這一

段把註冊碼轉成數字放在ESI中
0040921B  |. 47             INC EDI
0040921C  |. 84C0           TEST AL,AL
0040921E  |. 74 3A          JE SHORT FCOMPARE.0040925A
00409220  |> C1E6 04        /SHL ESI,4
00409223  |. 3C 30          |CMP AL,30
00409225  |. 7C 0C          |JL SHORT FCOMPARE.00409233
00409227  |. 3C 39          |CMP AL,39
00409229  |. 7F 08          |JG SHORT FCOMPARE.00409233
0040922B  |. 0FBEC0         |MOVSX EAX,AL
0040922E  |. 83E8 30        |SUB EAX,30
00409231  |. EB 1E          |JMP SHORT FCOMPARE.00409251
00409233  |> 3C 61          |CMP AL,61
00409235  |. 7C 0C          |JL SHORT FCOMPARE.00409243
00409237  |. 3C 66          |CMP AL,66
00409239  |. 7F 08          |JG SHORT FCOMPARE.00409243
0040923B  |. 0FBEC0         |MOVSX EAX,AL
0040923E  |. 83E8 57        |SUB EAX,57
00409241  |. EB 0E          |JMP SHORT FCOMPARE.00409251
00409243  |> 3C 41          |CMP AL,41
00409245  |. 7C 3E          |JL SHORT FCOMPARE.00409285
00409247  |. 3C 46          |CMP AL,46
00409249  |. 7F 3A          |JG SHORT FCOMPARE.00409285
0040924B  |. 0FBEC0         |MOVSX EAX,AL
0040924E  |. 83E8 37        |SUB EAX,37
00409251  |> 03F0           |ADD ESI,EAX
00409253  |. 8A07           |MOV AL,BYTE PTR DS:[EDI]
00409255  |. 47             |INC EDI
00409256  |. 84C0           |TEST AL,AL
00409258  |.^75 C6          JNZ SHORT FCOMPARE.00409220
0040925A  |> 8B4424 10      MOV EAX,DWORD PTR SS:[ESP+10]
0040925E  |. 50             PUSH EAX
0040925F  |. E8 3CFFFFFF    CALL FCOMPARE.004091A0      ;這

裡就是計算公司的關鍵CALL
00409264  |. 83C4 04        ADD ESP,4
00409267  |. 8BF8           MOV EDI,EAX
00409269  |. 8B4424 0C      MOV EAX,DWORD PTR SS:[ESP+C]
0040926D  |. 50             PUSH EAX
0040926E  |. E8 2DFFFFFF    CALL FCOMPARE.004091A0                      ;這

裡就是計算姓名的關鍵CALL
00409273  |. 83C4 04        ADD ESP,4
00409276  |. 03F8           ADD EDI,EAX
00409278  |. 03FE           ADD EDI,ESI
0040927A  |. 47             INC EDI
0040927B  |. 83FF 01        CMP EDI,1
0040927E  |. 5F             POP EDI
0040927F  |. 1BC0           SBB EAX,EAX
00409281  |. 5E             POP ESI
00409282  |. F7D8           NEG EAX
00409284  |. C3             RETN
00409285  |> 33C0           XOR EAX,EAX
00409287  |. 5F             POP EDI
00409288  |. 5E             POP ESI
00409289  . C3             RETN


分析得出:

如果輸入的註冊碼不是8位,掛。。。這個不重要。。。因為我們寫序號產生器的話不需要

輸入
計算公司和姓名的關鍵CALL是一樣的

再跟進。。。,分析得出:公司+姓名+註冊號+1=0,於是得

註冊碼=-1-F(姓名)-F(公司)

004091A0  /$ 56             PUSH ESI
004091A1  |. 57             PUSH EDI
004091A2  |. 33FF           XOR EDI,EDI
004091A4  |. 8B7424 0C      MOV ESI,DWORD PTR SS:[ESP+C]
004091A8  |. 56             PUSH ESI                                 ; 

/String
004091A9  |. FF15 48A84400  CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; 

lstrlenA
004091AF  |. 83F8 04        CMP EAX,4
004091B2  |. 72 16          JB SHORT FCOMPARE.004091CA
004091B4  |. 8BC8           MOV ECX,EAX
004091B6  |. C1E9 02        SHR ECX,2
004091B9  |. 8D148D 0000000>LEA EDX,DWORD PTR DS:[ECX*4]
004091C0  |. 2BC2           SUB EAX,EDX
004091C2  |> 033E           /ADD EDI,DWORD PTR DS:[ESI]
004091C4  |. 83C6 04        |ADD ESI,4
004091C7  |. 49             |DEC ECX
004091C8  |.^75 F8          JNZ SHORT FCOMPARE.004091C2
004091CA  |> 83F8 02        CMP EAX,2
004091CD  |. 72 1C          JB SHORT FCOMPARE.004091EB
004091CF  |. 8BD0           MOV EDX,EAX
004091D1  |. C1EA 01        SHR EDX,1
004091D4  |. 8D0C55 0000000>LEA ECX,DWORD PTR DS:[EDX*2]
004091DB  |. 2BC1           SUB EAX,ECX
004091DD  |> 33C9           /XOR ECX,ECX
004091DF  |. 83C6 02        |ADD ESI,2
004091E2  |. 66:8B4E FE     |MOV CX,WORD PTR DS:[ESI-2]
004091E6  |. 03F9           |ADD EDI,ECX
004091E8  |. 4A             |DEC EDX
004091E9  |.^75 F2          JNZ SHORT FCOMPARE.004091DD
004091EB  |> 83F8 01        CMP EAX,1
004091EE  |. 72 0A          JB SHORT FCOMPARE.004091FA
004091F0  |> 33C9           /XOR ECX,ECX
004091F2  |. 8A0E           |MOV CL,BYTE PTR DS:[ESI]
004091F4  |. 46             |INC ESI
004091F5  |. 03F9           |ADD EDI,ECX
004091F7  |. 48             |DEC EAX
004091F8  |.^75 F6          JNZ SHORT FCOMPARE.004091F0
004091FA  |> 8BC7           MOV EAX,EDI
004091FC  |. 5F             POP EDI
004091FD  |. 5E             POP ESI
004091FE  . C3             RETN


把這上面的程式碼翻譯成Delphi程式碼為:
var
  I, iLen: Integer;

  t: DWORD;

begin
  iLen := Length(s);

  t := 0;
  if iLen <= 4 then
  begin
    for I := iLen downto 1 do
    begin
      t := t shl 8 + Ord(S[I]);
    end
  end
  else
  begin
    for I := 4 downto 1 do
    begin
      t := t shl 8 + Ord(S[I]);
    end;

    for I := iLen downto 5 do
    begin
      t := t + Ord(S[I]);
    end
  end;

於是我們可以根據這個寫出序號產生器了。。。

寫得如此詳細,不知道你們看懂沒有。。。

我輸入的Name: xikug, Company: weway, 得到的註冊碼是: 291D3030,點OK,哈哈。

。。註冊成功

你們也可以試試。。。

題外話:這種演算法其實是相當好的,還有改進的餘地,如果再改進一點點這個軟體就

不太好破了。。。大師作品果然精良。。

相關文章