飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2715|回复: 4

[讨论] 对一crackme的不完全分析(已解决,感谢unpack网友)

[复制链接]

该用户从未签到

发表于 2008-3-19 08:26:52 | 显示全部楼层 |阅读模式
【文章标题】: 对一crackme的不完全分析
【文章作者】: gtboy
【作者邮箱】: lywbff@163.com
【作者主页】: 无
【作者QQ号】: 64879474
【软件名称】: dfcg教学用之crackme No3
【下载地址】: 附件
【加壳方式】: 无
【保护方式】: 序列号
【编写语言】: delphi
【使用工具】: peid,ollyice
【操作平台】: 盗版sp2
【软件介绍】: dfcg教学用之crackme No3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  对api下断,没有反应,很无奈,拿出dede,只有一个button1click事件,当然是它了。
  00459938   55                     push    ebp   
  用od在这里下断,注册,来到了关键位置。略去部分代码
  00459963  |.  E8 FCEFFDFF   call    00438964                                  ;  取用户名
  00459968  |.  8B45 EC       mov     eax, dword ptr [ebp-14]                   ;  放入eax
  0045996B  |.  E8 FCABFAFF   call    0040456C
  00459970  |.  8BF0          mov     esi, eax
  00459972  |.  33DB          xor     ebx, ebx
  00459974  |.  8BC6          mov     eax, esi
  00459976  |.  85C0          test    eax, eax
  00459978  |.  7E 21         jle     short 0045999B
  0045997A  |.  BA 01000000   mov     edx, 1
  0045997F  |>  69CE 8E91C621 /imul    ecx, esi, 21C6918E                       ;  用户名长度乘以21C6918E
  00459985  |.  03D9          |add     ebx, ecx
  00459987  |.  8B4D EC       |mov     ecx, dword ptr [ebp-14]
  0045998A  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]                ;  依次取用户名
  0045998F  |.  69C9 CE020000 |imul    ecx, ecx, 2CE
  00459995  |.  03D9          |add     ebx, ecx
  00459997  |.  42            |inc     edx
  00459998  |.  48            |dec     eax
  00459999  |.^ 75 E4         \jnz     short 0045997F
  0045999B  |>  8BC3          mov     eax, ebx                                  ;  计算结果放入eax
  0045999D  |.  99            cdq
  0045999E  |.  33C2          xor     eax, edx                                  ;  计算结果和0异或
  004599A0  |.  2BC2          sub     eax, edx
  004599A2  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
  004599A5  |.  E8 9AEBFAFF   call    00408544
  004599AA  |.  8BC6          mov     eax, esi
  004599AC  |.  85C0          test    eax, eax                                  ;  用户名不为空?
  004599AE  |.  7E 21         jle     short 004599D1
  004599B0  |.  BA 01000000   mov     edx, 1
  004599B5  |>  8B4D EC       /mov     ecx, dword ptr [ebp-14]
  004599B8  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]
  004599BD  |.  69C9 8E91C621 |imul    ecx, ecx, 21C6918E
  004599C3  |.  69C9 BC070000 |imul    ecx, ecx, 7BC
  004599C9  |.  03D9          |add     ebx, ecx                                 ;  累加
  004599CB  |.  2BDE          |sub     ebx, esi                                 ;  减去用户名的长度
  004599CD  |.  42            |inc     edx
  004599CE  |.  48            |dec     eax
  004599CF  |.^ 75 E4         \jnz     short 004599B5
  004599D1  |>  8BC3          mov     eax, ebx                                  ;  结果放入eax
  004599D3  |.  99            cdq
  004599D4  |.  33C2          xor     eax, edx                                  ;  计算结果和FFFFFFFF异或
  004599D6  |.  2BC2          sub     eax, edx                                  ;  加一
  004599D8  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
  004599DB  |.  E8 64EBFAFF   call    00408544                                  ;  可疑的call
  004599E0  |.  8BC6          mov     eax, esi
  004599E2  |.  85C0          test    eax, eax
  004599E4  |.  7E 1E         jle     short 00459A04
  004599E6  |.  BA 01000000   mov     edx, 1
  004599EB  |>  8B4D EC       /mov     ecx, dword ptr [ebp-14]
  004599EE  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]
  004599F3  |.  0FAFCE        |imul    ecx, esi
  004599F6  |.  69C9 C6040000 |imul    ecx, ecx, 4C6
  004599FC  |.  03D9          |add     ebx, ecx
  004599FE  |.  03DE          |add     ebx, esi
  00459A00  |.  42            |inc     edx
  00459A01  |.  48            |dec     eax
  00459A02  |.^ 75 E7         \jnz     short 004599EB
  00459A04  |>  81C3 8E91C621 add     ebx, 21C6918E                             ;  再加21C6918E
  00459A0A  |.  8BC3          mov     eax, ebx
  00459A0C  |.  99            cdq
  00459A0D  |.  33C2          xor     eax, edx
  00459A0F  |.  2BC2          sub     eax, edx
  00459A11  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
  00459A14  |.  E8 2BEBFAFF   call    00408544
  00459A19  |.  8D55 E8       lea     edx, dword ptr [ebp-18]
  00459A1C  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
  00459A1F  |.  8B80 04030000 mov     eax, dword ptr [eax+304]
  00459A25  |.  E8 3AEFFDFF   call    00438964                                  ;  取假码
  00459A2A  |.  8B45 E8       mov     eax, dword ptr [ebp-18]
  00459A2D  |.  50            push    eax                                       ;  假码放入eax
  00459A2E  |.  FF75 F8       push    dword ptr [ebp-8]
  00459A31  |.  68 A49A4500   push    00459AA4
  00459A36  |.  FF75 F4       push    dword ptr [ebp-C]
  00459A39  |.  68 A49A4500   push    00459AA4
  00459A3E  |.  FF75 F0       push    dword ptr [ebp-10]
  00459A41  |.  8D45 E4       lea     eax, dword ptr [ebp-1C]
  00459A44  |.  BA 05000000   mov     edx, 5
  00459A49  |.  E8 DEABFAFF   call    0040462C                                  ;  连接三段注册码
  00459A4E  |.  8B55 E4       mov     edx, dword ptr [ebp-1C]                   ;  真码放入edx
  00459A51  |.  58            pop     eax
  00459A52  |.  E8 59ACFAFF   call    004046B0                                  ;  比较call
  00459A57  |.  75 0A         jnz     short 00459A63                            ;  不跳就注册成功
  00459A59  |.  B8 B09A4500   mov     eax, 00459AB0
  00459A5E  |.  E8 E18CFDFF   call    00432744                                  ;  显示验证成功
  进入可疑的call
  00408544  /$  83C4 F8       add     esp, -8
  00408547  |.  6A 00         push    0
  00408549  |.  894424 04     mov     dword ptr [esp+4], eax
  0040854D  |.  C64424 08 00  mov     byte ptr [esp+8], 0
  00408552  |.  8D4C24 04     lea     ecx, dword ptr [esp+4]           ;  计算结果放入ecx
  00408556  |.  8BC2          mov     eax, edx
  00408558  |.  BA 70854000   mov     edx, 00408570                    ;  ASCII "%d"
  0040855D  |.  E8 5A0B0000   call    004090BC                         ;  计算call
  00408562  |.  59            pop     ecx
  00408563  |.  5A            pop     edx
  00408564  \.  C3            retn
  进入计算call,略去部分代码
  00409169  |.  8BCE          mov     ecx, esi
  0040916B  |.  91            xchg    eax, ecx
  0040916C  |.  E8 33B2FFFF   call    004043A4                         ;  生产注册码的call
  继续进入,略去部分代码
  004043AF  |.  E8 C4FFFFFF   call    00404378
  004043B4  |.  89F9          mov     ecx, edi
  004043B6  |.  89C7          mov     edi, eax
  004043B8  |.  85F6          test    esi, esi
  004043BA  |.  74 09         je      short 004043C5
  004043BC  |.  89C2          mov     edx, eax
  004043BE  |.  89F0          mov     eax, esi
  004043C0  |.  E8 53E5FFFF   call    00402918                         ;  计算call
  004043C5  |>  89D8          mov     eax, ebx
  004043C7  |.  E8 E8FEFFFF   call    004042B4
  004043CC  |.  893B          mov     dword ptr [ebx], edi             ;  把生成的放入ebx所指向的内存
  004043CE  |.  5F            pop     edi                              ;  0012F708
  004043CF  |.  5E            pop     esi
  004043D0  |.  5B            pop     ebx
  004043D1  \.  C3            retn
  继续进入,到这里就看不明白了
  00402918  /$  56            push    esi
  00402919  |.  57            push    edi
  0040291A  |.  89C6          mov     esi, eax
  0040291C  |.  89D7          mov     edi, edx
  0040291E  |.  89C8          mov     eax, ecx
  00402920  |.  39F7          cmp     edi, esi
  00402922  |.  77 13         ja      short 00402937
  00402924  |.  74 2F         je      short 00402955
  00402926  |.  C1F9 02       sar     ecx, 2
  00402929  |.  78 2A         js      short 00402955
  0040292B  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
  0040292D  |.  89C1          mov     ecx, eax
  0040292F  |.  83E1 03       and     ecx, 3
  00402932  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]
  00402934  |.  5F            pop     edi
  00402935  |.  5E            pop     esi
  00402936  |.  C3            retn
  00402937  |>  8D7431 FC     lea     esi, dword ptr [ecx+esi-4]
  0040293B  |.  8D7C39 FC     lea     edi, dword ptr [ecx+edi-4]
  0040293F  |.  C1F9 02       sar     ecx, 2
  00402942  |.  78 11         js      short 00402955
  00402944  |.  FD            std
  00402945  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr [esi]
  00402947  |.  89C1          mov     ecx, eax
  00402949  |.  83E1 03       and     ecx, 3
  0040294C  |.  83C6 03       add     esi, 3
  0040294F  |.  83C7 03       add     edi, 3
  00402952  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr [esi]
  00402954  |.  FC            cld
  00402955  |>  5F            pop     edi
  00402956  |.  5E            pop     esi
  00402957  \.  C3            retn
  00402958  /$  3C 61         cmp     al, 61
  0040295A  |.  72 06         jb      short 00402962
  0040295C  |.  3C 7A         cmp     al, 7A
  0040295E  |.  77 02         ja      short 00402962
  00402960  |.  2C 20         sub     al, 20
  00402962  \>  C3            retn
  可以发现,注册码已经生成放入esi所指向的内存中,那么就可以下内存断点了,可惜总是不成功,还需要好好学习啊。麻烦大家有空了帮我调下,注册码是如何生成的我还是没有追出来~~~~
  已经发现的:程序用用户名计算三次注册码,依次放入0012F57C-0012F584中,最后把三段连接起来,形成最后的注册码。数据窗口的数据如下:
  0012F574  00D521D8  ASCII "19532386"
  0012F578  00D5217C  ASCII "gtboy"
  0012F57C  00D521C0  ASCII "1364315216"
  0012F580  00D521A8  ASCII "1934331149"
  0012F584  00D52190  ASCII "1282030244"
  跟了这长的时间,就做个内存注册机吧。由
  00459A4E  |.  8B55 E4       mov     edx, dword ptr [ebp-1C]                   ;  真码放入edx
  00459A51  |.  58            pop     eax
  就可以知道,中断地址天00459A51,次数为一,选内存方式,保存edx为注册码,生成,ok。
  希望大家能指导下我,这个crackme的注册码如何生成的呢?如果用vc++的话,怎么下断才能断下呢?
  附上crackme和KeyGen,嘿嘿。
  
