首页
社区
课程
招聘
[原创]bxm CrackMe7算法简析
2007-5-14 02:04 6522

[原创]bxm CrackMe7算法简析

2007-5-14 02:04
6522
【文章标题】: bxm CrackMe7算法简析
【文章作者】: hawking
【作者邮箱】: [EMAIL="rich_hawking@hotmail.com"]rich_hawking@hotmail.com[/EMAIL]
【软件名称】: CrackMe.bxm.VC6.07.exe
【软件大小】: 20.0KB
【下载地址】: http://bbs.pediy.com/showthread.php?t=44465
【加壳方式】: 无
【编写语言】: VC6
【使用工具】: OD
【操作平台】: 2k
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】


  看了一下bxm的第7个Crackme,感觉难度不大,而且思路很清晰,可以作为我等初入门的新手进行算法分析的好教材。

  看图标就知道了程序是MFC的,运行程序,当注册码输入不正确时,有明显的提示。我们用mfcspy查看一下程序窗口,可以看到下面的信息。
  
  message map=004022E8(CrackMe.bxm.VC6.07.exe+0022E8)
  msg map entries at 004022F0(CrackMe.bxm.VC6.07.exe+0022F0)
  OnMsg:WM_SYSCOMMAND(0112),func=00401430(CrackMe.bxm.VC6.07.exe+001430)
  OnMsg:WM_PAINT(000f),func=004014B0(CrackMe.bxm.VC6.07.exe+0014B0)
  OnMsg:WM_QUERYDRAGICON(0037),func=00401570(CrackMe.bxm.VC6.07.exe+001570)
  OnCommand: notifycode=0000 id=03ea,func=00401640(CrackMe.bxm.VC6.07.exe+001640)
  
  可以看出点击验证按钮后程序会从00401640处开始运行。我们直接在00401640处F2下断点,随便输入用户名及注册码,点击验证按钮后程序断下。
  
  00401640   .  83EC 3C       sub     esp, 3C
  00401643   .  53            push    ebx
  00401644   .  56            push    esi
  00401645   .  57            push    edi
  00401646   .  8BD9          mov     ebx, ecx
  00401648   .  6A 01         push    1
  0040164A   .  E8 65030000   call    <jmp.&MFC42.#6334>                         ;  取用户名和注册码
  0040164F   .  8B7B 64       mov     edi, dword ptr [ebx+64]
  00401652   .  8B47 F8       mov     eax, dword ptr [edi-8]                     ;  注册码长度len
  00401655   .  83F8 10       cmp     eax, 10
  00401658   .  0F85 12010000 jnz     00401770                                   ;  len必须等于16,否则失败
  0040165E   .  83C9 FF       or      ecx, FFFFFFFF
  00401661   .  33C0          xor     eax, eax
  00401663   .  F2:AE         repne   scas byte ptr es:[edi]
  00401665   .  F7D1          not     ecx                                        ;  以上4句取注册码长度 ecx结果为注册码长度+1
  00401667   .  2BF9          sub     edi, ecx
  00401669   .  8D5424 20     lea     edx, dword ptr [esp+20]
  0040166D   .  8BC1          mov     eax, ecx
  0040166F   .  8BF7          mov     esi, edi
  00401671   .  8BFA          mov     edi, edx
  00401673   .  6A 10         push    10
  00401675   .  C1E9 02       shr     ecx, 2
  00401678   .  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
  0040167A   .  8BC8          mov     ecx, eax
  0040167C   .  83E1 03       and     ecx, 3
  0040167F   .  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]     ;  以上6句从ESI向EDI复制10个字符
  00401681   .  8D4C24 24     lea     ecx, dword ptr [esp+24]
  00401685   .  51            push    ecx
  00401686   .  E8 45FFFFFF   call    004015D0                                    ;  如果注册码全部为十六进制字符大写形式则返回1,否则返回0
  0040168B   .  83C4 08       add     esp, 8
  0040168E   .  85C0          test    eax, eax                                    ;  注册码必须全部为十六进制大写形式字符
  00401690   .  0F84 DA000000 je      00401770
  00401696   .  8B7B 60       mov     edi, dword ptr [ebx+60]
  00401699   .  83C9 FF       or      ecx, FFFFFFFF
  0040169C   .  33C0          xor     eax, eax
  0040169E   .  8D5424 0C     lea     edx, dword ptr [esp+C]
  004016A2   .  F2:AE         repne   scas byte ptr es:[edi]
  004016A4   .  F7D1          not     ecx                                         ;  ECX值为用户名长度+1
  004016A6   .  2BF9          sub     edi, ecx
  004016A8   .  68 83FC0000   push    0FC83
  004016AD   .  8BC1          mov     eax, ecx
  004016AF   .  8BF7          mov     esi, edi
  004016B1   .  8BFA          mov     edi, edx
  004016B3   .  6A 0B         push    0B
  004016B5   .  C1E9 02       shr     ecx, 2
  004016B8   .  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
  004016BA   .  8BC8          mov     ecx, eax
  004016BC   .  83E1 03       and     ecx, 3
  004016BF   .  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]      ;  复制用户名字符串
  004016C1   .  8D4C24 28     lea     ecx, dword ptr [esp+28]                     ;  注册码
  004016C5   .  51            push    ecx
  004016C6   .  E8 45FFFFFF   call    00401610                                    ;  取注册码第1--4位并转换成十六进制数字
  004016CB   .  83C4 04       add     esp, 4
  004016CE   .  50            push    eax
  004016CF   .  E8 ACFEFFFF   call    00401580                                    ;  对注册码前4位数字进行计算
  004016D4   .  0FBE5424 18   movsx   edx, byte ptr [esp+18]                      ;  用户名第1位字符 name[0]
  004016D9   .  83C4 0C       add     esp, 0C
  004016DC   .  3BC2          cmp     eax, edx
  004016DE   .  0F85 8C000000 jnz     00401770                                    ;  对注册码前4位数字进行计算的结果必须等于用户名的首个字符,否则失败
  004016E4   .  68 83FC0000   push    0FC83
  004016E9   .  8D4424 28     lea     eax, dword ptr [esp+28]
  004016ED   .  6A 0B         push    0B
  004016EF   .  50            push    eax
  004016F0   .  E8 1BFFFFFF   call    00401610                                    ;  取注册码第5--8位并转换成十六进制数字
  004016F5   .  83C4 04       add     esp, 4
  004016F8   .  50            push    eax
  004016F9   .  E8 82FEFFFF   call    00401580                                    ;  对注册码第5--8位数字进行计算
  004016FE   .  0FBE4C24 19   movsx   ecx, byte ptr [esp+19]                      ;  用户名第2位字符 name[1]
  00401703   .  83C4 0C       add     esp, 0C
  00401706   .  3BC1          cmp     eax, ecx
  00401708   .  75 66         jnz     short 00401770                              ;  对注册码第5--8位数字数字进行计算的结果必须等于用户名的第2个字符,否则失败
  0040170A   .  68 83FC0000   push    0FC83
  0040170F   .  8D5424 2C     lea     edx, dword ptr [esp+2C]
  00401713   .  6A 0B         push    0B
  00401715   .  52            push    edx
  00401716   .  E8 F5FEFFFF   call    00401610                                    ;  取注册码第9--12位并转换成十六进制数字
  0040171B   .  83C4 04       add     esp, 4
  0040171E   .  50            push    eax
  0040171F   .  E8 5CFEFFFF   call    00401580                                    ;  对注册码第9--12位数字进行计算
  00401724   .  0FBE4C24 1A   movsx   ecx, byte ptr [esp+1A]                      ;  用户名第3位字符 name[2]
  00401729   .  83C4 0C       add     esp, 0C
  0040172C   .  3BC1          cmp     eax, ecx
  0040172E   .  75 40         jnz     short 00401770                              ;  对注册码第9--12位数字进行计算的结果必须等于用户名的第3个字符,否则失败
  00401730   .  68 83FC0000   push    0FC83
  00401735   .  8D5424 30     lea     edx, dword ptr [esp+30]
  00401739   .  6A 0B         push    0B
  0040173B   .  52            push    edx
  0040173C   .  E8 CFFEFFFF   call    00401610                                    ;  取注册码第13--16位并转换成十六进制数字
  00401741   .  83C4 04       add     esp, 4
  00401744   .  50            push    eax
  00401745   .  E8 36FEFFFF   call    00401580                                    ;  对注册码第13-16位数字进行计算
  0040174A   .  0FBE4C24 1B   movsx   ecx, byte ptr [esp+1B]                      ;  用户名第4位字符 name[3]
  0040174F   .  83C4 0C       add     esp, 0C
  00401752   .  3BC1          cmp     eax, ecx
  00401754   .  75 1A         jnz     short 00401770                              ;  对注册码第13-16位数字进行计算的结果必须等于用户名的第4个字符,否则失败
  00401756   .  6A 00         push    0
  00401758   .  68 38304000   push    00403038
  0040175D   .  68 2C304000   push    0040302C
  00401762   .  8BCB          mov     ecx, ebx
