-
-
[原创]cytom!c's的keyfile算法分析
-
发表于: 2006-8-7 23:44 5695
-
【文章标题】: cytom!c's的keyfile算法分析
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【保护方式】: keyfile
【编写语言】: Borland Delphi 2.0
【使用工具】: Od,peid
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
用peid查壳,无壳,运行有出错提示。用OD载入,通过查找字符串“key file is empty!”,在[00426572]下断点,可以看出,此keyfile文件名为ctm_cm02.key,用文本文件编辑器建立这个文件,内容为字符串1234,运行,断下
00426572 . BA 4C674200 mov edx, 0042674C ; ctm_cm02.key
00426577 . 8D85 A8FEFEFF lea eax, [ebp+FFFEFEA8]
0042657D . E8 3FD8FDFF call 00403DC1
00426582 . BA 01000000 mov edx, 1
00426587 . 8D85 A8FEFEFF lea eax, [ebp+FFFEFEA8]
0042658D . E8 1EDCFDFF call 004041B0
00426592 . E8 4DC1FDFF call 004026E4 ; 如果文件不存在,返回非0
00426597 . 85C0 test eax, eax
00426599 . 0F85 66010000 jnz 00426705 ; 跳就完蛋
0042659F . 8D85 A8FEFEFF lea eax, [ebp+FFFEFEA8]
004265A5 . E8 5AD9FDFF call 00403F04 ; EAX返回文件长度
004265AA . E8 F9C0FDFF call 004026A8
004265AF . 8945 FC mov [ebp-4], eax ; 文件长度存入[ebp-4]
004265B2 . 837D FC 00 cmp dword ptr [ebp-4], 0 ; [ebp-4]=0 ?
004265B6 . 75 15 jnz short 004265CD ; 是,完蛋
004265B8 . BA 64674200 mov edx, 00426764 ; key file is empty!
004265BD . 8B83 B0010000 mov eax, [ebx+1B0]
004265C3 . E8 CCB6FEFF call 00411C94
004265C8 . E9 28010000 jmp 004266F5
004265CD > 817D FC 00000>cmp dword ptr [ebp-4], 10000 ; [ebp-4]<=10000H ?
004265D4 . 7E 07 jle short 004265DD ; 是,跳
004265D6 . C745 FC 00000>mov dword ptr [ebp-4], 10000 ; UNICODE "=::=::\"
004265DD > 6A 00 push 0
004265DF . 8D95 FCFFFEFF lea edx, [ebp+FFFEFFFC]
004265E5 . 8B4D FC mov ecx, [ebp-4]
004265E8 . 8D85 A8FEFEFF lea eax, [ebp+FFFEFEA8]
004265EE . E8 71D8FDFF call 00403E64
004265F3 . E8 B0C0FDFF call 004026A8
004265F8 . 53 push ebx
004265F9 . 57 push edi
004265FA . 56 push esi
004265FB . 8D75 FC lea esi, [ebp-4]
004265FE . 8B0E mov ecx, [esi]
00426600 . 8DB5 FCFFFEFF lea esi, [ebp+FFFEFFFC] ; 字符首地址入ESI
00426606 . 8DBD FBFFFEFF lea edi, [ebp+FFFEFFFB]
0042660C . 31C0 xor eax, eax ; EAX清0
0042660E . 83CA FF or edx, FFFFFFFF
00426611 . 31DB xor ebx, ebx
00426613 . 40 inc eax ; EAX=1
00426614 . F7D2 not edx
00426616 > 8A1C16 mov bl, [esi+edx] ; 缓冲区中的每一字节依次入BL
00426619 . 84DB test bl, bl ; BL是否为空,是,跳
0042661B . 74 29 je short 00426646
0042661D . E8 16000000 call 00426638
00426622 . 52 push edx
00426623 . F7E3 mul ebx ; EAX*EBX
00426625 . 5A pop edx
00426626 . 35 326D5463 xor eax, 63546D32 ; EAX与63546D32异或
0042662B . FEC2 inc dl
0042662D . 39CA cmp edx, ecx ; EDX=文件长度 ?
0042662F . 74 42 je short 00426673 ; 相等,跳
00426631 . 80FA FF cmp dl, 0FF ; DL=0FF ?
00426634 . 74 3D je short 00426673 ; 相等,跳
00426636 .^ EB DE jmp short 00426616
通过跟踪发现,不管是[0042662F],还是[00426634],只要这两句跳,最终都完蛋,所以只能是[0042661B]这句跳,才能有可能成功。不难分析,要想使这句跳,文件内容的中间某一字节必须为'0x00'。重新用十六进制编辑器建立如下内容:bxm78 1234,中间的空格为'0x00',其它为字符。
再次运行:
00426600 . 8DB5 FCFFFEFF lea esi, [ebp+FFFEFFFC] ; 字符首地址入ESI
00426606 . 8DBD FBFFFEFF lea edi, [ebp+FFFEFFFB]
0042660C . 31C0 xor eax, eax ; EAX清0
0042660E . 83CA FF or edx, FFFFFFFF
00426611 . 31DB xor ebx, ebx
00426613 . 40 inc eax ; EAX=1
00426614 . F7D2 not edx ; EDX=0
00426616 > 8A1C16 mov bl, [esi+edx] ; 缓冲区中的每一字节依次入BL
00426619 . 84DB test bl, bl ; BL是否为空,是,跳
0042661B . 74 29 je short 00426646 ; 跳转时,我的EDX为5,EAX为A167E782
0042661D . E8 16000000 call 00426638
00426622 . 52 push edx
00426623 . F7E3 mul ebx ; EAX*EBX
00426625 . 5A pop edx
00426626 . 35 326D5463 xor eax, 63546D32 ; EAX与63546D32异或
0042662B . FEC2 inc dl ; DL+1
0042662D . 39CA cmp edx, ecx ; EDX=文件长度 ?
0042662F . 74 42 je short 00426673 ; 相等,跳
00426631 . 80FA FF cmp dl, 0FF ; DL=0FF ?
00426634 . 74 3D je short 00426673 ; 相等,跳
00426636 .^ EB DE jmp short 00426616
00426638 /$ 57 push edi
00426639 |. 8DBD F4FFFEFF lea edi, [ebp+FFFEFFF4]
0042663F |. 8B3F mov edi, [edi]
00426641 |. 881C17 mov [edi+edx], bl
00426644 |. 5F pop edi
00426645 \. C3 retn
00426646 > E8 EDFFFFFF call 00426638
0042664B . 42 inc edx ; EDX+1
0042664C . 83C2 04 add edx, 4 ; EDX+4
0042664F . 39D1 cmp ecx, edx ; EDX=文件长度 ?
00426651 . 75 20 jnz short 00426673 ; 不等,完蛋
00426653 . 83EA 04 sub edx, 4
00426656 . 85C0 test eax, eax
00426658 . 76 02 jbe short 0042665C ; EAX为0时,跳
0042665A . D1E8 shr eax, 1 ; EAX右移1位
0042665C > 3B0416 cmp eax, [esi+edx] ; EAX=文件中的最后四个字节吗?
0042665F . 75 09 jnz short 0042666A ; 不等,则完蛋
00426661 . B8 00000000 mov eax, 0
00426666 . 8907 mov [edi], eax
00426668 . EB 10 jmp short 0042667A
0042666A > B8 01000000 mov eax, 1
0042666F . 8907 mov [edi], eax
00426671 . EB 07 jmp short 0042667A
00426673 > B8 02000000 mov eax, 2
00426678 . 8907 mov [edi], eax
0042667A > 5E pop esi
0042667B . 5F pop edi
0042667C . 5B pop ebx
0042667D . 8A85 FBFFFEFF mov al, [ebp+FFFEFFFB]
00426683 . 2C 01 sub al, 1 ; Switch (cases 0..2)
00426685 . 72 08 jb short 0042668F
00426687 . 74 4A je short 004266D3
00426689 . FEC8 dec al
0042668B . 74 58 je short 004266E5
0042668D . EB 66 jmp short 004266F5
0042668F > BA 80674200 mov edx, 00426780 ; valid key file found!; Case 0 of switch 00426683
00426694 . 8B83 B0010000 mov eax, [ebx+1B0]
0042669A . E8 F5B5FEFF call 00411C94
0042669F . BA A0674200 mov edx, 004267A0 ; registered to:
……省略一部分代码
看到[0042668F]这句就知道成功了。
算法小结:
1、文件名必须为ctm_cm02.key。
2、为了叙述方便,把文件内容分为两部分,形式:第1部分'0x00'第2部分。第2部分必须为4个字节。
3、对第1部分进行运算,过程如下:
EAX=1;
for(i=0;i<第1部分长度;i++)
{ EBX=依次读入第1部分的每个字节;
EAX*=EBX;
EAX^=63546d32;
}
EAX>>1;
6、EAX的与第2部分比较,相等则成功。
我的文件内容为(十六进制):62 78 6D 37 38 00 C1 F3 B3 50
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月07日 下午 11:42:35
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]bxm第8个CrackMe,高手飘过 9370
- [原创]forgot's CRACKME 1994算法分析 6073
- [原创]**处理系统5.7注册算法分析+注册机源代码 14189
- [原创]我的第7个CrackMe 6693
- [原创]bxm的第6个CrackMe 7826