首页
社区
课程
招聘
[原创]一个Delphi编程的CrackMe的算法分析
发表于: 2006-8-2 22:47 5956

[原创]一个Delphi编程的CrackMe的算法分析

bxm 活跃值
29
2006-8-2 22:47
5956

【文章标题】: 一个Delphi编程的CrackMe的算法分析
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【软件名称】: dccrackme1
【软件大小】: 125KB
【保护方式】: name,serial
【编写语言】: Borland Delphi 4.0 - 5.0
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  首先,用peid查壳,无壳,用Borland Delphi 4.0 - 5.0编写,有出错提示,用OD载入,查找字符串,无收获,下消息断点WM_LBUTTONUP也没断下,用RUN跟踪好长时间也没找到关键地方,后经高人指点使用DeDe,终于找到关键地方了,在[00441C37]下断,输入
  name:bxm
  serial:780328051
  00441C37  |.  8B45 F8       mov     eax, [ebp-8]             ;  EAX中为name
  00441C3A  |.  E8 491EFCFF   call    00403A88                 ;  EAX中返回name的长度
  00441C3F  |.  8BD0          mov     edx, eax                 ;  EDX作为循环计数器
  00441C41  |.  85D2          test    edx, edx
  00441C43  |.  7E 22         jle     short 00441C67
  00441C45  |.  B9 01000000   mov     ecx, 1
  00441C4A  |>  8B45 F8       /mov     eax, [ebp-8]            ;  EAX中为name
  00441C4D  |.  8A4408 FF     |mov     al, [eax+ecx-1]         ;  依次读取name的每个字符
  00441C51  |.  25 FF000000   |and     eax, 0FF                ;  只留下低8位
  00441C56  |.  8BD8          |mov     ebx, eax                ;  EAX送EBX
  00441C58  |.  83EB 17       |sub     ebx, 17                 ;  EBX-17
  00441C5B  |.  83E8 11       |sub     eax, 11                 ;  EAX-11
  00441C5E  |.  0FAFD8        |imul    ebx, eax                ;  EBX=EBX*EAX
  00441C61  |.  03F3          |add     esi, ebx                ;  累加于ESI
  00441C63  |.  41            |inc     ecx
  00441C64  |.  4A            |dec     edx
  00441C65  |.^ 75 E3         \jnz     short 00441C4A          ;  name读完了没,没有继续读
  00441C67  |>  8D55 F4       lea     edx, [ebp-C]
  00441C6A  |.  8B45 FC       mov     eax, [ebp-4]
  00441C6D  |.  8B80 CC020000 mov     eax, [eax+2CC]
  00441C73  |.  E8 4C16FEFF   call    004232C4
  00441C78  |.  8B45 F4       mov     eax, [ebp-C]             ;  EAX中为假码
  00441C7B  |.  50            push    eax
  00441C7C  |.  8D55 F0       lea     edx, [ebp-10]
  00441C7F  |.  8BC6          mov     eax, esi                 ;  name运算后的值送EAX
  00441C81  |.  E8 325AFCFF   call    004076B8                 ;  把name运算后的值转换成十进制字符串,即为注册码
  00441C86  |.  8B55 F0       mov     edx, [ebp-10]            ;  真码入EDX
  00441C89  |.  58            pop     eax                      ;  假码入EAX
  00441C8A  |.  E8 091FFCFF   call    00403B98                 ;  比较真码与假码
  00441C8F      75 0C         jnz     short 00441C9D           ;  关键跳,只要EAX不为零,跳向出错
  00441C91  |.  A1 30584400   mov     eax, [445830]
  00441C96  |.  E8 B9FBFFFF   call    00441854                 ;  正确对话框
  
  算法比较简单,看上面分析就能看懂,下面附上注册机源码
  #include<iostream.h>
  #include <string.h>
  void  main()
  {
          char name[50];
          int i;
          long unsigned sum;
          cout<<"Please input name:\n";
          cin>>name;
          sum=0;
          for(i=0;i<strlen(name);i++)
          {
                  sum+=((name[i]-0x17)*(name[i]-0x11));
          }
          cout<<endl<<"Code is "<<sum<<endl;
  }
  可用的一组注册码
  name:bxm78
  serial:26481
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年08月02日 下午 10:45:27


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我用RUN跟踪 和消息断点也可以跟到
  只是在查看RUN的时候 要拖到最后才行
2006-8-3 14:34
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
运行后.查找窗口.找到按键事件下消息断点.可以拦截下来!
2006-8-3 16:06
0
游客
登录 | 注册 方可回帖
返回
//