首页
社区
课程
招聘
[讨论]非明码比较的Crackme的破解
发表于: 2006-7-8 16:27 6633

[讨论]非明码比较的Crackme的破解

bxm 活跃值
29
2006-7-8 16:27
6633

【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【保护方式】: name,serial
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: peid,od,计算器
【操作平台】: winxp
【作者声明】: 只是感兴趣,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
    首先用peid查壳,无壳。运行,收集足够的信息,用OD载入,运行,下断点getdlgitemtexta,输入name:bxm78,serial:780328051,成功断下,单步跟跟踪发现,serial要18位,重新运行,输入18位的serial:780328051780328051,断在下面:
  004011CF  |.  FFD7          call    edi                     ; \GetDlgItemTextA
  004011D1  |.  8BF0          mov     esi, eax
  004011D3  |.  85F6          test    esi, esi                ;  name长度<1 ?
  004011D5  |.  0F84 4B010000 je      00401326                ;  是,出错提示
  004011DB  |.  83FE 40       cmp     esi, 40                 ;  name长度>64 ?
  004011DE  |.  0F87 42010000 ja      00401326                ;  是,出错提示
  004011E4  |.  8B45 08       mov     eax, [ebp+8]
  004011E7  |.  8D55 94       lea     edx, [ebp-6C]
  004011EA  |.  6A 13         push    13                      ; /Count = 13 (19.)
  004011EC  |.  52            push    edx                     ; |Buffer
  004011ED  |.  68 E9030000   push    3E9                     ; |ControlID = 3E9 (1001.)
  004011F2  |.  50            push    eax                     ; |hWnd
  004011F3  |.  FFD7          call    edi                     ; \GetDlgItemTextA
  004011F5  |.  6BC0 03       imul    eax, eax, 3             ;  serial长度*3
  004011F8  |.  C1E0 02       shl     eax, 2                  ;  左移2位
  004011FB  |.  05 CD000000   add     eax, 0CD                ;  加上0CD
  00401200  |.  8945 FC       mov     [ebp-4], eax
  00401203  |.  817D FC A5010>cmp     dword ptr [ebp-4], 1A5  ;  运算结果是否等于1A5,反推后得出serial要18位
  0040120A  |.  0F85 BC000000 jnz     004012CC                ;  不是,出错提示
  00401210  |.  33C0          xor     eax, eax
  00401212  |.  8A45 94       mov     al, [ebp-6C]
  00401215  |.  84C0          test    al, al
  00401217  |.  74 13         je      short 0040122C
  00401219  |.  8D4D 94       lea     ecx, [ebp-6C]
  0040121C  |>  3C 30         /cmp     al, 30                 ;  serial的每一位是否小于30H
  0040121E  |.  0F82 C6000000 |jb      004012EA               ;  是,出错提示
  00401224  |.  8A41 01       |mov     al, [ecx+1]
  00401227  |.  41            |inc     ecx
  00401228  |.  84C0          |test    al, al
  0040122A  |.^ 75 F0         \jnz     short 0040121C
  0040122C  |>  E8 CFFDFFFF   call    00401000                ;  寄存器清0
  00401231  |.  8D85 2CFFFFFF lea     eax, [ebp-D4]
  00401237  |.  50            push    eax
  00401238  |.  E8 43FEFFFF   call    00401080                ;  关键call 1:和name有关,跟进,我的得到434E4D4E
  0040123D  |.  8945 FC       mov     [ebp-4], eax
  00401240  |.  E8 BBFDFFFF   call    00401000
  00401245  |.  8D8D 2CFFFFFF lea     ecx, [ebp-D4]
  0040124B  |.  56            push    esi
  0040124C  |.  51            push    ecx
  0040124D  |.  E8 BEFDFFFF   call    00401010                ;  没看出来有什么用
  00401252  |.  83C4 0C       add     esp, 0C
  00401255  |.  33C9          xor     ecx, ecx
  00401257  |>  8B45 FC       /mov     eax, [ebp-4]           ;  根据434E4D4E再次运算,把中间结果存入[0012FA20]
  0040125A  |.  33D2          |xor     edx, edx
  0040125C  |.  BE 1A000000   |mov     esi, 1A                ;  eax div 1A
  00401261  |.  F7F6          |div     esi
  00401263  |.  8A9415 10FFFF>|mov     dl, [ebp+edx-F0]       ;  根据余数从字符串A到Z中选出相应的字符
  0040126A  |.  88540D C8     |mov     [ebp+ecx-38], dl       ;  存入指定地址
  0040126E  |.  8B45 FC       |mov     eax, [ebp-4]
  00401271  |.  C1E0 03       |shl     eax, 3
  00401274  |.  BA 45230100   |mov     edx, 12345
  00401279  |.  F7E8          |imul    eax                    ;  eax*eax
  0040127B  |.  03C2          |add     eax, edx               ;  eax+edx
  0040127D  |.  8945 FC       |mov     [ebp-4], eax           ;  存入[ebp-4]作为下一次循环用
  00401280  |.  41            |inc     ecx
  00401281  |.  83F9 12       |cmp     ecx, 12
  00401284  |.^ 72 D1         \jb      short 00401257         ;  循环18次
  00401286  |.  E8 75FDFFFF   call    00401000
  0040128B  |.  33C0          xor     eax, eax
  0040128D  |>  8A4C05 94     /mov     cl, [ebp+eax-6C]       ;  逐个读取假serial
  00401291  |.  8A5405 C8     |mov     dl, [ebp+eax-38]       ;  逐个读取上面算得的字符串
  00401295  |.  80E9 30       |sub     cl, 30
  00401298  |.  32D1          |xor     dl, cl
  0040129A  |.  885405 C8     |mov     [ebp+eax-38], dl
  0040129E  |.  40            |inc     eax
  0040129F  |.  83F8 12       |cmp     eax, 12
  004012A2  |.^ 72 E9         \jb      short 0040128D
  004012A4  |.  E8 57FDFFFF   call    00401000
  004012A9  |.  8D55 C8       lea     edx, [ebp-38]           ;  根据call 2逆推出[ebp-38]应为ASCII“KD[DAKHNFN>EIZLFUB”
  004012AC  |.  52            push    edx
  004012AD  |.  E8 5EFEFFFF   call    00401110                ;  关键call 2:对得到的结果再次运算,存入[12FA20],需跟进
  004012B2  |.  E8 49FDFFFF   call    00401000
  004012B7  |.  8D45 C8       lea     eax, [ebp-38]
  004012BA  |.  68 14514000   push    00405114                ;  ASCII "KEYGENNING4NEWBIES"
  004012BF  |.  50            push    eax
  004012C0  |.  E8 6BFEFFFF   call    00401130                ;  两串字符比较,相同,返回1,否则返回0
  004012C5  |.  83C4 0C       add     esp, 0C
  004012C8  |.  85C0          test    eax, eax
  004012CA  |.  75 3C         jnz     short 00401308          ;  爆破点
  004012CC  |>  8B4D 08       mov     ecx, [ebp+8]
  004012CF  |.  6A 10         push    10                      ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
  004012D1  |.  68 0C514000   push    0040510C                ; |Title = "Error"
  004012D6  |.  68 FC504000   push    004050FC                ; |Text = "Bad Serial :o("
  004012DB  |.  51            push    ecx                     ; |hOwner
  004012DC  |.  FF15 AC404000 call    [<&USER32.MessageBoxA>] ; \MessageBoxA
  004012E2  |.  5F            pop     edi
  004012E3  |.  33C0          xor     eax, eax
  004012E5  |.  5E            pop     esi
  004012E6  |.  8BE5          mov     esp, ebp
  004012E8  |.  5D            pop     ebp
  004012E9  |.  C3            retn
  004012EA  |>  8B55 08       mov     edx, [ebp+8]
  004012ED  |.  6A 10         push    10                      ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
  004012EF  |.  68 0C514000   push    0040510C                ; |Title = "Error"
  004012F4  |.  68 FC504000   push    004050FC                ; |Text = "Bad Serial :o("
  004012F9  |.  52            push    edx                     ; |hOwner
  004012FA  |.  FF15 AC404000 call    [<&USER32.MessageBoxA>] ; \MessageBoxA
  00401300  |.  5F            pop     edi
  00401301  |.  33C0          xor     eax, eax
  00401303  |.  5E            pop     esi
  00401304  |.  8BE5          mov     esp, ebp
  00401306  |.  5D            pop     ebp
  00401307  |.  C3            retn
  00401308  |>  8B55 08       mov     edx, [ebp+8]
  0040130B  |.  6A 40         push    40                      ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  0040130D  |.  68 F4504000   push    004050F4                ; |Title = "Great !"
  00401312  |.  68 B0504000   push    004050B0                ; |Text = "Wow you did it... Now write a valid keygen with NO ASM RIPPING :X"
  00401317  |.  52            push    edx                     ; |hOwner
  00401318  |.  FF15 AC404000 call    [<&USER32.MessageBoxA>] ; \MessageBoxA
  
  =====================================================================================
  关键call 1:
  00401080  /$  55            push    ebp
  00401081  |.  8BEC          mov     ebp, esp
  00401083  |.  51            push    ecx
  00401084  |.  53            push    ebx
  00401085  |.  56            push    esi
  00401086  |.  57            push    edi
  00401087  |.  68 80504000   push    00405080                ;  ASCII "eheh"
  0040108C  |.  6A 00         push    0
  0040108E  |.  E8 ADFFFFFF   call    00401040                ;  得到68656865
  00401093  |.  83C4 08       add     esp, 8
  00401096  |.  8BD8          mov     ebx, eax
  00401098  |.  E8 63FFFFFF   call    00401000                ;  寄存器清0
  0040109D  |.  BF 70504000   mov     edi, 00405070           ;  ASCII " is a whore."
  004010A2  |.  83C9 FF       or      ecx, FFFFFFFF
  004010A5  |.  33C0          xor     eax, eax
  004010A7  |.  F2:AE         repne   scas byte ptr es:[edi]
  004010A9  |.  F7D1          not     ecx
  004010AB  |.  2BF9          sub     edi, ecx
  004010AD  |.  8BF7          mov     esi, edi
  004010AF  |.  8B7D 08       mov     edi, [ebp+8]
  004010B2  |.  8BD1          mov     edx, ecx
  004010B4  |.  83C9 FF       or      ecx, FFFFFFFF
  004010B7  |.  F2:AE         repne   scas byte ptr es:[edi]
  004010B9  |.  8BCA          mov     ecx, edx
  004010BB  |.  4F            dec     edi
  004010BC  |.  C1E9 02       shr     ecx, 2
  004010BF  |.  F3:A5         rep     movs dword ptr es:[edi]>;  把字符串“ is a whore.”接在name的后面
  004010C1  |.  8BCA          mov     ecx, edx
  004010C3  |.  83E1 03       and     ecx, 3
  004010C6  |.  F3:A4         rep     movs byte ptr es:[edi],>
  004010C8  |.  33FF          xor     edi, edi
  004010CA  |.  33F6          xor     esi, esi
  004010CC  |>  8B45 08       /mov     eax, [ebp+8]
  004010CF  |.  50            |push    eax                    ;  把连接后的字符串进栈
  004010D0  |.  56            |push    esi
  004010D1  |.  E8 6AFFFFFF   |call    00401040               ;  此call功能,把字符串中第ESI个连续四个倒序排列,结果放入EAX返回
  004010D6  |.  8B8E 30504000 |mov     ecx, [esi+405030]      ;  16次循环依次读取12、5C、34、22、AB、9D、54、00、DD、84、AE、66、31、78、73、CF
  004010DC  |.  83C4 08       |add     esp, 8
  004010DF  |.  33CF          |xor     ecx, edi               ;  ecx与循环次数异或
  004010E1  |.  03C1          |add     eax, ecx
  004010E3  |.  8945 FC       |mov     [ebp-4], eax
  004010E6  |.  C145 FC 07    |rol     dword ptr [ebp-4], 7   ;  循环左移7位
  004010EA  |.  8B45 FC       |mov     eax, [ebp-4]           ;  结果放入eax
  004010ED  |.  83C6 04       |add     esi, 4
  004010F0  |.  33D8          |xor     ebx, eax               ;  ebx与eax异或
  004010F2  |.  47            |inc     edi
  004010F3  |.  83FE 40       |cmp     esi, 40
  004010F6  |.^ 7C D4         \jl      short 004010CC         ;  16次循环
  004010F8  |.  5F            pop     edi
  004010F9  |.  8BC3          mov     eax, ebx
  004010FB  |.  5E            pop     esi
  004010FC  |.  5B            pop     ebx
  004010FD  |.  8BE5          mov     esp, ebp
  004010FF  |.  5D            pop     ebp
  00401100  \.  C3            retn
  
  =============================================================================================
  关键call 2:
  00401110  /$  8B4C24 04     mov     ecx, [esp+4]            ;  读取上面运算得到的字符串
  00401114  |.  33C0          xor     eax, eax
  00401116  |>  8A1408        /mov     dl, [eax+ecx]          ;  循环读取每一位字符入dl
  00401119  |.  32D0          |xor     dl, al                 ;  与循环次数异或
  0040111B  |.  881408        |mov     [eax+ecx], dl          ;  保存在原来的地址
  0040111E  |.  40            |inc     eax
  0040111F  |.  83F8 12       |cmp     eax, 12
  00401122  |.^ 72 F2         \jb      short 00401116         ;  循环18次
  00401124  \.  C3            retn
  
  算法小结:
    1、name为1到64位。
    2、serial为18位。
    3、name与字符串“ is a whore.”连接,记为A。
    4、ebx=68656865
       for(i=0;i<16;i++)
       {  把A中的字符第i个后面的连续四个倒序后连接到EAX
          16次循环依次读取12、5C、34、22、AB、9D、54、00、DD、84、AE、66、31、78、73、CF放入ECX
          ECX=ECX+i
          EAX=EAX+ECX
          EAX循环左移7位
          ebx=ebx^EAX
        }
        最终ebx记为B。
    5、for(i=0;i<18;i++)
       {
          根据B除以1A的余数决定存入字符,从字符A到Z中选择相应的字符,即第余数个。
          B左移3位
          B*B变为64位,低32位+高32位,重新存入B
        }
    6、字符串“KEYGENNING4NEWBIES”每个字符依次与1、2、……15异或,得字符串“KD[DAKHNFN>EIZLFUB”,记为C。
    7、把C与第5步算得的字符串异或,再加上30H即为正确的serial。
  
  本想用TC写个注册机出来,无奈水平有限,搞了一整天,也没写出来,真的很无奈。
    可用的一组注册码:
    naem:bxm78
    serial:<>?E=?21>H?OBHNNJ
    注意:后面的一个问号为编码为“A0”的ASCII码,不知道怎样用键盘输入。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年07月08日 下午 04:24:55


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
最初由 bxm 发布
naem:bxm78
serial:<>?E=?21>H?OBHNNJ
注意:后面的一个问号为编码为“A0”的ASCII码,不知道怎样用键盘输入。


Alt+小键盘的数字

如输入1(1的ASCII码的10进制是49):

alt+49

你这组序列号:<>?E=?21>H?OBHNNJ 哪个问号是“A0”?我假设最后一个是,没成功。
2006-7-8 21:25
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
3
最初由 kanxue 发布
Alt+小键盘的数字

如输入1(1的ASCII码的10进制是49):

alt+49
........

  最一个问号是"A0",我当时也试着用alt+160,但是在OD中跟踪到结果为"3F",不是"A0",我也搞不清是怎么回事.用widows的字符映射表找个ASCII为"A0"的,复制到注册码框中也不行,用WORD的插入符号功能复制到注册码框中也不行.纳闷~~~
2006-7-8 21:40
0
游客
登录 | 注册 方可回帖
返回
//