首页
社区
课程
招聘
[原创]第一次独立分析cm算法 写注册机(适合新手)
发表于: 2009-9-14 16:16 15005

[原创]第一次独立分析cm算法 写注册机(适合新手)

2009-9-14 16:16
15005

【文章标题】: 第一次独立给cm写注册机
【文章作者】: 思远软件
【作者邮箱】: c_s_y@126.com
【作者主页】: http://blog.163.com/c_s_y@126/
【作者QQ号】: 495544622
【软件名称】: crackme
【软件大小】: 48.5 KB
【下载地址】: www.crackmes.de
【加壳方式】: 无
【保护方式】: 反调试
【编写语言】: MASM32 / TASM32
【使用工具】: OLLYDBG 1.1
【操作平台】: winXP
【软件介绍】: 一个很简单的cm
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  大家好,今天是我第二次写注册机,也是第一次独立完成写注册机。写的不好,不知道能不能得到精华
  今天开刀的是我刚刚在crackmes.de下载的一个crackme,比较简单,高手就可以直接跳过了。
  od查看 MASM32 / TASM32写的,用OD载入,可是跑飞了,怎么办呢?对,OD有附加进程的功能,先打开cm,然后打开od
  用插件隐藏od,然后载入这个cm。 恩 可以运行了。
  先用od的查找字符串插件查找字符,很容易可以找到正确和错误信息。向上找,很容易就可以找到关键算法!
  下断点 我在这里输入用户名 exekill  密码495544622  点击确定
  
  00401153   $  55            push    ebp
  00401154   .  8BEC          mov     ebp, esp
  00401156   .  68 B4304000   push    004030B4                         ; /String = "exekill"
  0040115B   .  E8 42010000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA                          取用户名长度
  00401160   .  BA 6A314000   mov     edx, 0040316A
  00401165   .  8902          mov     dword ptr [edx], eax
  00401167   .  BF B4304000   mov     edi, 004030B4                    ;  ASCII "exekill"
  0040116C   .  BE 19314000   mov     esi, 00403119                    ;  ASCII "331523541"
  00401171   .  33C0          xor     eax, eax
  00401173   .  33DB          xor     ebx, ebx
  00401175   .  33C9          xor     ecx, ecx
  00401177   .  33D2          xor     edx, edx
  00401179   .  BA 6A314000   mov     edx, 0040316A
  0040117E   .  8B12          mov     edx, dword ptr [edx]
  00401180   >  83C3 01       add     ebx, 1
  00401183   .  3BD3          cmp     edx, ebx
  00401185   .  74 15         je      short 0040119C
  00401187   .  8A07          mov     al, byte ptr [edi]               ;                                        取一个字符的asicc
  00401189   .  3C 5A         cmp     al, 5A                           ;                                        和Z比较
  0040118B   .  7E 05         jle     short 00401192                   ;                                      小于就跳
  0040118D   >  03C8          add     ecx, eax                         ;                                       加到ECX
  0040118F   .  47            inc     edi
  00401190   .^ EB EE         jmp     short 00401180
  00401192   >  3C 41         cmp     al, 41                           ;                                       和A比较 大于等于就跳
  00401194   .  7D 02         jge     short 00401198
  00401196   .  EB 02         jmp     short 0040119A                   ;         
  00401198   >  04 2C         add     al, 2C                           ;                                        加2C
  0040119A   >^ EB F1         jmp     short 0040118D
  0040119C   >  81C1 9A020000 add     ecx, 29A                         ;                                   ECX=ECX+29A
  004011A2   .  69C9 39300000 imul    ecx, ecx, 3039                   ;                                   ECX=ECX*3039
  004011A8   .  83E9 17       sub     ecx, 17                          ;                                        ECX=ECX-17
  004011AB   .  6BC9 09       imul    ecx, ecx, 9                      ;                                       ECX=ECX*9
  004011AE   .  33DB          xor     ebx, ebx                         ;                                         EBX清0
  004011B0   .  8BC1          mov     eax, ecx                         ;                                       eax=ecx
  004011B2   .  B9 0A000000   mov     ecx, 0A                          ;  
  004011B7   >  33D2          xor     edx, edx                         ;  
  004011B9   .  F7F1          div     ecx                              ;                    EAX/ECX(A) (取个位)  (这里开始就是循环了)
  004011BB   .  80C2 30       add     dl, 30                           ;                            余数+30  (就是存储数字的意思)
  004011BE   .  881433        mov     byte ptr [ebx+esi], dl           ;                                   (存储)
  004011C1   .  83C3 01       add     ebx, 1
  004011C4   .  83F8 00       cmp     eax, 0
  004011C7   .  74 02         je      short 004011CB
  004011C9   .^ EB EC         jmp     short 004011B7                   ;  ????????
  004011CB   >  BF C8304000   mov     edi, 004030C8              ;  ASCII "145325133kill"
  004011D0   >  8A4433 FF     mov     al, byte ptr [ebx+esi-1]         ;  !!!倒放
  004011D4   .  8807          mov     byte ptr [edi], al
  004011D6   .  47            inc     edi
  004011D7   .  4B            dec     ebx
  004011D8   .  83FB 00       cmp     ebx, 0
  004011DB   .^ 75 F3         jnz     short 004011D0
  004011DD   .  C607 00       mov     byte ptr [edi], 0
  004011E0   .  8D3D B4304000 lea     edi, dword ptr [4030B4]
  004011E6   .  68 B7304000   push    004030B7                         ;  ASCII "kill"
  004011EB   .  68 C8304000   push    004030C8                         ;  ASCII "145325133kill"
  004011F0   .  E8 BB000000   call    004012B0
  004011F5   .  68 C8304000   push    004030C8                         ; /String2 = "145325133kill"
  004011FA   .  68 98314000   push    00403198                         ; |String1 = "495544622"
  004011FF   .  E8 98000000   call    <jmp.&kernel32.lstrcmpA>         ; \lstrcmpA
  00401204   .  0BC0          or      eax, eax
  00401206   .  75 2B         jnz     short 00401233
  00401208   .  68 B4304000   push    004030B4                         ;  ASCII "exekill"
  0040120D   .  68 83304000   push    00403083                         ;  ASCII "Good Job, Now write a keygen  || Registered to: "
  00401212   .  E8 99000000   call    004012B0
  00401217   .  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  00401219   .  68 13304000   push    00403013                         ; |Title = "Good boy"
  0040121E   .  68 83304000   push    00403083                         ; |Text = "Good Job, Now write a keygen  || Registered to: "
  00401223   .  6A 00         push    0                                ; |hOwner = NULL
  00401225   .  E8 4E000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  0040122A   .  6A 00         push    0                                ; /ExitCode = 0
  0040122C   .  E8 59000000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess
  00401231   .  EB 13         jmp     short 00401246
  00401233   >  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  00401235   .  68 04304000   push    00403004                         ; |Title = "Error, Bad Boy"
  0040123A   .  68 3A304000   push    0040303A                         ; |Text = "Hey!, you are OK?, its for Newbies..."
  0040123F   .  6A 00         push    0                                ; |hOwner = NULL
  00401241   .  E8 32000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  00401246   >  EB 13         jmp     short 0040125B
  00401248   .  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
  0040124A   .  68 04304000   push    00403004                         ; |Title = "Error, Bad Boy"
  0040124F   .  68 60304000   push    00403060                         ; |Text = "Where is the serial, Mr Cracker ? "
  00401254   .  6A 00         push    0                                ; |hOwner = NULL
  00401256   .  E8 1D000000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  0040125B   >  C9            leave
  
  
  好了 分析一下,就很容易分析出来算法
  1 先取注册名,若注册名长度为N  取前n-1个字符如果每一个数字为小写字母或者其他字符,那么就直接相加,如果为大写字母的话,
  就加上2C,各个位相加,我们取这个和为S。
  2 计算S1    S=((S+29A)*3039-17)*9
                 将S看成十进制,尾数加注册名(去除前4位)输出
  
  c语言写的算法如下:   
  #include<stdio.h>
  #include<windows.h>
  #include<string.h>
  void main()
  {
          char str[100];
          char *p=str;
          int s=0,l,i,l1;  
          puts("请输入您的用户名!");
          gets(str);
          l=strlen(str);
          l1=l-3;
          for(i=0;i<l-1;i++,p++)
          {
                  if( *p<'Z' && *p>'A' )
                  s+=0x2c;
          s+=*p;
          }
   s=((s+0x29A)*0x3039-0x17)*9;
  
  printf("注册码为%d",s);
  p=&str[3];
   for(i=l1;i>0;i--)
  printf("%c",str[l-i]);
  system("pause");
  }
  在vc 9.0编译通过
