gtboy 发表于 2008-3-19 08:26:52

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

【文章标题】: 对一crackme的不完全分析
【文章作者】: gtboy
【作者邮箱】: [email protected]
【作者主页】: 无
【作者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                    ;放入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
0045998A|.0FB64C11 FF   |movzx   ecx, byte ptr                 ;依次取用户名
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
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
004599B8|.0FB64C11 FF   |movzx   ecx, byte ptr
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
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
004599EE|.0FB64C11 FF   |movzx   ecx, byte ptr
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
00459A14|.E8 2BEBFAFF   call    00408544
00459A19|.8D55 E8       lea   edx, dword ptr
00459A1C|.8B45 FC       mov   eax, dword ptr
00459A1F|.8B80 04030000 mov   eax, dword ptr
00459A25|.E8 3AEFFDFF   call    00438964                                  ;取假码
00459A2A|.8B45 E8       mov   eax, dword ptr
00459A2D|.50            push    eax                                       ;假码放入eax
00459A2E|.FF75 F8       push    dword ptr
00459A31|.68 A49A4500   push    00459AA4
00459A36|.FF75 F4       push    dword ptr
00459A39|.68 A49A4500   push    00459AA4
00459A3E|.FF75 F0       push    dword ptr
00459A41|.8D45 E4       lea   eax, dword ptr
00459A44|.BA 05000000   mov   edx, 5
00459A49|.E8 DEABFAFF   call    0040462C                                  ;连接三段注册码
00459A4E|.8B55 E4       mov   edx, dword ptr                    ;真码放入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 , eax
0040854D|.C64424 08 00mov   byte ptr , 0
00408552|.8D4C24 04   lea   ecx, dword ptr          ;计算结果放入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 , 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:, dword ptr
0040292D|.89C1          mov   ecx, eax
0040292F|.83E1 03       and   ecx, 3
00402932|.F3:A4         rep   movs byte ptr es:, byte ptr
00402934|.5F            pop   edi
00402935|.5E            pop   esi
00402936|.C3            retn
00402937|>8D7431 FC   lea   esi, dword ptr
0040293B|.8D7C39 FC   lea   edi, dword ptr
0040293F|.C1F9 02       sar   ecx, 2
00402942|.78 11         js      short 00402955
00402944|.FD            std
00402945|.F3:A5         rep   movs dword ptr es:, dword ptr
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:, byte ptr
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中,最后把三段连接起来,形成最后的注册码。数据窗口的数据如下:
0012F57400D521D8ASCII "19532386"
0012F57800D5217CASCII "gtboy"
0012F57C00D521C0ASCII "1364315216"
0012F58000D521A8ASCII "1934331149"
0012F58400D52190ASCII "1282030244"
跟了这长的时间,就做个内存注册机吧。由
00459A4E|.8B55 E4       mov   edx, dword ptr                    ;真码放入edx
00459A51|.58            pop   eax
就可以知道,中断地址天00459A51,次数为一,选内存方式,保存edx为注册码,生成,ok。
希望大家能指导下我,这个crackme的注册码如何生成的呢?如果用vc++的话,怎么下断才能断下呢?
附上crackme和keygen,嘿嘿。

--------------------------------------------------------------------------------
【经验总结】
自己的基础知识还不足,要好好学习,嘿嘿。

--------------------------------------------------------------------------------
【版权声明】: 一点小总结,还望大家多指导。

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


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

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

unpack 发表于 2008-3-19 14:15:54

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

至于后面提的vc++的问题我不懂,太菜了!00459938/.55            push    ebp
00459939|.8BEC          mov   ebp, esp
0045993B|.33C9          xor   ecx, ecx
0045993D|.51            push    ecx
0045993E|.51            push    ecx
0045993F|.51            push    ecx
00459940|.51            push    ecx
00459941|.51            push    ecx
00459942|.51            push    ecx
00459943|.51            push    ecx
00459944|.53            push    ebx
00459945|.56            push    esi
00459946|.8945 FC       mov   , eax
00459949|.33C0          xor   eax, eax
0045994B|.55            push    ebp
0045994C|.68 8E9A4500   push    00459A8E
00459951|.64:FF30       push    dword ptr fs:
00459954|.64:8920       mov   fs:, esp
00459957|.8D55 EC       lea   edx,
0045995A|.8B45 FC       mov   eax,
0045995D|.8B80 00030000 mov   eax,
00459963|.E8 FCEFFDFF   call    00438964
00459968|.8B45 EC       mov   eax,                   ;将用户名unpack赋给eax
0045996B|.E8 FCABFAFF   call    0040456C
00459970|.8BF0          mov   esi, eax                         ;算的用户名的长度为6,给esi
00459972|.33DB          xor   ebx, ebx                         ;ebx清零
00459974|.8BC6          mov   eax, esi                         ;将6赋给eax
00459976|.85C0          test    eax, eax
00459978|.7E 21         jle   short 0045999B                   ;小于或等于6则跳
0045997A|.BA 01000000   mov   edx, 1                           ;edx赋值为1
0045997F|>69CE 8E91C621 /imul    ecx, esi, 21C6918E            ;ecx=esi*21C6918E(即十进制566661518)
00459985|.03D9          |add   ebx, ecx                        ;ebx=ebx+ecx,开始ebx为零,即第一次循环ebx=esi*21C6918E
00459987|.8B4D EC       |mov   ecx,                    ;将用户名给ecx
0045998A|.0FB64C11 FF   |movzx   ecx, byte ptr        ;依次取用户名u、n、p、a、c、k
0045998F|.69C9 CE020000 |imul    ecx, ecx, 2CE                   ;ecx*2CE(ecx为取的字符的十六进制)
00459995|.03D9          |add   ebx, ecx                        ;ebx=ecx+ebx
00459997|.42            |inc   edx                           ;edx自加一
00459998|.48            |dec   eax                           ;用户名长度减一
00459999|.^ 75 E4         \jnz   short 0045997F                  ;与edx开始赋值1比较,不相等跳
0045999B|>8BC3          mov   eax, ebx                         ;循环完后加起来的赋给eax
0045999D|.99            cdq
0045999E|.33C2          xor   eax, edx                         ;eax与edx(FFFFFFFF)即(-1)异或得到eax=400C7F6B
004599A0|.2BC2          sub   eax, edx                         ;eax-(-1)=400C7F6C,这个的十进制作为注册码的第一部分
004599A2|.8D55 F8       lea   edx,                      ;将eax的给edx
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,
004599B8|.0FB64C11 FF   |movzx   ecx, byte ptr        ;依次取位
004599BD|.69C9 8E91C621 |imul    ecx, ecx, 21C6918E            ;ecx*21C6918E
004599C3|.69C9 BC070000 |imul    ecx, ecx, 7BC                   ;ecx*7BC
004599C9|.03D9          |add   ebx, ecx                        ;ebx(上次大循环的到的)+ecx=ebx
004599CB|.2BDE          |sub   ebx, esi                        ;ebx-esi(6)
004599CD|.42            |inc   edx
004599CE|.48            |dec   eax
004599CF|.^ 75 E4         \jnz   short 004599B5
004599D1|>8BC3          mov   eax, ebx                         ;此次循环结果给eax=B9FEC100
004599D3|.99            cdq
004599D4|.33C2          xor   eax, edx                         ;与-1异或
004599D6|.2BC2          sub   eax, edx                         ;减-(-1),得到的值46013F00的十进制作为注册码的第二部分
004599D8|.8D55 F4       lea   edx,                      ;然后给edx
004599DB|.E8 64EBFAFF   call    00408544
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,
004599EE|.0FB64C11 FF   |movzx   ecx, byte ptr        ;依次取位
004599F3|.0FAFCE      |imul    ecx, esi                        ;ecx*esi
004599F6|.69C9 C6040000 |imul    ecx, ecx, 4C6                   ;ecx*4C6
004599FC|.03D9          |add   ebx, ecx                        ;ebx(上次大循环的到的)+ecx
004599FE|.03DE          |add   ebx, esi                        ;ebx+esi
00459A00|.42            |inc   edx
00459A01|.48            |dec   eax
00459A02|.^ 75 E7         \jnz   short 004599EB
00459A04|>81C3 8E91C621 add   ebx, 21C6918E                  ;ebx+21C6918E
00459A0A|.8BC3          mov   eax, ebx                         ;ebx为DC0D25FA给eax
00459A0C|.99            cdq
00459A0D|.33C2          xor   eax, edx                         ;eax与edx(FFFFFFFF)异或
00459A0F|.2BC2          sub   eax, edx                         ;eax+edx结果得到23F2DA06作为注册码的第三部分
00459A11|.8D55 F0       lea   edx,
00459A14|.E8 2BEBFAFF   call    00408544
00459A19|.8D55 E8       lea   edx,
00459A1C|.8B45 FC       mov   eax,
00459A1F|.8B80 04030000 mov   eax,
00459A25|.E8 3AEFFDFF   call    00438964
00459A2A|.8B45 E8       mov   eax,
00459A2D|.50            push    eax                              ;把注册码压栈
00459A2E|.FF75 F8       push    dword ptr                 ;把注册码的第一个真码压栈
00459A31|.68 A49A4500   push    00459AA4                         ;-作用是把-也压栈,使三部分注册码连起来
00459A36|.FF75 F4       push    dword ptr                 ;把注册码的第二个压栈
00459A39|.68 A49A4500   push    00459AA4                         ;-同上面的那个-
00459A3E|.FF75 F0       push    dword ptr                ;把注册码的第三个压栈
00459A41|.8D45 E4       lea   eax,
00459A44|.BA 05000000   mov   edx, 5                           ;将5赋给edx
00459A49|.E8 DEABFAFF   call    0040462C
00459A4E|.8B55 E4       mov   edx,
00459A51|.58            pop   eax
00459A52|.E8 59ACFAFF   call    004046B0
00459A57|.75 0A         jnz   short 00459A63
00459A59|.B8 B09A4500   mov   eax, 00459AB0                  ;恭喜你!完全正确。

gtboy 发表于 2008-3-20 07:14:31

仔细跟了下,发现真是我跟错了哦,迷失在代码的丛林里面了
感谢你帮我,呵呵,我在算法跟踪上很菜的,对于算法很迷茫
那咱们互相学习,一起进步吧
再次感谢你

天颖 发表于 2008-3-20 09:23:36

哈   很好的学习风气~~~

unpack 发表于 2008-3-20 14:19:22

原帖由 gtboy 于 2008-3-20 07:14 发表 https://www.chinapyg.com/images/common/back.gif
仔细跟了下,发现真是我跟错了哦,迷失在代码的丛林里面了
感谢你帮我,呵呵,我在算法跟踪上很菜的,对于算法很迷茫
那咱们互相学习,一起进步吧
再次感谢你
呵呵,我也菜啊,只会简单的跟踪,呵呵 一起进步!!
页: [1]
查看完整版本: 对一crackme的不完全分析(已解决,感谢unpack网友)