• 标 题:File Compare Utility 3.0.002
  • 作 者:西方不敢很帅
  • 时 间:2004-1-16 周五, 下午3:21
  • 链 接:http://bbs.pediy.com

作者: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,哈哈。

。。注册成功

你们也可以试试。。。

题外话:这种算法其实是相当好的,还有改进的余地,如果再改进一点点这个软件就

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