飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7703|回复: 8

[原创] 菜鸟破文:一个简单crackme的注册码分析

[复制链接]

该用户从未签到

发表于 2007-2-28 01:04:05 | 显示全部楼层 |阅读模式
【文章标题】: 一个简单crackme的注册码分析
【文章作者】: windale(夜风)
【作者QQ号】: 717844727
【软件名称】: CrackMe1.Exe
【软件大小】: 11.5 KB
【下载地址】: http://www.live-share.com/files/167596/CrackMe1.Exe.html(此crackme由Proudhao提供,点我查看
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VB
【使用工具】: PEiD, OllyDbg 1.10
【操作平台】: WinXP SP2
【软件介绍】: 一个十分简单的crackme
【作者声明】: 我是一只很菜的菜鸟,这是我第一次破掉crackme、第一次追出注册码算法、第一次写破文。写这篇破文,目的是与像我这样的新手分享一下我的破解经验,同时希望得到高手的赐教。
--------------------------------------------------------------------------------
【详细过程】
先用PEiD查壳,没有加壳,用VB写的。运行一下,随便输入注册码,点OK后出现错误提示"you get wrong try again"。


退出程序,用OD载入,插件->超级字符串参考,找到"you get wrong",双击后来到这里:

004025E5   > \68 C81B4000   PUSH CrackMe1.00401BC8                ;  you get wrong
004025EA   .  68 9C1B4000   PUSH CrackMe1.00401B9C                ;  \n\n
004025EF   .  FFD7          CALL EDI
004025F1   .  8BD0          MOV EDX,EAX
004025F3   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
004025F6   .  FFD3          CALL EBX
004025F8   .  50            PUSH EAX
004025F9   .  68 E81B4000   PUSH CrackMe1.00401BE8                ;  try again


往上看,找到注册成功的提示"you get it",上面紧接着一个条件跳转,满足条件则跳到后面提示注册失败的地方,否则继续执行,提示注册成功。因此判断这个是关键跳转:

00402569   .  83C4 0C       ADD ESP,0C
0040256C   .  B9 04000280   MOV ECX,80020004
00402571   .  B8 0A000000   MOV EAX,0A
00402576   .  894D 9C       MOV DWORD PTR SS:[EBP-64],ECX
00402579   .  66:85F6       TEST SI,SI                            ;  检测是否为0,是则跳转到注册码错误提示,否则注册成功:
0040257C   .  8945 94       MOV DWORD PTR SS:[EBP-6C],EAX
0040257F   .  894D AC       MOV DWORD PTR SS:[EBP-54],ECX
00402582   .  8945 A4       MOV DWORD PTR SS:[EBP-5C],EAX
00402585   .  894D BC       MOV DWORD PTR SS:[EBP-44],ECX
00402588   .  8945 B4       MOV DWORD PTR SS:[EBP-4C],EAX
0040258B      74 58         JE SHORT CrackMe1.004025E5            ;  关键跳转(将JE改为JNE即实现暴破,但我们的目的是分析注册算法,因此不必管它).
0040258D   .  68 801B4000   PUSH CrackMe1.00401B80                ;  you get it
00402592   .  68 9C1B4000   PUSH CrackMe1.00401B9C                ;  \n\n
00402597   .  FFD7          CALL EDI
00402599   .  8BD0          MOV EDX,EAX
0040259B   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
0040259E   .  FFD3          CALL EBX
004025A0   .  50            PUSH EAX
004025A1   .  68 A81B4000   PUSH CrackMe1.00401BA8                ;  KeyGen it now


继续往上看,找到一处调用,调用的是字符串比较函数,而且紧挨着关键跳转,因此判断是真假注册码的比较:

00402533   .  FF15 28414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrCmp>]         ;  比较真假注册码,结果存入ESI,相同为0,不同为-1:
00402539   .  8BF0          MOV ESI,EAX
0040253B   .  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
0040253E   .  F7DE          NEG ESI                                             ;  求补码.
00402540   .  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
00402543   .  52            PUSH EDX
00402544   .  1BF6          SBB ESI,ESI                                         ;  带借位减.
00402546   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]
00402549   .  50            PUSH EAX
0040254A   .  46            INC ESI                                             ;  加1.
0040254B   .  51            PUSH ECX
0040254C   .  6A 03         PUSH 3
0040254E   .  F7DE          NEG ESI                                             ;  求补码.
00402550   .  FF15 5C414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaFreeStrList>]    ;  MSVBVM50.__vbaFreeStrList
00402556   .  83C4 10       ADD ESP,10
00402559   .  8D55 D8       LEA EDX,DWORD PTR SS:[EBP-28]
0040255C   .  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
0040255F   .  52            PUSH EDX
00402560   .  50            PUSH EAX
00402561   .  6A 02         PUSH 2
00402563   .  FF15 F4404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaFreeObjList>]    ;  MSVBVM50.__vbaFreeObjList
00402569   .  83C4 0C       ADD ESP,0C
0040256C   .  B9 04000280   MOV ECX,80020004
00402571   .  B8 0A000000   MOV EAX,0A
00402576   .  894D 9C       MOV DWORD PTR SS:[EBP-64],ECX
00402579   .  66:85F6       TEST SI,SI                                          ;  检测是否为0,是则跳转到注册码错误提示,否则注册成功:
0040257C   .  8945 94       MOV DWORD PTR SS:[EBP-6C],EAX
0040257F   .  894D AC       MOV DWORD PTR SS:[EBP-54],ECX
00402582   .  8945 A4       MOV DWORD PTR SS:[EBP-5C],EAX
00402585   .  894D BC       MOV DWORD PTR SS:[EBP-44],ECX
00402588   .  8945 B4       MOV DWORD PTR SS:[EBP-4C],EAX
0040258B      74 58         JE SHORT CrackMe1.004025E5                          ;  关键跳转.


再往上看,没有发现什么明显的东西,只有几个字符串操作函数和一些其他的函数调用。不熟悉VB的函数,但在这几处函数调用最开始的地方发现一个函数__vbaObjSet,从名字上看似乎是用来初始化的。于是试着在此处下断点,然后F9运行,看能否得到有用的信息,输入name,随意输入注册码,点OK后程序在这里被断下来:

00402382   .  8D4D D4       LEA ECX,DWORD PTR SS:[EBP-2C]                 ;  在此处下断点.
00402385   .  50            PUSH EAX
00402386   .  51            PUSH ECX
00402387   .  FF15 0C414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaObjSet>]   ;  MSVBVM50.__vbaObjSet


接着一路按F8步过,走了很久也没有什么情况出现。直到运行0040240F处后,寄存器窗口中出现了前面输入的name的字符串。于是接下来慢按F8,结合寄存器窗口中的数据一步一步地分析语句,最终得到以下分析结果:

00402409   > \8B95 50FFFFFF MOV EDX,DWORD PTR SS:[EBP-B0]
0040240F   .  8B45 E4       MOV EAX,DWORD PTR SS:[EBP-1C]               ;  此处将读取到的name存入EAX中.
00402412   .  50            PUSH EAX
00402413   .  8B1A          MOV EBX,DWORD PTR DS:[EDX]
00402415   .  FF15 E4404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaLenBstr>];  计算name长度,存入EDI,我们将其记为A:
0040241B   .  8BF8          MOV EDI,EAX
0040241D   .  8B4D E8       MOV ECX,DWORD PTR SS:[EBP-18]
00402420   .  69FF FB7C0100 IMUL EDI,EDI,17CFB                          ;  用A乘以0x17CFB,结果存入EDI,我们将其记为B:
00402426   .  51            PUSH ECX
00402427   .  0F80 91020000 JO CrackMe1.004026BE
0040242D   .  FF15 F8404000 CALL DWORD PTR DS:[<&MSVBVM50.#516>]        ;  name首个字符的ASCII码,存入EDX,我们将其记为C:
00402433   .  0FBFD0        MOVSX EDX,AX
00402436   .  03FA          ADD EDI,EDX                                 ;  计算B+C,结果存入EDI,我们将其记为D:
00402438   .  0F80 80020000 JO CrackMe1.004026BE
0040243E   .  57            PUSH EDI
0040243F   .  FF15 E0404000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrI4>]  ;  将D的十进制形式转换为字符串:
00402445   .  8BD0          MOV EDX,EAX
00402447   .  8D4D E0       LEA ECX,DWORD PTR SS:[EBP-20]


