作者: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,哈哈。
。。注册成功
你们也可以试试。。。
题外话:这种算法其实是相当好的,还有改进的余地,如果再改进一点点这个软件就
不太好破了。。。大师作品果然精良。。