00401764   .  E8 45020000   call    <jmp.&MFC42.#4224>                          ;  成功
00401769   .  5F            pop     edi
0040176A   .  5E            pop     esi
0040176B   .  5B            pop     ebx
0040176C   .  83C4 3C       add     esp, 3C
0040176F   .  C3            retn
00401770   >  6A 00         push    0
00401772   .  6A 00         push    0
00401774   .  68 20304000   push    00403020
00401779   .  8BCB          mov     ecx, ebx
0040177B   .  E8 2E020000   call    <jmp.&MFC42.#4224>                          ;  失败
00401780   .  5F            pop     edi
00401781   .  5E            pop     esi
00401782   .  5B            pop     ebx
00401783   .  83C4 3C       add     esp, 3C
00401786   .  C3            retn
  
  004015D0  /$  56            push    esi
  004015D1  |.  57            push    edi
  004015D2  |.  8B7C24 10     mov     edi, dword ptr [esp+10]                     ;  注册码长度
  004015D6  |.  33D2          xor     edx, edx
  004015D8  |.  85FF          test    edi, edi                                    ;  如果注册码长度为0的话则直接返回0
  004015DA  |.  B8 01000000   mov     eax, 1
  004015DF  |.  7E 25         jle     short 00401606
  004015E1  |.  8B7424 0C     mov     esi, dword ptr [esp+C]
  004015E5  |>  8A0C32        /mov     cl, byte ptr [edx+esi]
  004015E8  |.  80F9 30       |cmp     cl, 30
  004015EB  |.  7C 17         |jl      short 00401604                             ;  不能小于0
  004015ED  |.  80F9 46       |cmp     cl, 46
  004015F0  |.  7F 12         |jg      short 00401604                             ;  不能大于F
  004015F2  |.  80F9 39       |cmp     cl, 39
  004015F5  |.  7E 05         |jle     short 004015FC                             ;  小于等于9
  004015F7  |.  80F9 41       |cmp     cl, 41
  004015FA  |.  7C 08         |jl      short 00401604                             ;  不能小于A
  004015FC  |>  42            |inc     edx
  004015FD  |.  3BD7          |cmp     edx, edi
  004015FF  |.^ 7C E4         \jl      short 004015E5
  00401601  |.  5F            pop     edi
  00401602  |.  5E            pop     esi
  00401603  |.  C3            retn                                                ;  返回1
  00401604  |>  33C0          xor     eax, eax                                    ;  返回0
  00401606  |>  5F            pop     edi
  00401607  |.  5E            pop     esi
  00401608  \.  C3            retn
  
  00401610  /$  8B5424 04     mov     edx, dword ptr [esp+4]                      ;  注册码
  00401614  |.  56            push    esi
  00401615  |.  33C0          xor     eax, eax
  00401617  |.  BE 04000000   mov     esi, 4
  0040161C  |>  8A0A          /mov     cl, byte ptr [edx]                         ;  key[i]
  0040161E  |.  C1E0 04       |shl     eax, 4                                     ;  eax * 10
  00401621  |.  80F9 39       |cmp     cl, 39
  00401624  |.  0FBEC9        |movsx   ecx, cl
  00401627  |.  7F 05         |jg      short 0040162E
  00401629  |.  83E9 30       |sub     ecx, 30                                    ;  字符转换成数字
  0040162C  |.  EB 03         |jmp     short 00401631
  0040162E  |>  83E9 37       |sub     ecx, 37
  00401631  |>  03C1          |add     eax, ecx                                   ;  累加eax
  00401633  |.  42            |inc     edx
  00401634  |.  4E            |dec     esi
  00401635  |.^ 75 E5         \jnz     short 0040161C                             ;  依次取注册码中的4位字符并转换成数字
  00401637  |.  5E            pop     esi
  00401638  \.  C3            retn
  
  00401580  /$  8B4C24 08     mov     ecx, dword ptr [esp+8]                      ;  ecx = 0B
  00401584  |.  56            push    esi
  00401585  |.  8B7424 08     mov     esi, dword ptr [esp+8]                      ;  4位一组的注册码转换后的数字
  00401589  |.  57            push    edi
  0040158A  |.  85C9          test    ecx, ecx
  0040158C  |.  BF 01000000   mov     edi, 1                                      ;  edi = 1
  00401591  |.  74 2F         je      short 004015C2
  00401593  |.  53            push    ebx
  00401594  |.  8B5C24 18     mov     ebx, dword ptr [esp+18]                     ;  0xFC83
  00401598  |>  F6C1 01       /test    cl, 1
  0040159B  |.  75 0F         |jnz     short 004015AC
  0040159D  |.  8BC6          |mov     eax, esi                                   ;  cl为偶数时来这里
  0040159F  |.  33D2          |xor     edx, edx
  004015A1  |.  0FAFC6        |imul    eax, esi
  004015A4  |.  D1E9          |shr     ecx, 1                                     ;  ecx>>1
  004015A6  |.  F7F3          |div     ebx
  004015A8  |.  8BF2          |mov     esi, edx                                   ;  esi = ( esi * esi ) % 0xFC83
  004015AA  |.  EB 0C         |jmp     short 004015B8
  004015AC  |>  8BC7          |mov     eax, edi                                   ;  cl为奇数时来这里
  004015AE  |.  33D2          |xor     edx, edx
  004015B0  |.  0FAFC6        |imul    eax, esi
  004015B3  |.  49            |dec     ecx                                        ;  ecx--
  004015B4  |.  F7F3          |div     ebx
  004015B6  |.  8BFA          |mov     edi, edx                                   ;  edi = ( edi * esi ) % 0FC83
  004015B8  |>  85C9          |test    ecx, ecx
  004015BA  |.^ 75 DC         \jnz     short 00401598                             ;  如果ECX不等于0则继续循环
  004015BC  |.  8BC7          mov     eax, edi                                    ;  返回edi
  004015BE  |.  5B            pop     ebx
  004015BF  |.  5F            pop     edi
  004015C0  |.  5E            pop     esi
  004015C1  |.  C3            retn
  004015C2  |>  8BC7          mov     eax, edi                                    ;  返回1
  004015C4  |.  5F            pop     edi
  004015C5  |.  5E            pop     esi
  004015C6  \.  C3            retn
  
  这个Crackme到这里就分析完了,这里可以看到很多常见的代码段,非常适合逆向新手仔细把玩。
  
  给组可用的注册码:
  name: hawking
  key : 60CF55022AE95DD6

  
  附上一个C#版的注册机。  
  
--------------------------------------------------------------------------------
【版权声明】: 感谢看雪论坛、一蓑烟雨, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年05月14日 1:51:32

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
打赏
分享
最新回复 (5)
雪    币: 333
活跃值: (116)
能力值: ( LV9,RANK:570 )
在线值:
发帖
回帖
粉丝
acafeel 14 2007-5-14 11:48
2
0
呵呵,和兄弟撞车了
厉害,很多细节都注意到了,学习!
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
bxm 29 2007-5-14 12:28
3
0
厉害啊,这么快就搞定了.
雪    币: 228
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
qianyicy 3 2007-5-14 22:59
4
0
厉害,了解了MFC程序怎么操作了,呵呵,
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
大菜一号 21 2007-5-17 09:15
5
0
哇靠```
hawking兄的手脚总这么快!!

帮你顶了`
雪    币: 87
活跃值: (1509)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
tzl 10 2007-5-17 16:12
6
0
分析的很精彩,学习了!
游客
登录 | 注册 方可回帖
返回