zoukankan      html  css  js  c++  java
  • 拆解cytom!c's 的keyFile保护

    系统 : Windows xp

    程序 : cytom!c's

    程序下载地址 :http://pan.baidu.com/s/1nulAYBv

    要求 : 伪造KeyFile

    使用工具 :IDA & OD & Hex Workshop

    可在看雪论坛中查找关于此程序的破文:http://bbs.pediy.com/showthread.php?t=30229

     

    IDA载入程序,找出提示破解成功的字串“Valid Key file found!”并定位关键代码:

    00426572   .  BA 4C674200   mov     edx, 0042674C                    ;  ASCII "ctm_cm02.key"
    00426577   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
    0042657D   .  E8 3FD8FDFF   call    00403DC1
    00426582   .  BA 01000000   mov     edx, 1
    00426587   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
    0042658D   .  E8 1EDCFDFF   call    004041B0
    00426592   .  E8 4DC1FDFF   call    004026E4
    00426597   .  85C0          test    eax, eax
    00426599   .  0F85 66010000 jnz     00426705
    0042659F   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
    004265A5   .  E8 5AD9FDFF   call    00403F04                         ;  CreateFile,并获取长度
    004265AA   .  E8 F9C0FDFF   call    004026A8
    004265AF   .  8945 FC       mov     dword ptr [ebp-4], eax
    004265B2   .  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  长度为0?
    004265B6   .  75 15         jnz     short 004265CD
    004265B8   .  BA 64674200   mov     edx, 00426764                    ;  ASCII "Key file is empty!"
    004265BD   .  8B83 B0010000 mov     eax, dword ptr [ebx+1B0]
    004265C3   .  E8 CCB6FEFF   call    00411C94
    004265C8   .  E9 28010000   jmp     004266F5
    004265CD   >  817D FC 00000>cmp     dword ptr [ebp-4], 10000         ;  UNICODE "#envTSLOGsss1964=1032992"
    004265D4   .  7E 07         jle     short 004265DD
    004265D6   .  C745 FC 00000>mov     dword ptr [ebp-4], 10000         ;  UNICODE "#envTSLOGsss1964=1032992"
    004265DD   >  6A 00         push    0
    004265DF   .  8D95 FCFFFEFF lea     edx, dword ptr [ebp+FFFEFFFC]
    004265E5   .  8B4D FC       mov     ecx, dword ptr [ebp-4]
    004265E8   .  8D85 A8FEFEFF lea     eax, dword ptr [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, dword ptr [ebp-4]
    004265FE   .  8B0E          mov     ecx, dword ptr [esi]
    00426600   .  8DB5 FCFFFEFF lea     esi, dword ptr [ebp+FFFEFFFC]
    00426606   .  8DBD FBFFFEFF lea     edi, dword ptr [ebp+FFFEFFFB]
    0042660C   .  31C0          xor     eax, eax
    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, byte ptr [esi+edx]           ;  迭代字串
    00426619   .  84DB          test    bl, bl                           ;  字符值为0x0?
    0042661B   .  74 29         je      short 00426646                   ;  结尾字节设置为0x0才能跳转正确流程
    0042661D   .  E8 16000000   call    00426638                         ;  将文件内容写入一段内存
    00426622   .  52            push    edx
    00426623   .  F7E3          mul     ebx                              ;  eax * 字符值
    00426625   .  5A            pop     edx
    00426626   .  35 326D5463   xor     eax, 63546D32                    ;  eax 再进行异或
    0042662B   .  FEC2          inc     dl                               ;  循环变量自增
    0042662D   .  39CA          cmp     edx, ecx                         ;  迭代完毕?
    0042662F   .  74 42         je      short 00426673
    00426631   .  80FA FF       cmp     dl, 0FF                          ;  迭代了255次?
    00426634   .  74 3D         je      short 00426673
    00426636   .^ EB DE         jmp     short 00426616
    00426638  /$  57            push    edi
    00426639  |.  8DBD F4FFFEFF lea     edi, dword ptr [ebp+FFFEFFF4]
    0042663F  |.  8B3F          mov     edi, dword ptr [edi]
    00426641  |.  881C17        mov     byte ptr [edi+edx], bl
    00426644  |.  5F            pop     edi
    00426645  .  C3            retn
    00426646   >  E8 EDFFFFFF   call    00426638
    0042664B   .  42            inc     edx                              ;  0x0结尾后还要加上4个字节才能跳转正确流程
    0042664C   .  83C2 04       add     edx, 4
    0042664F   .  39D1          cmp     ecx, edx
    00426651   .  75 20         jnz     short 00426673
    00426653   .  83EA 04       sub     edx, 4                           ;  还原循环变量
    00426656   .  85C0          test    eax, eax
    00426658   .  76 02         jbe     short 0042665C
    0042665A   .  D1E8          shr     eax, 1
    0042665C   >  3B0416        cmp     eax, dword ptr [esi+edx]         ;  与最后的4个字节进行对比
    0042665F   .  75 09         jnz     short 0042666A
    00426661   .  B8 00000000   mov     eax, 0
    00426666   .  8907          mov     dword ptr [edi], eax
    00426668   .  EB 10         jmp     short 0042667A
    0042666A   >  B8 01000000   mov     eax, 1
    0042666F   .  8907          mov     dword ptr [edi], eax
    00426671   .  EB 07         jmp     short 0042667A
    00426673   >  B8 02000000   mov     eax, 2
    00426678   .  8907          mov     dword ptr [edi], eax
    0042667A   >  5E            pop     esi
    0042667B   .  5F            pop     edi
    0042667C   .  5B            pop     ebx
    0042667D   .  8A85 FBFFFEFF mov     al, byte ptr [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                    ;  ASCII "Valid Key file found!"; Case 0 of switch 00426683
    00426694   .  8B83 B0010000 mov     eax, dword ptr [ebx+1B0]
    0042669A   .  E8 F5B5FEFF   call    00411C94
    0042669F   .  BA A0674200   mov     edx, 004267A0                    ;  ASCII "Registered to: "
    004266A4   .  8D85 A4FEFEFF lea     eax, dword ptr [ebp+FFFEFEA4]
    004266AA   .  E8 05CCFDFF   call    004032B4
    004266AF   .  8D85 A4FEFEFF lea     eax, dword ptr [ebp+FFFEFEA4]
    004266B5   .  8B95 F4FFFEFF mov     edx, dword ptr [ebp+FFFEFFF4]
    004266BB   .  E8 DCCCFDFF   call    0040339C
    004266C0   .  8B95 A4FEFEFF mov     edx, dword ptr [ebp+FFFEFEA4]
    004266C6   .  8B83 C0010000 mov     eax, dword ptr [ebx+1C0]
    004266CC   .  E8 C3B5FEFF   call    00411C94
    004266D1   .  EB 22         jmp     short 004266F5
    004266D3   >  BA B8674200   mov     edx, 004267B8                    ;  ASCII "Key file contains wrong serial!"; Case 1 of switch 00426683
    004266D8   .  8B83 B0010000 mov     eax, dword ptr [ebx+1B0]
    004266DE   .  E8 B1B5FEFF   call    00411C94
    004266E3   .  EB 10         jmp     short 004266F5
    004266E5   >  BA E0674200   mov     edx, 004267E0                    ;  ASCII "Key file is not valid!"; Case 2 of switch 00426683
    004266EA   .  8B83 B0010000 mov     eax, dword ptr [ebx+1B0]
    004266F0   .  E8 9FB5FEFF   call    00411C94
    004266F5   >  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]    ;  Default case of switch 00426683

    总结算法:

    1.KeyFile文件名应为“ctm_cm02.key”.

    2.KeyFile以用户名开头,用0x0作为用户名的结束符号。若是文件内容为空或者用户名没有用0x0作为结尾,则失败。

    3.迭代用户名字串并根据字串的内容生成一个值,将该值与0x0之后的四个字节的数据进行比对,如果相同,则KeyFIle是有效的。

    如果用户名为“pediy”,那么相对应的KeyFile内容应该是:

    运行效果:

    我们一路奋战,不是为了改变世界,而是不让世界改变我们 ——《熔炉》
  • 相关阅读:
    Conversion to Dalvik format failed with error 1 解决方法
    android 简单的反编译
    android ant打包问题总结
    android Sdcard 不同系统映射
    android 好用的开源框架
    android ScrollView 与 ListView 冲突汇总
    android 关于ImageView无法显示过长图片
    android 微信分享api调用总结
    android 捕获线程出错 重启线程
    c++中的容器和string类
  • 原文地址:https://www.cnblogs.com/ZRBYYXDM/p/5141825.html
Copyright © 2011-2022 走看看