首页
社区
课程
招聘
[原创]bxm的第一个CrackMe VS 我的第一篇菜破文
发表于: 2006-9-30 21:27 7279

[原创]bxm的第一个CrackMe VS 我的第一篇菜破文

2006-9-30 21:27
7279

【文章标题】: bxm的第一个CrackMe VS 我的第一篇菜破文
【文章作者】: llydd
【下载地址】: http://bbs1.pediy.com:8081/showthread.php?s=&threadid=32206
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  这是bxm的第一个crackme,也是我的第一次
  
  用OD的查找ASCII码插件找到(程序好像是DEBUG版本的,载了N久才载入,机子N卡N卡的)
  004024EB  |.  6A 00         push    0
  004024ED  |.  68 20514100   push    00415120                         ;  恭喜你
  004024F2  |.  68 14514100   push    00415114                         ;  破解成功!
  004024F7  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
  004024FA  |.  E8 71ECFFFF   call    <jmp.&MFC42D.#3517>
  004024FF  |.  EB 14         jmp     short 00402515
  00402501  |>  6A 00         push    0
  00402503  |.  68 08514100   push    00415108                         ;  破解失败
  00402508  |.  68 58504100   push    00415058                         ;  重试?
  
  往上拖找到关键算法部分
  
  004023C0  /> \55            push    ebp
  004023C1  |.  8BEC          mov     ebp, esp
  004023C3  |.  81EC 90000000 sub     esp, 90
  004023C9  |.  53            push    ebx
  004023CA  |.  56            push    esi
  004023CB  |.  57            push    edi
  004023CC  |.  51            push    ecx
  004023CD  |.  8DBD 70FFFFFF lea     edi, dword ptr [ebp-90]
  004023D3  |.  B9 24000000   mov     ecx, 24
  004023D8  |.  B8 CCCCCCCC   mov     eax, CCCCCCCC
  004023DD  |.  F3:AB         rep     stos dword ptr es:[edi]
  004023DF  |.  59            pop     ecx
  004023E0  |.  894D FC       mov     dword ptr [ebp-4], ecx
  004023E3  |.  6A 01         push    1
  004023E5  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
  004023E8  |.  E8 7DEDFFFF   call    <jmp.&MFC42D.#5056>
  004023ED  |.  C745 F8 00000>mov     dword ptr [ebp-8], 0
  004023F4  |.  C745 F0 00000>mov     dword ptr [ebp-10], 0
  004023FB  |.  8B4D FC       mov     ecx, dword ptr [ebp-4]
  004023FE  |.  83C1 60       add     ecx, 60
  00402401  |.  E8 8EFBFFFF   call    <jmp.&MFC42D.#880>
  00402406  |.  50            push    eax                              ; /src
  00402407  |.  8D45 D0       lea     eax, dword ptr [ebp-30]          ; |
  0040240A  |.  50            push    eax                              ; |dest
  
  
  0040240B  |.  E8 24EDFFFF   call    <jmp.&MSVCRTD.strcpy>            ; \strcpy
  00402410  |.  83C4 08       add     esp, 8
  00402413  |.  8D4D D0       lea     ecx, dword ptr [ebp-30]
  00402416  |.  51            push    ecx                              ; /s
  00402417  |.  E8 1EEDFFFF   call    <jmp.&MSVCRTD.strlen>            ; \strlen
  0040241C  |.  83C4 04       add     esp, 4
  0040241F  |.  8945 E8       mov     dword ptr [ebp-18], eax          ;  取得用户名的长度
  00402422  |.  C745 EC 00000>mov     dword ptr [ebp-14], 0
  00402429  |.  EB 09         jmp     short 00402434
  0040242B  |>  8B55 EC       /mov     edx, dword ptr [ebp-14]
  0040242E  |.  83C2 01       |add     edx, 1
  00402431  |.  8955 EC       |mov     dword ptr [ebp-14], edx
  00402434  |>  8B45 EC        mov     eax, dword ptr [ebp-14]
  00402437  |.  3B45 E8       |cmp     eax, dword ptr [ebp-18]
  0040243A  |.  7D 12         |jge     short 0040244E
  0040243C  |.  8B4D EC       |mov     ecx, dword ptr [ebp-14]
  0040243F  |.  0FBE540D D0   |movsx   edx, byte ptr [ebp+ecx-30]      ;  对用户名各位ASCII码进行累加
  00402444  |.  8B45 F8       |mov     eax, dword ptr [ebp-8]
  00402447  |.  03C2          |add     eax, edx
  00402449  |.  8945 F8       |mov     dword ptr [ebp-8], eax          ;  最终结果会存到这里
  0040244C  |.^ EB DD         \jmp     short 0040242B
  
  0040244E  mov     ecx, dword ptr [ebp-8]
  00402451  neg     ecx                              ;  用户名位ascii码各位相加结果S求补得A
  00402453  mov     edx, dword ptr [ebp-8]           ;  
  00402456  add     edx, dword ptr [ebp-18]          ;  用户名位ascii码各位相加结果S与用户名位数相加得B
  00402459 >imul    ecx, edx
  0040245C  mov     dword ptr [ebp-C], ecx           ;  保存A*B结果
  0040245F  mov     ecx, dword ptr [ebp-4]
  00402462  add     ecx, 64
  00402465  call    <jmp.&MFC42D.#880>
  0040246A  push    eax                              ; /src
  0040246B  lea     eax, dword ptr [ebp-48]          ; |
  0040246E  push    eax                              ; |dest
  0040246F  call    <jmp.&MSVCRTD.strcpy>            ; \strcpy
  00402474  add     esp, 8
  00402477  mov     dword ptr [ebp-50], 1
  0040247E  lea     ecx, dword ptr [ebp-48]
  00402481  push    ecx                              ; /s
  00402482  call    <jmp.&MSVCRTD.strlen>            ; \strlen
  00402487  add     esp, 4
  0040248A  sub     eax, 1
  0040248D  mov     dword ptr [ebp-4C], eax          ;  serial位数-1
  00402490  jmp     short 0040249B
  00402492  /mov     edx, dword ptr [ebp-4C]
  00402495  |sub     edx, 1
  00402498  |mov     dword ptr [ebp-4C], edx
  0040249B   cmp     dword ptr [ebp-4C], 0
  0040249F  |jl      short 004024C3
  004024A1  |mov     eax, dword ptr [ebp-4C]
  004024A4  |movsx   ecx, byte ptr [ebp+eax-48]
  004024A9  |sub     ecx, 30                         ;  
  004024AC  |imul    ecx, dword ptr [ebp-50]
  004024B0  |mov     edx, dword ptr [ebp-10]
  004024B3  |add     edx, ecx
  004024B5  |mov     dword ptr [ebp-10], edx
  004024B8  |mov     eax, dword ptr [ebp-50]
  004024BB  |imul    eax, eax, 0A
  004024BE  |mov     dword ptr [ebp-50], eax
  004024C1  \jmp     short 00402492
  004024C3  mov     ecx, dword ptr [ebp-10]          ;  将注册码反变成十进制数如“787878”变成787878
  004024C6  imul    ecx, ecx, -1                     ;  然后乘-1得C
  004024C9  mov     dword ptr [ebp-10], ecx
  004024CC  cmp     dword ptr [ebp-18], 0            ; 用户名位数与0比
  004024D0  je      short 00402501
  004024D2  mov     edx, dword ptr [ebp-10]
  004024D5  imul    edx, dword ptr [ebp-10]          ;  D=C*C
  004024D9  mov     eax, dword ptr [ebp-10]
  004024DC  imul    eax, dword ptr [ebp-18]          ;  EAX=C乘用户名位数得E
  004024E0  mov     ecx, dword ptr [ebp-C]           ;  ECX=A*B
  004024E3  add     ecx, edx                         ;  ECX=A*B+D得F
  004024E5  add     eax, ecx                         ;  EAX=E+F
  004024E7  test    eax, eax                         ;判断eax是否为零若不为0则注册失败
  004024E9  jnz     short 00402501
  
  
  
  
  注册算法:
          1:将用户名的ASCII码各位相加结果S求补得A,将S加上用户名的位数得B,然后A*B
          2:将注册码转化成十进制数然后乘以-1得C
          3:求C^2得D
          4:C乘用户名位数得E
          5:将A*B+D得F
          6:E+F得G
          7:判断G是否为0为零,为0则注册成功
  如:
  用户名:llydd
  注册码:542
  
  注册机代码如下(写的蛮乱的)
#include "stdio.h"
#include "string.h"
int main(int argc,char* argv[])
{
        int  nIDlen,n,nIDsum=0;
        char id[20];
        printf("ID=");
        gets(id);
        nIDlen=strlen(id);
        for(n=0;n<=nIDlen;nIDsum+=id[n],n++);
        printf("serial=%d\n",nIDsum+nIDlen);
        system("pause");
        return 0;
}  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年09月30日 21:22:17


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
GOOD~~~~学习~~
2006-9-30 21:35
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
做梦都想有个精华,我在期待啊,期待。。。。
2006-9-30 21:53
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
很不错!!
2006-9-30 22:03
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
5
不错,支持楼主!
2006-10-1 13:37
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
6
学习学习。
我感觉每分析一个算法都要花很长时间。累
2006-10-1 18:30
0
雪    币: 210
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
其实楼主的注册机可以进一步简化的
由分析可以知道,注册码就是(姓名的ascii码总和+姓名长度)的十进制
所以不用开方那么麻烦的
呵呵,一点小小的改进而已
2006-10-2 00:43
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
8
最初由 cliches 发布
其实楼主的注册机可以进一步简化的
由分析可以知道,注册码就是(姓名的ascii码总和+姓名长度)的十进制
所以不用开方那么麻烦的
呵呵,一点小小的改进而已

的确如此,谢谢cliches指出,
第一次献丑就走光了
2006-10-2 09:06
0
雪    币: 517
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
这个算法还有别外一个注册码.

通过分析,可以列一个一元二次方程式:
key^2-nlen*key-m*(m+nlen)=0
=>(key+m)(key-m-nlen)=0
其中key为注册码,m为用户名ascii的和,nlen为用户名长。
第一个解为:姓名的ascii码总和+姓名长度m+nlen
第二个解为:负的姓名的ascii码总和-m
第二解算法如下:m为姓名ascii码总和
        sprintf(m_str,"%d",m);
        nlen=strlen(m_str);
        for(i=0;i<nlen;i++)
        {
                key2[i]=0x60-m_str[i];
        }

例如:
用户名:ccbsx
注册码1:536
注册码2:+-/

2006-10-26 01:06
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
菜鸟求教。。
请问楼主在分析代码的时候,有没有连下面的这段代码(摘自楼主的原汇编)都分析呢?
或者有什么办法一下看出,它不是算法的一部分呢?
觉得有点不连贯。。为什么中途有一段不是算法的东西冒出来。。迷茫中。。。。
0040245F  mov     ecx, dword ptr [ebp-4]
  00402462  add     ecx, 64
  00402465  call    <jmp.&MFC42D.#880>
  0040246A  push    eax                              ; /src
  0040246B  lea     eax, dword ptr [ebp-48]          ; |
  0040246E  push    eax                              ; |dest
  0040246F  call    <jmp.&MSVCRTD.strcpy>            ; \strcpy
  00402474  add     esp, 8
  00402477  mov     dword ptr [ebp-50], 1
  0040247E  lea     ecx, dword ptr [ebp-48]
  00402481  push    ecx                              ; /s
  00402482  call    <jmp.&MSVCRTD.strlen>            ; \strlen
  00402487  add     esp, 4
  0040248A  sub     eax, 1
  0040248D  mov     dword ptr [ebp-4C], eax          ;  serial位数-1
  00402490  jmp     short 0040249B
  00402492  /mov     edx, dword ptr [ebp-4C]
  00402495  |sub     edx, 1
  00402498  |mov     dword ptr [ebp-4C], edx
  0040249B   cmp     dword ptr [ebp-4C], 0
  0040249F  |jl      short 004024C3
  004024A1  |mov     eax, dword ptr [ebp-4C]
  004024A4  |movsx   ecx, byte ptr [ebp+eax-48]
  004024A9  |sub     ecx, 30                         ;  
  004024AC  |imul    ecx, dword ptr [ebp-50]
  004024B0  |mov     edx, dword ptr [ebp-10]
  004024B3  |add     edx, ecx
  004024B5  |mov     dword ptr [ebp-10], edx
  004024B8  |mov     eax, dword ptr [ebp-50]
  004024BB  |imul    eax, eax, 0A
  004024BE  |mov     dword ptr [ebp-50], eax
  004024C1  \jmp     short 00402492
2010-9-24 23:15
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
挖坟了啊……
2010-10-9 15:25
0
游客
登录 | 注册 方可回帖
返回
//