--------------------------------------------------------------------------------
【经验总结】
  自己的基础知识还不足,要好好学习,嘿嘿。
  
--------------------------------------------------------------------------------
【版权声明】: 一点小总结,还望大家多指导。

                                                       2008年03月18日 下午 09:48:42


潜水好长时间了,功力还是没有长进,只能写个内存注册机了,呵呵。

[ 本帖最后由 gtboy 于 2008-3-20 07:15 编辑 ]

CrackMeNo3_1.rar

177.88 KB, 下载次数: 4, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!

该用户从未签到

发表于 2008-3-19 14:15:54 | 显示全部楼层
这是我的分析部分,好像你的那个可疑的call,我都没有跟进去,看到后面有算法,也就没有跟入了,后来进去看了下,好像里面信息不是很多(不知是否分析错了?)!
我的注册用户名:unpack
所以的到的注册码为:1074560876-1174486784-603118086
(注明:如注册码的一部分为400C7F6C转化为十进制为1074560876)

至于后面提的vc++的问题我不懂,太菜了!
  1. 00459938  /.  55            push    ebp
  2. 00459939  |.  8BEC          mov     ebp, esp
  3. 0045993B  |.  33C9          xor     ecx, ecx
  4. 0045993D  |.  51            push    ecx
  5. 0045993E  |.  51            push    ecx
  6. 0045993F  |.  51            push    ecx
  7. 00459940  |.  51            push    ecx
  8. 00459941  |.  51            push    ecx
  9. 00459942  |.  51            push    ecx
  10. 00459943  |.  51            push    ecx
  11. 00459944  |.  53            push    ebx
  12. 00459945  |.  56            push    esi
  13. 00459946  |.  8945 FC       mov     [ebp-4], eax
  14. 00459949  |.  33C0          xor     eax, eax
  15. 0045994B  |.  55            push    ebp
  16. 0045994C  |.  68 8E9A4500   push    00459A8E
  17. 00459951  |.  64:FF30       push    dword ptr fs:[eax]
  18. 00459954  |.  64:8920       mov     fs:[eax], esp
  19. 00459957  |.  8D55 EC       lea     edx, [ebp-14]
  20. 0045995A  |.  8B45 FC       mov     eax, [ebp-4]
  21. 0045995D  |.  8B80 00030000 mov     eax, [eax+300]
  22. 00459963  |.  E8 FCEFFDFF   call    00438964
  23. 00459968  |.  8B45 EC       mov     eax, [ebp-14]                    ;  将用户名unpack赋给eax
  24. 0045996B  |.  E8 FCABFAFF   call    0040456C
  25. 00459970  |.  8BF0          mov     esi, eax                         ;  算的用户名的长度为6,给esi
  26. 00459972  |.  33DB          xor     ebx, ebx                         ;  ebx清零
  27. 00459974  |.  8BC6          mov     eax, esi                         ;  将6赋给eax
  28. 00459976  |.  85C0          test    eax, eax
  29. 00459978  |.  7E 21         jle     short 0045999B                   ;  小于或等于6则跳
  30. 0045997A  |.  BA 01000000   mov     edx, 1                           ;  edx赋值为1
  31. 0045997F  |>  69CE 8E91C621 /imul    ecx, esi, 21C6918E              ;  ecx=esi*21C6918E(即十进制566661518)
  32. 00459985  |.  03D9          |add     ebx, ecx                        ;  ebx=ebx+ecx,开始ebx为零,即第一次循环ebx=esi*21C6918E
  33. 00459987  |.  8B4D EC       |mov     ecx, [ebp-14]                   ;  将用户名给ecx
  34. 0045998A  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]       ;  依次取用户名u、n、p、a、c、k
  35. 0045998F  |.  69C9 CE020000 |imul    ecx, ecx, 2CE                   ;  ecx*2CE(ecx为取的字符的十六进制)
  36. 00459995  |.  03D9          |add     ebx, ecx                        ;  ebx=ecx+ebx
  37. 00459997  |.  42            |inc     edx                             ;  edx自加一
  38. 00459998  |.  48            |dec     eax                             ;  用户名长度减一
  39. 00459999  |.^ 75 E4         \jnz     short 0045997F                  ;  与edx开始赋值1比较,不相等跳
  40. 0045999B  |>  8BC3          mov     eax, ebx                         ;  循环完后加起来的赋给eax
  41. 0045999D  |.  99            cdq
  42. 0045999E  |.  33C2          xor     eax, edx                         ;  eax与edx(FFFFFFFF)即(-1)异或得到eax=400C7F6B
  43. 004599A0  |.  2BC2          sub     eax, edx                         ;  eax-(-1)=400C7F6C,这个的十进制作为注册码的第一部分
  44. 004599A2  |.  8D55 F8       lea     edx, [ebp-8]                     ;  将eax的给edx
  45. 004599A5  |.  E8 9AEBFAFF   call    00408544
  46. 004599AA  |.  8BC6          mov     eax, esi
  47. 004599AC  |.  85C0          test    eax, eax
  48. 004599AE  |.  7E 21         jle     short 004599D1
  49. 004599B0  |.  BA 01000000   mov     edx, 1
  50. 004599B5  |>  8B4D EC       /mov     ecx, [ebp-14]
  51. 004599B8  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]       ;  依次取位
  52. 004599BD  |.  69C9 8E91C621 |imul    ecx, ecx, 21C6918E              ;  ecx*21C6918E
  53. 004599C3  |.  69C9 BC070000 |imul    ecx, ecx, 7BC                   ;  ecx*7BC
  54. 004599C9  |.  03D9          |add     ebx, ecx                        ;  ebx(上次大循环的到的)+ecx=ebx
  55. 004599CB  |.  2BDE          |sub     ebx, esi                        ;  ebx-esi(6)
  56. 004599CD  |.  42            |inc     edx
  57. 004599CE  |.  48            |dec     eax
  58. 004599CF  |.^ 75 E4         \jnz     short 004599B5
  59. 004599D1  |>  8BC3          mov     eax, ebx                         ;  此次循环结果给eax=B9FEC100
  60. 004599D3  |.  99            cdq
  61. 004599D4  |.  33C2          xor     eax, edx                         ;  与-1异或
  62. 004599D6  |.  2BC2          sub     eax, edx                         ;  减-(-1),得到的值46013F00的十进制作为注册码的第二部分
  63. 004599D8  |.  8D55 F4       lea     edx, [ebp-C]                     ;  然后给edx
  64. 004599DB  |.  E8 64EBFAFF   call    00408544
  65. 004599E0  |.  8BC6          mov     eax, esi
  66. 004599E2  |.  85C0          test    eax, eax
  67. 004599E4  |.  7E 1E         jle     short 00459A04
  68. 004599E6  |.  BA 01000000   mov     edx, 1
  69. 004599EB  |>  8B4D EC       /mov     ecx, [ebp-14]
  70. 004599EE  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]       ;  依次取位
  71. 004599F3  |.  0FAFCE        |imul    ecx, esi                        ;  ecx*esi
  72. 004599F6  |.  69C9 C6040000 |imul    ecx, ecx, 4C6                   ;  ecx*4C6
  73. 004599FC  |.  03D9          |add     ebx, ecx                        ;  ebx(上次大循环的到的)+ecx
  74. 004599FE  |.  03DE          |add     ebx, esi                        ;  ebx+esi
  75. 00459A00  |.  42            |inc     edx
  76. 00459A01  |.  48            |dec     eax
  77. 00459A02  |.^ 75 E7         \jnz     short 004599EB
  78. 00459A04  |>  81C3 8E91C621 add     ebx, 21C6918E                    ;  ebx+21C6918E
  79. 00459A0A  |.  8BC3          mov     eax, ebx                         ;  ebx为DC0D25FA给eax
  80. 00459A0C  |.  99            cdq
  81. 00459A0D  |.  33C2          xor     eax, edx                         ;  eax与edx(FFFFFFFF)异或
  82. 00459A0F  |.  2BC2          sub     eax, edx                         ;  eax+edx结果得到23F2DA06作为注册码的第三部分
  83. 00459A11  |.  8D55 F0       lea     edx, [ebp-10]
  84. 00459A14  |.  E8 2BEBFAFF   call    00408544
  85. 00459A19  |.  8D55 E8       lea     edx, [ebp-18]
  86. 00459A1C  |.  8B45 FC       mov     eax, [ebp-4]
  87. 00459A1F  |.  8B80 04030000 mov     eax, [eax+304]
  88. 00459A25  |.  E8 3AEFFDFF   call    00438964
  89. 00459A2A  |.  8B45 E8       mov     eax, [ebp-18]
  90. 00459A2D  |.  50            push    eax                              ;  把注册码压栈
  91. 00459A2E  |.  FF75 F8       push    dword ptr [ebp-8]                ;  把注册码的第一个真码压栈
  92. 00459A31  |.  68 A49A4500   push    00459AA4                         ;  -作用是把-也压栈,使三部分注册码连起来
  93. 00459A36  |.  FF75 F4       push    dword ptr [ebp-C]                ;  把注册码的第二个压栈
  94. 00459A39  |.  68 A49A4500   push    00459AA4                         ;  -同上面的那个-
  95. 00459A3E  |.  FF75 F0       push    dword ptr [ebp-10]               ;  把注册码的第三个压栈
  96. 00459A41  |.  8D45 E4       lea     eax, [ebp-1C]
  97. 00459A44  |.  BA 05000000   mov     edx, 5                           ;  将5赋给edx
  98. 00459A49  |.  E8 DEABFAFF   call    0040462C
  99. 00459A4E  |.  8B55 E4       mov     edx, [ebp-1C]
  100. 00459A51  |.  58            pop     eax
  101. 00459A52  |.  E8 59ACFAFF   call    004046B0
  102. 00459A57  |.  75 0A         jnz     short 00459A63
  103. 00459A59  |.  B8 B09A4500   mov     eax, 00459AB0                    ;  恭喜你!完全正确。
复制代码
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2008-3-20 07:14:31 | 显示全部楼层
仔细跟了下,发现真是我跟错了哦,迷失在代码的丛林里面了
感谢你帮我,呵呵,我在算法跟踪上很菜的,对于算法很迷茫
那咱们互相学习,一起进步吧
再次感谢你
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-21 10:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-3-20 09:23:36 | 显示全部楼层
    哈   很好的学习风气~~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-20 14:19:22 | 显示全部楼层
    原帖由 gtboy 于 2008-3-20 07:14 发表
    仔细跟了下,发现真是我跟错了哦,迷失在代码的丛林里面了
    感谢你帮我,呵呵,我在算法跟踪上很菜的,对于算法很迷茫
    那咱们互相学习,一起进步吧
    再次感谢你

    呵呵,我也菜啊,只会简单的跟踪,呵呵 一起进步!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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