WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 3614查看
  • 5回复

主题

好友

604

积分

高级会员

发表于 2009-12-21 11:39:09 |显示全部楼层
【文章标题】: 终于找到一个最适合新手的Crackme(算法分析+注册机)
【文章作者】: qwgboy2000
【作者邮箱】: qwgboy2000@126.com
【作者主页】: http://mland.icpcn.com/
【作者QQ号】: 27141459
【软件名称】: AD_CM#2.exe
【软件大小】: 4K
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: name、Serial
【编写语言】: MASM32/TASM32
【使用工具】: PEiD、OD
【操作平台】: WINXP
【软件介绍】: 从www.crackme.de上找来的一个简单crackme
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先用PEiD查看无壳 ;)

OD载入,熟悉大致流程以后,按下CTRL+N,出现以下部分:

名称位于 AD_CM#2
地址     区段     类型   (已知)     名称                         注释
00402020   .rdata   输入   (已知)       USER32.DialogBoxParamA
00402018   .rdata   输入   (已知)       USER32.EndDialog
00402004   .rdata   输入   (已知)       KERNEL32.ExitProcess
00402010   .rdata   输入   (已知)       USER32.GetDlgItem
0040200C   .rdata   输入   (已知)       USER32.GetDlgItemTextA       ;应该就是它了
00402000   .rdata   输入   (已知)       KERNEL32.GetModuleHandleA
0040201C   .rdata   输入   (已知)       USER32.MessageBoxA
00402024   .rdata   输入   (已知)       USER32.SendMessageA
00402014   .rdata   输入   (已知)       USER32.SetFocus
00401000   .text     输出             <模块入口点>

看到以上的内容,不难知道下什么断点了
Command: bpx getdlgitemtexta

按下F9运行程序,输入name和Serial
我name=qwgboy2000、Serial=7878781234确定以后

中断到了以下关键部分

004010FC /$ 55         push   ebp
004010FD |. 8BEC       mov   ebp, esp
004010FF |. 6A 14       push   14                   ; /Count = 14 (20.)
00401101 |. 68 80304000   push   00403080               ; |Buffer = AD_CM#2.00403080
00401106 |. 68 B80B0000   push   0BB8                   ; |ControlID = BB8 (3000.)
0040110B |. FF75 08     push   dword ptr [ebp+8]         ; |hWnd
0040110E |. E8 77000000   call   <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401113 |. 8BF0       mov   esi, eax
00401115 |. 8D01       lea   eax, [ecx]
00401117 |. 83FE 05     cmp   esi, 5                 ; 比较name是否大于等于5个字符,小于则game over
0040111A |. 7D 18       jge   short 00401134
0040111C |. 6A 40       push   40                   ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0040111E |. 68 12304000   push   00403012               ; |Title = "ArturDents CrackMe#2"
00401123 |. 68 44304000   push   00403044               ; |Text = "Your name must be at least five characters
long!"
00401128 |. FF75 08     push   dword ptr [ebp+8]         ; |hOwner
0040112B |. E8 60000000   call   <jmp.&USER32.MessageBoxA>     ; \MessageBoxA
00401130 |. 33C0       xor   eax, eax
00401132 |. EB 40       jmp   short 00401174
00401134 |> 6A 14       push   14                   ; /Count = 14 (20.)
00401136 |. 68 80324000   push   00403280               ; |Buffer = AD_CM#2.00403280
0040113B |. 68 B90B0000   push   0BB9                   ; |ControlID = BB9 (3001.)
00401140 |. FF75 08     push   dword ptr [ebp+8]         ; |hWnd
00401143 |. E8 42000000   call   <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401148 |. B8 80304000   mov   eax, 00403080             ; ASCII "qwgboy2000"
0040114D |. BB 80324000   mov   ebx, 00403280             ; ASCII "7878781234"
00401152 |. 8BCE       mov   ecx, esi               ; 准备循环了,循环次数为name长度
00401154 |> 8A10       /mov   dl, [eax]               ; 依次开始从name的第一个字符取起
00401156 |. 2AD1       |sub   dl, cl                 ; 新字符=原来字符-循环剩下的次数,第一次为name长度
00401158 |. 3813       |cmp   [ebx], dl               ; 新字符和Serial的对应字符进行比较
0040115A |. 75 18       |jnz   short 00401174           ; 如果不相同,则game over(从这里我们可以知道name和

Serial
字符长度相同)
0040115C |. 40         |inc   eax                   ; eax=eax+1,为取下一个字符进行下一次的循环运算做好准备
0040115D |. 43         |inc   ebx                   ; ebx=ebx+1,为取下一个Serial进行下一次的比较做好准备
0040115E |.^ E2 F4       \loopd   short 00401154           ; 循环
00401160 |. 6A 40       push   40                   ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401162 |. 68 12304000   push   00403012               ; |Title = "ArturDents CrackMe#2"
00401167 |. 68 27304000   push   00403027               ; |Text = "Yeah, you did it!"
0040116C |. FF75 08     push   dword ptr [ebp+8]         ; |hOwner
0040116F |. E8 1C000000   call   <jmp.&USER32.MessageBoxA>     ; \MessageBoxA
00401174 |> C9         leave
00401175 \. C2 0400     retn   4

--------------------------------------------------------------------------------
【经验总结】
这个crackme绝对是新手拿来练习的好东东

程序首先判断输入的name长度,只有大于等于5才可以
且Serial长度和name长度是相等的
算法很简单:Serial的每个字符=name对应的字符-对应长度
本人name:qwgboy2000
那么Serial依次应该为:q-10、w-9、g-8、b-7、o-6、y-5、2-4、0-3、0-2、0-1
即Serial:gn_[it.-./

注册机部分如下:
#include"string.h"
main()
{
  char name[32];
  int i,j;
  printf("please input your name:");
  scanf("%s",name);
  i=strlen(name);
  if(i<5)
  {
  printf("Your name must be at least five characters\n");
  printf("please input your name again:");
  scanf("%s",name);
  i=strlen(name);
  }
  printf("your Serial is:");
  for(i;i>=1;i--)
  {
  j=strlen(name)-i;
  printf("%c",name[j]-i);
  }
}
以上程序TC2.0调试通过


--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

主题

好友

52

积分

注册会员

发表于 2010-5-29 23:41:20 |显示全部楼层
好贴子,就是看不懂。。。。
回复

使用道具 举报

主题

好友

12

积分

新手上路

发表于 2010-9-17 22:20:58 |显示全部楼层
[quote][/quote]
回复

使用道具 举报

主题

好友

44

积分

新手上路

发表于 2011-3-31 19:51:01 |显示全部楼层
说句实话 我真的看不懂
回复

使用道具 举报

主题

好友

80

积分

注册会员

发表于 2013-6-4 22:04:07 |显示全部楼层
看不懂,还没学会
回复

使用道具 举报

主题

好友

32

积分

新手上路

发表于 2013-6-11 17:18:40 |显示全部楼层
说的是用OD调入然后脱壳找程序入口,谢谢分享经验
回复

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-4 00:06 , Processed in 0.072750 second(s), 16 queries .

返回顶部