-
-
[原创]本师童鞋发表的CRACKME的第二种注册码分析(菜鸟级)
-
发表于: 2011-7-2 12:48 3478
-
本师童鞋原帖地址
http://bbs.pediy.com/showthread.php?t=133693
各位大牛cracktv已经给出了答案,不过只有答案而已,新人比较难理解,所以自己动手试一下,发一个详细点的过程。
OK,开始吧。
先简单测试一下,了解信息,输入456789,弹出Try Again!!.两个感叹号哦,记住了,一会有用的。
OD(看雪的ollyICE)载入,还是用字符串查找的方式,代码窗口右键——查找——所有参考文本字串,在打开的新窗口查找Try 就可以了。你会发现有很多Try Again,还记得前面说过,两个感叹号吗?这里有用了,一个感叹号的是第一种注册方式失败时的提示。找到有两个感叹号的文本。
文本字串参考位于 Acid_bur:CODE, 条目 1224
地址=0042F4F8
反汇编=mov edx, 0042F58C
文本字串=ASCII "Try Again!!"
在地址0042F4F8上右键——反汇编窗口中跟随,回到代码窗口。
0042F4AF |. 8D45 F4 lea eax, dword ptr [ebp-C]
0042F4B2 |. BA 03000000 mov edx, 3
0042F4B7 |. E8 F044FDFF call 004039AC
0042F4BC |. 8D55 F0 lea edx, dword ptr [ebp-10]
0042F4BF |. 8B83 E0010000 mov eax, dword ptr [ebx+1E0]
0042F4C5 |. E8 8EB5FEFF call 0041AA58
0042F4CA |. 8B45 F0 mov eax, dword ptr [ebp-10];保存输入的信息
0042F4CD |. 8B55 F4 mov edx, dword ptr [ebp-C];ASCII "Hello Dude"
0042F4D0 |. E8 2745FDFF call 004039FC;比较输入信息跟"Hello Dude"是否相等
0042F4D5 |. 75 1A jnz short 0042F4F1 ; 关键跳转,暴力破解的童鞋直接改这里,JNZ,改为JZ就OK了。或者干脆NOP掉。
0042F4D7 |. 6A 00 push 0
0042F4D9 |. B9 64F54200 mov ecx, 0042F564 ; ASCII "Congratz!"
0042F4DE |. BA 70F54200 mov edx, 0042F570 ; ASCII "God Job dude !! =)"
0042F4E3 |. A1 480A4300 mov eax, dword ptr [430A48]
0042F4E8 |. 8B00 mov eax, dword ptr [eax]
0042F4EA |. E8 81ACFFFF call 0042A170
0042F4EF |. EB 18 jmp short 0042F509
0042F4F1 |> 6A 00 push 0
0042F4F3 |. B9 84F54200 mov ecx, 0042F584 ; ASCII "Failed!"
0042F4F8 |. BA 8CF54200 mov edx, 0042F58C ; ASCII "Try Again!!" 就是这里了。
0042F4FD |. A1 480A4300 mov eax, dword ptr [430A48]
0042F502 |. 8B00 mov eax, dword ptr [eax]
0042F504 |. E8 67ACFFFF call 0042A170
0042F509 |> 33C0 xor eax, eax
看到上面的Congratz!吗?肯定是成功后的提示啦。往上看那个关键跳,暴力破解的童鞋可以收工了。想知道注册码的我们接着分析。找到关键跳,我们就看看上面的call 004039FC到底在干些什么。
0042F4CA 这个地址右键——断点——硬件执行。OK,让程序跑起来,F9运行,打开第二种注册窗口,输入456789,确定,程序停在0042F4CA,F7单步,OD可以看见此时EAX中保存正是我们输入的456789,接着F7单步,此时,EDX中保存的是Hello Dude,看到这里,一般大大们都知道注册码跟着Hello Dude肯定有关系了。接着F7单步,跟进call 004039FC里面。
004039FC /$ 53 push ebx ;跟进后停在这里。
004039FD |. 56 push esi
004039FE |. 57 push edi
004039FF |. 89C6 mov esi, eax
00403A01 |. 89D7 mov edi, edx
00403A03 |. 39D0 cmp eax, edx ;比较EAX和EDX是否相等
00403A05 |. 0F84 8F000000 je 00403A9A;相等则直接跳到函数尾部,跳出函数
00403A0B |. 85F6 test esi, esi ;测试输入的信息是否为空
00403A0D |. 74 68 je short 00403A77 ;为空则跳
00403A0F |. 85FF test edi, edi ;测试EDX是否为空,EDX中的"Hello Dude"从哪来的呢??有时间再去上面找找,这里不用管它。
00403A11 |. 74 6B je short 00403A7E ;为空则跳
00403A13 |. 8B46 FC mov eax, dword ptr [esi-4] ;输入信息的长度,这里是6
00403A16 |. 8B57 FC mov edx, dword ptr [edi-4] ;EDX中数据的长度,11
00403A19 |. 29D0 sub eax, edx ;相减
00403A1B |. 77 02 ja short 00403A1F ;eax大于edx则跳,这里不跳
00403A1D |. 01C2 add edx, eax;eax加到edx中,结果为6
00403A1F |> 52 push edx ;保存输入信息的长度。
00403A20 |. C1EA 02 shr edx, 2 ;右移两位,相当于除以4
00403A23 |. 74 26 je short 00403A4B;这里不跳
00403A25 |> 8B0E /mov ecx, dword ptr [esi];输入的信息"456789"
00403A27 |. 8B1F |mov ebx, dword ptr [edi];"Hello Dude"
00403A29 |. 39D9 |cmp ecx, ebx ;比较(为什么还要比较?有时间再看看)
00403A2B |. 75 58 |jnz short 00403A85 ;不等则跳,这里跳走了,00403A85
00403A2D |. 4A |dec edx
00403A2E |. 74 15 |je short 00403A45
00403A30 |. 8B4E 04 |mov ecx, dword ptr [esi+4]
00403A33 |. 8B5F 04 |mov ebx, dword ptr [edi+4]
00403A36 |. 39D9 |cmp ecx, ebx
00403A38 |. 75 4B |jnz short 00403A85
00403A3A |. 83C6 08 |add esi, 8
00403A3D |. 83C7 08 |add edi, 8
00403A40 |. 4A |dec edx
00403A41 |.^ 75 E2 \jnz short 00403A25
00403A43 |. EB 06 jmp short 00403A4B
00403A45 |> 83C6 04 add esi, 4
00403A48 |. 83C7 04 add edi, 4
00403A4B |> 5A pop edx
00403A4C |. 83E2 03 and edx, 3
00403A4F |. 74 22 je short 00403A73
00403A51 |. 8B0E mov ecx, dword ptr [esi]
00403A53 |. 8B1F mov ebx, dword ptr [edi]
00403A55 |. 38D9 cmp cl, bl
00403A57 |. 75 41 jnz short 00403A9A
00403A59 |. 4A dec edx
00403A5A |. 74 17 je short 00403A73
00403A5C |. 38FD cmp ch, bh
00403A5E |. 75 3A jnz short 00403A9A
00403A60 |. 4A dec edx
00403A61 |. 74 10 je short 00403A73
00403A63 |. 81E3 0000FF00 and ebx, 0FF0000
00403A69 |. 81E1 0000FF00 and ecx, 0FF0000
00403A6F |. 39D9 cmp ecx, ebx
00403A71 |. 75 27 jnz short 00403A9A
00403A73 |> 01C0 add eax, eax
00403A75 |. EB 23 jmp short 00403A9A
00403A77 |> 8B57 FC mov edx, dword ptr [edi-4]
00403A7A |. 29D0 sub eax, edx
00403A7C |. EB 1C jmp short 00403A9A
00403A7E |> 8B46 FC mov eax, dword ptr [esi-4]
00403A81 |. 29D0 sub eax, edx
00403A83 |. EB 15 jmp short 00403A9A
00403A85 |> 5A pop edx ;跳到这里,取出输入信息的长度,6
00403A86 |. 38D9 cmp cl, bl;不知何意(比较低8位,什么逻辑,有时间再看看)
00403A88 |. 75 10 jnz short 00403A9A;跳走00403A9A
00403A8A |. 38FD cmp ch, bh
00403A8C |. 75 0C jnz short 00403A9A
00403A8E |. C1E9 10 shr ecx, 10
00403A91 |. C1EB 10 shr ebx, 10
00403A94 |. 38D9 cmp cl, bl
00403A96 |. 75 02 jnz short 00403A9A
00403A98 |. 38FD cmp ch, bh
00403A9A |> 5F pop edi;函数出口
00403A9B |. 5E pop esi
00403A9C |. 5B pop ebx
00403A9D \. C3 retn
到这里基本可以知道,第二种注册方式的注册码为Hello Dude,至少Hello Dude是注册码之一。貌似还有别的可能,有时间再看看。
http://bbs.pediy.com/showthread.php?t=133693
各位大牛cracktv已经给出了答案,不过只有答案而已,新人比较难理解,所以自己动手试一下,发一个详细点的过程。
OK,开始吧。
先简单测试一下,了解信息,输入456789,弹出Try Again!!.两个感叹号哦,记住了,一会有用的。
OD(看雪的ollyICE)载入,还是用字符串查找的方式,代码窗口右键——查找——所有参考文本字串,在打开的新窗口查找Try 就可以了。你会发现有很多Try Again,还记得前面说过,两个感叹号吗?这里有用了,一个感叹号的是第一种注册方式失败时的提示。找到有两个感叹号的文本。
文本字串参考位于 Acid_bur:CODE, 条目 1224
地址=0042F4F8
反汇编=mov edx, 0042F58C
文本字串=ASCII "Try Again!!"
在地址0042F4F8上右键——反汇编窗口中跟随,回到代码窗口。
0042F4AF |. 8D45 F4 lea eax, dword ptr [ebp-C]
0042F4B2 |. BA 03000000 mov edx, 3
0042F4B7 |. E8 F044FDFF call 004039AC
0042F4BC |. 8D55 F0 lea edx, dword ptr [ebp-10]
0042F4BF |. 8B83 E0010000 mov eax, dword ptr [ebx+1E0]
0042F4C5 |. E8 8EB5FEFF call 0041AA58
0042F4CA |. 8B45 F0 mov eax, dword ptr [ebp-10];保存输入的信息
0042F4CD |. 8B55 F4 mov edx, dword ptr [ebp-C];ASCII "Hello Dude"
0042F4D0 |. E8 2745FDFF call 004039FC;比较输入信息跟"Hello Dude"是否相等
0042F4D5 |. 75 1A jnz short 0042F4F1 ; 关键跳转,暴力破解的童鞋直接改这里,JNZ,改为JZ就OK了。或者干脆NOP掉。
0042F4D7 |. 6A 00 push 0
0042F4D9 |. B9 64F54200 mov ecx, 0042F564 ; ASCII "Congratz!"
0042F4DE |. BA 70F54200 mov edx, 0042F570 ; ASCII "God Job dude !! =)"
0042F4E3 |. A1 480A4300 mov eax, dword ptr [430A48]
0042F4E8 |. 8B00 mov eax, dword ptr [eax]
0042F4EA |. E8 81ACFFFF call 0042A170
0042F4EF |. EB 18 jmp short 0042F509
0042F4F1 |> 6A 00 push 0
0042F4F3 |. B9 84F54200 mov ecx, 0042F584 ; ASCII "Failed!"
0042F4F8 |. BA 8CF54200 mov edx, 0042F58C ; ASCII "Try Again!!" 就是这里了。
0042F4FD |. A1 480A4300 mov eax, dword ptr [430A48]
0042F502 |. 8B00 mov eax, dword ptr [eax]
0042F504 |. E8 67ACFFFF call 0042A170
0042F509 |> 33C0 xor eax, eax
看到上面的Congratz!吗?肯定是成功后的提示啦。往上看那个关键跳,暴力破解的童鞋可以收工了。想知道注册码的我们接着分析。找到关键跳,我们就看看上面的call 004039FC到底在干些什么。
0042F4CA 这个地址右键——断点——硬件执行。OK,让程序跑起来,F9运行,打开第二种注册窗口,输入456789,确定,程序停在0042F4CA,F7单步,OD可以看见此时EAX中保存正是我们输入的456789,接着F7单步,此时,EDX中保存的是Hello Dude,看到这里,一般大大们都知道注册码跟着Hello Dude肯定有关系了。接着F7单步,跟进call 004039FC里面。
004039FC /$ 53 push ebx ;跟进后停在这里。
004039FD |. 56 push esi
004039FE |. 57 push edi
004039FF |. 89C6 mov esi, eax
00403A01 |. 89D7 mov edi, edx
00403A03 |. 39D0 cmp eax, edx ;比较EAX和EDX是否相等
00403A05 |. 0F84 8F000000 je 00403A9A;相等则直接跳到函数尾部,跳出函数
00403A0B |. 85F6 test esi, esi ;测试输入的信息是否为空
00403A0D |. 74 68 je short 00403A77 ;为空则跳
00403A0F |. 85FF test edi, edi ;测试EDX是否为空,EDX中的"Hello Dude"从哪来的呢??有时间再去上面找找,这里不用管它。
00403A11 |. 74 6B je short 00403A7E ;为空则跳
00403A13 |. 8B46 FC mov eax, dword ptr [esi-4] ;输入信息的长度,这里是6
00403A16 |. 8B57 FC mov edx, dword ptr [edi-4] ;EDX中数据的长度,11
00403A19 |. 29D0 sub eax, edx ;相减
00403A1B |. 77 02 ja short 00403A1F ;eax大于edx则跳,这里不跳
00403A1D |. 01C2 add edx, eax;eax加到edx中,结果为6
00403A1F |> 52 push edx ;保存输入信息的长度。
00403A20 |. C1EA 02 shr edx, 2 ;右移两位,相当于除以4
00403A23 |. 74 26 je short 00403A4B;这里不跳
00403A25 |> 8B0E /mov ecx, dword ptr [esi];输入的信息"456789"
00403A27 |. 8B1F |mov ebx, dword ptr [edi];"Hello Dude"
00403A29 |. 39D9 |cmp ecx, ebx ;比较(为什么还要比较?有时间再看看)
00403A2B |. 75 58 |jnz short 00403A85 ;不等则跳,这里跳走了,00403A85
00403A2D |. 4A |dec edx
00403A2E |. 74 15 |je short 00403A45
00403A30 |. 8B4E 04 |mov ecx, dword ptr [esi+4]
00403A33 |. 8B5F 04 |mov ebx, dword ptr [edi+4]
00403A36 |. 39D9 |cmp ecx, ebx
00403A38 |. 75 4B |jnz short 00403A85
00403A3A |. 83C6 08 |add esi, 8
00403A3D |. 83C7 08 |add edi, 8
00403A40 |. 4A |dec edx
00403A41 |.^ 75 E2 \jnz short 00403A25
00403A43 |. EB 06 jmp short 00403A4B
00403A45 |> 83C6 04 add esi, 4
00403A48 |. 83C7 04 add edi, 4
00403A4B |> 5A pop edx
00403A4C |. 83E2 03 and edx, 3
00403A4F |. 74 22 je short 00403A73
00403A51 |. 8B0E mov ecx, dword ptr [esi]
00403A53 |. 8B1F mov ebx, dword ptr [edi]
00403A55 |. 38D9 cmp cl, bl
00403A57 |. 75 41 jnz short 00403A9A
00403A59 |. 4A dec edx
00403A5A |. 74 17 je short 00403A73
00403A5C |. 38FD cmp ch, bh
00403A5E |. 75 3A jnz short 00403A9A
00403A60 |. 4A dec edx
00403A61 |. 74 10 je short 00403A73
00403A63 |. 81E3 0000FF00 and ebx, 0FF0000
00403A69 |. 81E1 0000FF00 and ecx, 0FF0000
00403A6F |. 39D9 cmp ecx, ebx
00403A71 |. 75 27 jnz short 00403A9A
00403A73 |> 01C0 add eax, eax
00403A75 |. EB 23 jmp short 00403A9A
00403A77 |> 8B57 FC mov edx, dword ptr [edi-4]
00403A7A |. 29D0 sub eax, edx
00403A7C |. EB 1C jmp short 00403A9A
00403A7E |> 8B46 FC mov eax, dword ptr [esi-4]
00403A81 |. 29D0 sub eax, edx
00403A83 |. EB 15 jmp short 00403A9A
00403A85 |> 5A pop edx ;跳到这里,取出输入信息的长度,6
00403A86 |. 38D9 cmp cl, bl;不知何意(比较低8位,什么逻辑,有时间再看看)
00403A88 |. 75 10 jnz short 00403A9A;跳走00403A9A
00403A8A |. 38FD cmp ch, bh
00403A8C |. 75 0C jnz short 00403A9A
00403A8E |. C1E9 10 shr ecx, 10
00403A91 |. C1EB 10 shr ebx, 10
00403A94 |. 38D9 cmp cl, bl
00403A96 |. 75 02 jnz short 00403A9A
00403A98 |. 38FD cmp ch, bh
00403A9A |> 5F pop edi;函数出口
00403A9B |. 5E pop esi
00403A9C |. 5B pop ebx
00403A9D \. C3 retn
到这里基本可以知道,第二种注册方式的注册码为Hello Dude,至少Hello Dude是注册码之一。貌似还有别的可能,有时间再看看。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- 学经济想转行做软件,求推荐 19583
- [分享]瞬间实现文件扩展名的伪装——屏保病毒伪装的简单实现 13035
- [原创]本师童鞋发表的CRACKME的第二种注册码分析(菜鸟级) 3479
看原图
赞赏
雪币:
留言: