首页
社区
课程
招聘
[原创]记我的第一次破解~~~happytown 的KeyGenMe_04.exe
发表于: 2007-7-22 21:11 6572

[原创]记我的第一次破解~~~happytown 的KeyGenMe_04.exe

2007-7-22 21:11
6572
大家好~~~
记得几年前到书店买书,突然发现一本《加密与解密》,拿来一看,嗯,对内容挺感兴趣的,貌似看完后能做游戏的免CD补丁了!!

!。毫不犹豫,买了。拿回家仔细看了看,发现不大妙...好难啊...
还是学业要紧,学业第一~~~把书扔到箱子里...
好在现在轻松点了,前几天昨天翻出一看,嗯,还很新的...于是决心看一看,都是汇编啊~~~上网查查资料~~~不料来到了看雪论坛

,发现这本《加密与解密》与这个论坛有些关系!!!
段钢就是ID:kanxue吗?
然后看了看,看到了CrackMe,决定试一下,找了半天发现CrackMe斑竹的几个CrackMe,呵呵,找了找,选了第4个,为什么?因为我

看到Delphi了~~~

当时觉得很难,现在觉得简单~~~
就当时记录以下破解的第一次吧~~~
各位前辈见笑了~~~

下面开始:
打开KeyGenMe_04.exe,呃...Name~~~Serial~~~

用OllyDbg加载
先找找ASCII串吧。发现了~~~"Congratulations" "Good job,man!"
呵呵,我猜第一个肯定是标题,第二个是内容~
于是向上看一看,发现了RETN

00450046    59              POP     ECX
00450047    5D              POP     EBP
00450048    C3              RETN                                                ; 有个RETN
00450049    8D40 00         LEA     EAX, DWORD PTR DS:[EAX]
0045004C    55              PUSH    EBP                                         ; [Check]后断的位置
0045004D    8BEC            MOV     EBP, ESP
0045004F    83C4 DC         ADD     ESP, -24
00450052    33C9            XOR     ECX, ECX
00450054    894D F8         MOV     DWORD PTR SS:[EBP-8], ECX
00450057    894D F4         MOV     DWORD PTR SS:[EBP-C], ECX
0045005A    8955 E0         MOV     DWORD PTR SS:[EBP-20], EDX
0045005D    8945 FC         MOV     DWORD PTR SS:[EBP-4], EAX
00450060    33C0            XOR     EAX, EAX
00450062    55              PUSH    EBP
00450063    68 8D014500     PUSH    KeyGenMe.0045018D
00450068    64:FF30         PUSH    DWORD PTR FS:[EAX]
0045006B    64:8920         MOV     DWORD PTR FS:[EAX], ESP
0045006E    8D55 F8         LEA     EDX, DWORD PTR SS:[EBP-8]
00450071    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-4]
00450074    8B80 00030000   MOV     EAX, DWORD PTR DS:[EAX+300]
0045007A    E8 D9F2FDFF     CALL    KeyGenMe.0042F358                           ; !!!取Name
0045007F    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-8]                   ; 将Name存入EAX
00450082    E8 4940FBFF     CALL    KeyGenMe.004040D0                           ; 判断输入是否为空
00450087    8945 F0         MOV     DWORD PTR SS:[EBP-10], EAX                  ; 将Name存入堆栈段
0045008A    837D F0 02      CMP     DWORD PTR SS:[EBP-10], 2                    ; 判断Name是否小于2
0045008E    0F8C DE000000   JL      KeyGenMe.00450172
00450094    8D55 F4         LEA     EDX, DWORD PTR SS:[EBP-C]
00450097    8B45 FC         MOV     EAX, DWORD PTR SS:[EBP-4]
0045009A    8B80 08030000   MOV     EAX, DWORD PTR DS:[EAX+308]                 ; "dlB"送EAX
004500A0    E8 B3F2FDFF     CALL    KeyGenMe.0042F358                           ; !!!取Serial
004500A5    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]                   ; Serial存入EAX
004500A8    E8 2340FBFF     CALL    KeyGenMe.004040D0                           ; 判断输入是否为空
004500AD    8945 EC         MOV     DWORD PTR SS:[EBP-14], EAX                  ; Serial的位数送堆栈
004500B0    837D EC 0A      CMP     DWORD PTR SS:[EBP-14], 0A                   ; 判断Serial是否为10位
004500B4    0F85 B8000000   JNZ     KeyGenMe.00450172
004500BA    8B45 EC         MOV     EAX, DWORD PTR SS:[EBP-14]
004500BD    85C0            TEST    EAX, EAX
004500BF    7E 34           JLE     SHORT KeyGenMe.004500F5
004500C1    8945 E4         MOV     DWORD PTR SS:[EBP-1C], EAX                  ; Serial的位数送堆栈
004500C4    C745 E8 0100000>MOV     DWORD PTR SS:[EBP-18], 1
004500CB    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]                   ; Serial送EAX--判断每一位是否为数字
004500CE    8B55 E8         MOV     EDX, DWORD PTR SS:[EBP-18]                  ; EDX=1,2,3,4,5,6,7,8,9,10
004500D1    807C10 FF 30    CMP     BYTE PTR DS:[EAX+EDX-1], 30                 ; 取1位,并判断是否小于0
004500D6    0F82 96000000   JB      KeyGenMe.00450172
004500DC    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]
004500DF    8B55 E8         MOV     EDX, DWORD PTR SS:[EBP-18]
004500E2    807C10 FF 39    CMP     BYTE PTR DS:[EAX+EDX-1], 39                 ; 判断是否大于9
004500E7    0F87 85000000   JA      KeyGenMe.00450172                           ; 注册码只能是数字!!!
004500ED    FF45 E8         INC     DWORD PTR SS:[EBP-18]
004500F0    FF4D E4         DEC     DWORD PTR SS:[EBP-1C]
004500F3  ^ 75 D6           JNZ     SHORT KeyGenMe.004500CB                     ; 检测下一位
004500F5    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]                   ; Serial送EAX
004500F8    0FB600          MOVZX   EAX, BYTE PTR DS:[EAX]
004500FB    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-C]                   ; Serial送EDX
004500FE    0FB652 05       MOVZX   EDX, BYTE PTR DS:[EDX+5]
00450102    03C2            ADD     EAX, EDX
00450104    83F8 6D         CMP     EAX, 6D                                     ; 第1位和第6位的ASCII码相加为6DH
00450107    75 69           JNZ     SHORT KeyGenMe.00450172
00450109    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]
0045010C    0FB640 01       MOVZX   EAX, BYTE PTR DS:[EAX+1]
00450110    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-C]
00450113    0FB652 06       MOVZX   EDX, BYTE PTR DS:[EDX+6]
00450117    03C2            ADD     EAX, EDX
00450119    83F8 67         CMP     EAX, 67                                     ; 第2位和第7位的ASCII码相加为67H
0045011C    75 54           JNZ     SHORT KeyGenMe.00450172
0045011E    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]
00450121    0FB640 02       MOVZX   EAX, BYTE PTR DS:[EAX+2]
00450125    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-C]
00450128    0FB652 07       MOVZX   EDX, BYTE PTR DS:[EDX+7]
0045012C    03C2            ADD     EAX, EDX
0045012E    83F8 69         CMP     EAX, 69                                     ; 第3位和第8位的ASCII码相加为69H
00450131    75 3F           JNZ     SHORT KeyGenMe.00450172
00450133    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]
00450136    0FB640 03       MOVZX   EAX, BYTE PTR DS:[EAX+3]
0045013A    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-C]
0045013D    0FB652 08       MOVZX   EDX, BYTE PTR DS:[EDX+8]
00450141    03C2            ADD     EAX, EDX
00450143    83F8 70         CMP     EAX, 70                                     ; 第4位和第9位的ASCII码相加为70H
00450146    75 2A           JNZ     SHORT KeyGenMe.00450172
00450148    8B45 F4         MOV     EAX, DWORD PTR SS:[EBP-C]
0045014B    0FB640 04       MOVZX   EAX, BYTE PTR DS:[EAX+4]
0045014F    8B55 F4         MOV     EDX, DWORD PTR SS:[EBP-C]
00450152    0FB652 09       MOVZX   EDX, BYTE PTR DS:[EDX+9]
00450156    F7EA            IMUL    EDX
00450158    3D 8C0A0000     CMP     EAX, 0A8C                                   ; 第5位和第10位的ASCII码相乘为0A8H
0045015D    75 13           JNZ     SHORT KeyGenMe.00450172
0045015F    6A 40           PUSH    40
00450161    68 98014500     PUSH    KeyGenMe.00450198                           ; ASCII "Congratulations"
00450166    68 A8014500     PUSH    KeyGenMe.004501A8                           ; ASCII "Good job,man!"
0045016B    6A 00           PUSH    0
0045016D    E8 2E63FBFF     CALL    <JMP.&user32.MessageBoxA>

在00450049处断点,可是在运行输入Name=yangyang和Serial=12345后按下[Check]无反应~~~
怎么办?把下面0045004C 0045004D都设断点!!!
再运行,输入Name和Serial后按下[Check],终于断下来了,在0045004C这个位置。
一直往下走,慢慢看,在0045007F处发现EAX为yangyang,看来是这里了...
指令的注释我依次写下了。
大致是这样:
Name不能小于2。Serial的位数必须为10,且都要是数字。
Name无所谓,Serial要满足以下条件:
1) 第1位和第6位的ASCII码相加为6DH
2) 第2位和第7位的ASCII码相加为67H
3) 第3位和第8位的ASCII码相加为69H
4) 第4位和第9位的ASCII码相加为70H
5) 第5位和第10位的ASCII码相乘为0A8H

就可以了。比如Serial=6667671392
最后感谢happytown ~~~

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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
沙发!~~````
支持一下!
2007-7-22 23:58
0
雪    币: 220
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
支持一下LZ
2007-7-23 16:21
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我是一位新人...
请问这里>
1) 第1位和第6位的ASCII码相加为6DH
2) 第2位和第7位的ASCII码相加为67H
3) 第3位和第8位的ASCII码相加为69H
4) 第4位和第9位的ASCII码相加为70H
5) 第5位和第10位的ASCII码相乘为0A8H
你用什麽工具计出来是`Serial=6667671392
说明白一点可吗....分享出你的计算工具可吗..给出计算器教怎用教程吧..
先谢...

那里下载这个CRAKEME 呢`...我要学习一下...
2007-7-23 19:58
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
5
这如果写算法注册机,不穷举的话,有什么好办法?

貌似可以用数组的,建议楼主写个Delphi的算法注册机让我学习下
2007-7-23 21:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那个注册码只是满足条件的一个.口算也能写出一个,不知道你哪里没有明白?
这里下载:http://bbs.pediy.com/showthread.php?t=33853
2007-7-24 13:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
其实穷举也不麻烦。只要穷举前5位就可以了,而第五位的可能情况还更少。
2007-7-24 13:40
0
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
呵呵,我的第一次破解也是拿这个开刀的,

  main()
  {
      int i,a[10];
      char name[10];
      a[4]=6,a[9]=2;
      printf("please input your name and the name's character must > 1 and <10 \n");
      gets(name);
      printf("please input four number from 0 to 9:");
      for (i = 0; i < 4; i++)
     scanf("%d",&a[i]);
      if (a[0] < 4){
           printf("The first number must > 3,please input again:");
     scanf("%d",&a[0]);
           }
      if (a[1] > 7){
           printf("The second number must < 7,please input again:");
     scanf("%d",&a[1]);
           }
      if (a[3] < 7){
           printf("The fourth number must > 7,please input again:");
     scanf("%d",&a[3]);
           }
      a[5] = 13-a[0];
      a[6] = 7-a[1];
      a[7] = 9-a[2];
      a[8] = 16-a[3];
      clrscr();
      printf("Your name is:");
      puts(name);
      printf("The Registration code is:");
      for (i = 0; i < 10; i++)
          printf("%d",a[i]);
      getch();
  }
2007-7-24 16:03
0
雪    币: 347
活跃值: (30)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
9
这样的算法,用易语言&Delphi来写注册机最好(纯属个人看法)
2007-7-24 22:45
0
游客
登录 | 注册 方可回帖
返回