首页
社区
课程
招聘
[原创]适合新手的CrackMe算法分析(处男秀)
发表于: 2010-2-12 17:47 4645

[原创]适合新手的CrackMe算法分析(处男秀)

2010-2-12 17:47
4645

【文章标题】: 超菜的CrackMe算法分析
【文章作者】: forget
【作者邮箱】: 120977727@qq.com
【作者主页】: 不明
【软件下载】: 不详
【软件名称】: 只是供学习的crackme
【加壳方式】: 无
【保护方式】: NO 有
【使用工具】: OllyICE
【文章日期】: 2010.2.12
本人给大家提前拜年了!
祝愿大家在新的一年里身体健康,虎虎生威。
心情愉悦,合家幸福!


1、拿到软件先运行,了解到它是以输入name和serial的方式进行保护的,输错有错误提示。
2、查壳,无壳。不是重点,就选了一个没壳的。
3、用OllyICE打开,点运行程序
4.查找--->所有参考字符串(眼睛一亮发现文本ASCII "That isn't it, keep on trying..."
5.双击进入。
[LEFT]00425040  /.  55            push    ebp
00425041  |.  8BEC          mov     ebp, esp
00425043  |.  33C9          xor     ecx, ecx
00425045  |.  51            push    ecx
00425046  |.  51            push    ecx
00425047  |.  51            push    ecx
00425048  |.  51            push    ecx
00425049  |.  53            push    ebx
0042504A  |.  56            push    esi
0042504B  |.  57            push    edi
0042504C  |.  8BD8          mov     ebx, eax
0042504E  |.  33C0          xor     eax, eax
00425050  |.  55            push    ebp
00425051  |.  68 11514200   push    00425111
00425056  |.  64:FF30       push    dword ptr fs:[eax]
00425059  |.  64:8920       mov     dword ptr fs:[eax], esp
0042505C  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
0042505F  |.  8B83 B8010000 mov     eax, dword ptr [ebx+1B8]
00425065  |.  E8 96C9FEFF   call    00411A00
0042506A  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
0042506D  |.  8B83 BC010000 mov     eax, dword ptr [ebx+1BC]
00425073  |.  E8 88C9FEFF   call    00411A00
00425078  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ;  假注册码
0042507B  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
0042507E  |.  E8 71D7FDFF   call    004027F4
00425083  |.  8BF0          mov     esi, eax
00425085  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00425088  |.  E8 13010000   call    004251A0                         ;  算法
0042508D  |.  8BF8          mov     edi, eax                         ;  edi=0AE27680
0042508F  |.  3BFE          cmp     edi, esi                         ;  比较是不是等于0AE27680
00425091  |.  74 18         je      short 004250AB            ;跳就完蛋
00425093  |.  6A 00         push    0
00425095  |.  B9 20514200   mov     ecx, 00425120                    ;  ASCII "cyT0m!c's CrackMe #1"
0042509A  |.  BA 38514200   mov     edx, 00425138                    ;  ASCII "That isn't it, keep on trying..."
0042509F  |.  A1 28764200   mov     eax, dword ptr [427628]
004250A4  |.  E8 23CAFFFF   call    00421ACC
004250A9  |.  EB 16         jmp     short 004250C1
004250AB  |>  6A 00         push    0
004250AD  |.  B9 20514200   mov     ecx, 00425120                    ;  ASCII "cyT0m!c's CrackMe #1"
004250B2  |.  BA 5C514200   mov     edx, 0042515C                    ;  ASCII "Hey, you have done it"
004250B7  |.  A1 28764200   mov     eax, dword ptr [427628]

跟进call    004251A0              

004251A0  /$  53            push    ebx
004251A1  |.  89C3          mov     ebx, eax                         ;  bx=用户名
004251A3  |.  83FB 00       cmp     ebx, 0                           ;  比较用户名是否为空
004251A6  |.  74 13         je      short 004251BB                   ;  为空就跳了
004251A8  |.  B8 01000000   mov     eax, 1                           ;  eax=1
004251AD  |.  31C9          xor     ecx, ecx                         ;  ecx清0
004251AF  |>  8A0B          /mov     cl, byte ptr [ebx]              ;  提取假注册码的第一位
004251B1  |.  80F9 00       |cmp     cl, 0                           ;  比较ASCII码
004251B4  |.  74 05         |je      short 004251BB
004251B6  |.  F7E1          |mul     ecx                             ;  eax*ecx
004251B8  |.  43            |inc     ebx                             ;  提取下一位注册码
004251B9  |.^ EB F4         \jmp     short 004251AF
004251BB  |>  25 FFFFFF0F   and     eax, 0FFFFFFF                    ;  CAE27680+0FFFFFFF
004251C0  |.  5B            pop     ebx                              ;  009D2314

[/LEFT]

算法思路。提取用户名的每一个啊斯克马值.进行相乘
最后得出来的值和0FFFFFFF       相加.再转换在10进制 最后得出来的结果就是注册码

注册机:

   long sum=1;
   for (int i=0;i<=strlen(user);i++)
   {
           sum=sum*user[i];
          

   }
   sum=sum+0x0FFFFFFF;
   printf("%d",sum);
   getchar();

本人第一次写破文。如果有不好的地方。大家别笑撒。。。


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
终于潜不下去了,支持
2010-2-12 17:56
0
雪    币: 695
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
lz你也新年快乐哦,顺便膜拜ls的大侠~~
2010-2-12 21:13
0
游客
登录 | 注册 方可回帖
返回
//