注册机和crackme已经打包上传!!
  
--------------------------------------------------------------------------------
【经验总结】
  学习破解,不但要有惊人的毅力,并且要有敢尝试困难的信心。
  不懂编程,破解这条路是走不远的。
  要熟练各种汇编指令。
  最后提醒一句,耐心最重要的,这个浪费了我将近3个小时才搞定!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年09月12日 16:13:13


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (35)
雪    币: 287
活跃值: (18)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
虽然暂时还是不是很懂,既然是兄弟写的,一定要支持,相信我以后也能写.加油
2009-9-14 16:21
0
雪    币: 83
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
嗯.不错.水平和我差不多!
哈哈
2009-9-14 17:41
0
雪    币: 101
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
真不知道你是夸赞自己还是作者
2009-9-14 22:54
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
5
虽然简单了些 但谁都有第一步 贵在坚持 与君共勉之
2009-9-14 23:03
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
6
支持一下,跑过来学习
2009-9-14 23:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
微微的顶一下下,值得鼓励。
2009-9-15 16:42
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
up up more health
2009-9-16 15:44
0
雪    币: 261
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汇编好难
正在努力。。。。。
2009-9-16 22:16
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习学习,再学习.
2009-9-17 02:08
0
雪    币: 324
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
很不错,对于我很有指导,谢谢楼主了!
2009-9-17 10:50
0
雪    币: 208
活跃值: (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
首先,注册机不能在普通用户的XP下运行, 这个因为用vc 9.0的原因!

另外,不能提供正确的注册码!问题:
l1=l-4;

p=&str[4];
for(i=l1;i<l;i++)   
     printf("%c",str[i]);
2009-9-19 07:31
0
雪    币: 88
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
不是吧? 我的系统就是xp 可以运行的,我输入的那组注册码也正确
2009-9-19 11:37
0
雪    币: 208
活跃值: (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
那是因为你的XP系统装了 VC 9.0,需要的库都有了,不安装visual studio的话,是运行不了的,一般用户不会安装的!

你输入的那个用户名是可以的,因为它正好是7位,但是你换个非7位的用户名试一下

问题就出在这里
l1=l-4;

p=&str[4];
for(i=l1;i<l;i++)   
     printf("%c",str[i]);
2009-9-19 21:04
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
printf("用户名必须为七位\n");
2009-9-19 21:07
0
雪    币: 88
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
哦 谢谢你 代码已经改正
2009-9-20 09:25
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
17
support
2009-9-20 10:33
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢!很适合新手啊!
2009-9-23 08:29
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
新手在此感谢了
2009-9-26 10:32
0
雪    币: 130
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
努力中...............
2009-10-4 19:19
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
为什么我用OD载入后设好断点一运行就会终止在ntdll里面,我也用插件隐藏OD了啊
2009-11-15 16:16
0
雪    币: 88
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
你先打开OD 然后附加那个文件,这样应该可以
2009-11-16 09:58
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
好的可以了,谢谢啊
2009-11-16 10:31
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
24
没跑飞.下断点也没问题啊.
2009-11-16 10:41
0
雪    币: 197
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
很不错啊,支持下
2009-11-18 16:06
0
游客
登录 | 注册 方可回帖
返回
//