看来这就应该是真注册码的计算过程。可是接着往下,发现对name的计算操作到此为止,寄存器窗口中也没有发现有用的数据。试着将字符串D作为注册码填入,结果注册失败。这时突然想起来,一开始查找参考字符串时注意到有个"aka-",接着从关键跳转处往上找的时候发现"aka-"下面紧跟着一个貌似连接字符串的函数__vbaStrCat。于是现在往下找,找到了这个地方,并且在它下面就是比较真假注册码。隐约感觉到离成功不远了。于是马上在上面一处下断点,运行到断点后F8步过,分析后得到了真注册码:

00402510   > \8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]                          ;  在这里下断.
00402513   .  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]
00402516   .  8B3D 00414000 MOV EDI,DWORD PTR DS:[<&MSVBVM50.__vbaStrCat>]         ;  将"AKA-"与前面得到的字符串D连接起来,得到真注册码:
0040251C   .  50            PUSH EAX
0040251D   .  68 701B4000   PUSH CrackMe1.00401B70                                 ;  aka-
00402522   .  51            PUSH ECX
00402523   .  FFD7          CALL EDI                                               ;  <&MSVBVM50.__vbaStrCat>
00402525   .  8B1D 70414000 MOV EBX,DWORD PTR DS:[<&MSVBVM50.__vbaStrMove>]        ;  MSVBVM50.__vbaStrMove
0040252B   .  8BD0          MOV EDX,EAX
0040252D   .  8D4D E0       LEA ECX,DWORD PTR SS:[EBP-20]
00402530   .  FFD3          CALL EBX                                               ;  <&MSVBVM50.__vbaStrMove>
00402532   .  50            PUSH EAX
00402533   .  FF15 28414000 CALL DWORD PTR DS:[<&MSVBVM50.__vbaStrCmp>]            ;  比较真假注册码.


重新运行程序,将得到的真注册码填入,果然注册成功。


总结注册码算法如下:
name长度乘以97531(=16进制的17CFB),再加上name首字符的ASCII码值,然后在得到的数前面加上"AKA-",就是最后的注册码。
例如:
我在name中填的是windale,长度为7,w的ASCII码是119。7*97531+119=682836,因此正确的注册码就是AKA-682836。


最后又用几组name和注册码测试,都可以成功注册。因此这次破解过程到此结束。


由于本人太菜,不会写注册机,所以就不写了,留给大家练习吧。
由于本人是第一次,水平很有限,如果有什么错误请尽管指出,我一定会虚心学习。


最最后,我想说的是,只要你有决心+信心+耐心,就没有你做不到的事情!

[ 本帖最后由 windale 于 2007-2-28 01:43 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2022-12-19 19:56
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2007-2-28 13:48:53 | 显示全部楼层
    比较详细,非常值得学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-1 10:58:31 | 显示全部楼层
    文章内容非富,还有注释.
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-4 10:24:46 | 显示全部楼层
    呵呵
    支持啊。。。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-4 14:09:16 | 显示全部楼层
    详细,学习,呵呵
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1563 天

    [LV.Master]伴坛终老

    发表于 2007-3-4 17:01:48 | 显示全部楼层
    经典破解,学习了,感谢分享。/:D
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-6 10:54:56 | 显示全部楼层
    不错,简单明了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-6 21:08:34 | 显示全部楼层
    不错嘛,我还不会。向楼主学习。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-3-14 16:35:31 | 显示全部楼层
    厉害啊,我支持啊
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表