首页
社区
课程
招聘
[原创]cytom!c's的keyfile算法分析
发表于: 2006-8-7 23:44 5695

[原创]cytom!c's的keyfile算法分析

bxm 活跃值
29
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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//