-
-
[旧帖] [讨论]对一crackme的不完全分析(已解决,感谢unpack网友) 0.00雪花
-
发表于: 2008-3-19 07:07 2593
-
【文章标题】: 对一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在这里下断,注册,来到了关键位置。略去部分代码
进入可疑的call
继续进入,略去部分代码
已经发现的:程序用用户名计算三次注册码,依次放入0012F57C-0012F584中,最后把三段连接起来,形成最后的注册码。数据窗口的数据如下:
跟了这长的时间,就做个内存注册机吧。由
希望大家能指导下我,这个crackme的注册码如何生成的呢?如果用vc++的话,怎么下断才能断下呢?
附上crackme和keygen,嘿嘿。
--------------------------------------------------------------------------------
【经验总结】
自己的基础知识还不足,要好好学习,嘿嘿。
--------------------------------------------------------------------------------
【版权声明】: 一点小总结,还望大家多指导。
2008年03月18日 下午 09:48:42

以下为unpack网友的解答,我又跟了下,发现是自己分析错了,一起贴出来
再次感谢他的帮助,偶要继续努力啊努力,嘿嘿
【文章作者】: 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









以下为unpack网友的解答,我又跟了下,发现是自己分析错了,一起贴出来
这是我的分析部分,好像你的那个可疑的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 [ebp-4], eax
00459949 |. 33C0 xor eax, eax
0045994B |. 55 push ebp
0045994C |. 68 8E9A4500 push 00459A8E
00459951 |. 64:FF30 push dword ptr fs:[eax]
00459954 |. 64:8920 mov fs:[eax], esp
00459957 |. 8D55 EC lea edx, [ebp-14]
0045995A |. 8B45 FC mov eax, [ebp-4]
0045995D |. 8B80 00030000 mov eax, [eax+300]
00459963 |. E8 FCEFFDFF call 00438964
00459968 |. 8B45 EC mov eax, [ebp-14] ; 将用户名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, [ebp-14] ; 将用户名给ecx
0045998A |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 依次取用户名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, [ebp-8] ; 将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, [ebp-14]
004599B8 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 依次取位
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, [ebp-C] ; 然后给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, [ebp-14]
004599EE |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1] ; 依次取位
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, [ebp-10]
00459A14 |. E8 2BEBFAFF call 00408544
00459A19 |. 8D55 E8 lea edx, [ebp-18]
00459A1C |. 8B45 FC mov eax, [ebp-4]
00459A1F |. 8B80 04030000 mov eax, [eax+304]
00459A25 |. E8 3AEFFDFF call 00438964
00459A2A |. 8B45 E8 mov eax, [ebp-18]
00459A2D |. 50 push 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, [ebp-1C]
00459A44 |. BA 05000000 mov edx, 5 ; 将5赋给edx
00459A49 |. E8 DEABFAFF call 0040462C
00459A4E |. 8B55 E4 mov edx, [ebp-1C]
00459A51 |. 58 pop eax
00459A52 |. E8 59ACFAFF call 004046B0
00459A57 |. 75 0A jnz short 00459A63
00459A59 |. B8 B09A4500 mov eax, 00459AB0 ; 恭喜你!完全正确。
再次感谢他的帮助,偶要继续努力啊努力,嘿嘿

赞赏
他的文章
赞赏
雪币:
留言: