fantasy 发表于 2006-5-22 10:06:14

PYG 5.4 Cracker 小组 课外练习11

再来个crackme 大家练练手

逍遥大哥看了 请置顶啊


要求
1)爆破
2)追码
3)内存注册机
4)算法分析(选做)
练习的目的只在于巩固学习成果.
希望大家积极相互交流相.互讨论.

godhack 发表于 2006-5-22 15:00:23

爆破后追码:victory:

hczcyy 发表于 2006-5-22 20:59:53

0040110C    0FBE840D 48FFFF>movsx eax,byte ptr ss:   //依次取用户名 保存在eax
00401114    41            inc ecx                              //ecx为计数器
00401115    33C1            xor eax,ecx                        // eax=eax xor ecx
00401117    03D8            add ebx,eax                           //结果 累加到在ebx 我这里最后是2A5
00401119    3B4D D8         cmp ecx,dword ptr ss:         //比较用户名是否取完
0040111C^ 75 EE         jnz short k4n.0040110C               
0040111E    6BC0 06         imul eax,eax,6                        //最后一次的结果*6 7f*6=2FA
00401121    C1E3 07         shl ebx,7                           //2a5左移7位 得 15280
00401124    03C3            add eax,ebx                           //eax=eax+ebx15280+2fA=1557A
00401126    8945 C8         mov dword ptr ss:,eax
00401129    FF75 C8         push dword ptr ss:
0040112C    68 38B44000   push k4n.0040B438                  ; %lx
00401131    8D8D 80FEFFFF   lea ecx,dword ptr ss:         
00401137    51            push ecx
00401138    E8 873D0000   call k4n.00404EC4                      //将计算结果1557A转换位字符串"1557A"
0040113D    83C4 0C         add esp,0C
00401140    8D85 80FEFFFF   lea eax,dword ptr ss:         //取得假码:87654321
00401146    50            push eax                               //假码入栈
00401147    8D95 E4FEFFFF   lea edx,dword ptr ss:      //取得刚计算得真码 1557A
0040114D    52            push edx                              //真码入栈==>>内存注册机
0040114E    E8 339C0000   call <jmp.&KERNEL32.lstrcmpA>      //关键比较
00401153    85C0            test eax,eax
00401155    75 0D         jnz short k4n.00401164            //75==>>74爆破
00401157    68 3CB44000   push k4n.0040B43C                  ; congratulations! if this number comes *from your* keygen, write a tutorial dude ;).
0040115C    56            push esi
0040115D    E8 289B0000   call <jmp.&USER32.SetWindowTextA>
00401162    EB 18         jmp short k4n.0040117C
00401164    68 90B44000   push k4n.0040B490                  ; this serial is *not* valid!! try again... : unregistered
00401169    56            push esi
0040116A    E8 1B9B0000   call <jmp.&USER32.SetWindowTextA>
0040116F    EB 0B         jmp short k4n.0040117C
00401171    68 C9B44000   push k4n.0040B4C9                  ; name must contain more than 4 chars and less than 50 chars !!
00401176    56            push esi
00401177    E8 0E9B0000   call <jmp.&USER32.SetWindowTextA>

因为用到了左移,而我只会vb(狂汗中.......)

算法总结:

   1.依次取用户名的asi码 与它所在的位置的序号做xor 运算,累加.并乘以6.记位A
   2.将用户名的最后一个字的asi码 左移7位.记位B
   3.注册码= A+B

一组可用注册码:

Name:hczcyy
Code:1557A

野猫III 发表于 2006-5-22 21:16:29

原帖由 fantasy 于 2006-5-22 10:06 发表
再来个crackme 大家练练手

逍遥大哥看了 请置顶啊


要求
1)爆破
2)追码
3)内存注册机
4)算法分析(选做)
练习的目的只在于巩固学习成果.
希望大家积极相互交流相.互讨论.

谢谢fantasy!

东东好多。进步多多。

更欢迎大家多多共享一此crackme来玩!

fantasy 发表于 2006-5-22 23:42:02

分析的不错 ~~~

vacant 发表于 2006-5-26 15:05:23

内存注册机见笑了

[ 本帖最后由 vacant 于 2006-5-26 15:07 编辑 ]

xuhw 发表于 2006-6-7 11:22:41

xhwxhw      

15B26

网游难民 发表于 2006-7-4 02:39:25

又一个哦~~~

网游难民 发表于 2006-7-26 03:25:06

【文章标题】: 一个适合新手的crackme算法分析
【文章作者】: 网游难民
【作者邮箱】: goqq2008
【软件名称】: k4n
【软件大小】: 60.0
【下载地址】: 本地下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一,用PEID查壳为Borland C++ 无壳。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
二,运行软件,注册窗口进行注册,输入错误的注册信息进行检测!软件有尾巴!
   提示说:“This serial is *NOT* Valid!! Try again... : UNREGISTERED”
用OD载入,右键超级字串查找,找到"This serial is *NOT* Valid!! Try again... : UNREGISTERED",双击进入程序代码段,往上查找,在一个合适的地方下断。
然后运行程序,输入注册名和注册码,程序成功被断了下来,断在这里:
00401108|.90            NOP-------------------------------------程序被断在这里。
00401109|.90            NOP
0040110A|.90            NOP
0040110B|.90            NOP
0040110C|>0FBE840D 48FF>/MOVSX EAX,BYTE PTR SS:-----把用户名的第一位ASCII码送入EAX
00401114|.41            |INC ECX--------------------------------ECX加1,初值为0。
00401115|.33C1          |XOR EAX,ECX----------------------------EAX和ECX进行逻辑异或运算。值保存在EAX中。
00401117|.03D8          |ADD EBX,EAX----------------------------EAX和EBX相加,值放在EBX中。
00401119|.3B4D D8       |CMP ECX,DWORD PTR SS:----------SS:里的值和ECX相比较。
0040111C|.^ 75 EE         \JNZ SHORT k4n.0040110C-----------------这里是一个循环,求的用户名第一位ASCII码XOR1,第二位用户名ASCII码XOR2~~~~~~~一直到最后一位的和放入EBX,记为A,
0040111E|.6BC0 06       IMUL EAX,EAX,6--------------------------EAX*6,也就是说 最后一位用户名XOR用户名位数 的值乘6,值记为B。
00401121|.C1E3 07       SHL EBX,7-------------------------------EBX左移7位,也就是A左移7位。值放入EBX,值记为C。
00401124|.03C3          ADD EAX,EBX-----------------------------EAX和EBX相加,即A+C,值放入EAX中,记为D。
00401126|.8945 C8       MOV DWORD PTR SS:,EAX
00401129|.FF75 C8       PUSH DWORD PTR SS:               ; /Arg3
0040112C|.68 38B44000   PUSH k4n.0040B438                        ; |%lx
00401131|.8D8D 80FEFFFF LEA ECX,DWORD PTR SS:         ; |
00401137|.51            PUSH ECX                                 ; |Arg1
00401138|.E8 873D0000   CALL k4n.00404EC4                        ; \k4n.00404EC4
0040113D|.83C4 0C       ADD ESP,0C
00401140|.8D85 80FEFFFF LEA EAX,DWORD PTR SS:
00401146|.50            PUSH EAX                                 ; /String2
00401147|.8D95 E4FEFFFF LEA EDX,DWORD PTR SS:-----------我们的注册码放入EDX
0040114D|.52            PUSH EDX                                 ; |String1
0040114E|.E8 339C0000   CALL <JMP.&KERNEL32.lstrcmpA> -----------关键CALL,我们的注册码和D相比较,相等返回0,不相等返回1,值放入EAX中,即D即为真码。
00401153|.85C0          TEST EAX,EAX
00401155|.75 0D         JNZ SHORT k4n.00401164-------------------关键跳转,可以在此爆破。
00401157|.68 3CB44000   PUSH k4n.0040B43C                        ; /congratulations! if this number comes *from your* keygen, write a tutorial dude ;).
0040115C|.56            PUSH ESI                                 ; |hWnd
0040115D|.E8 289B0000   CALL <JMP.&USER32.SetWindowTextA>      ; \SetWindowTextA
00401162|.EB 18         JMP SHORT k4n.0040117C
00401164|>68 90B44000   PUSH k4n.0040B490                        ; /this serial is *not* valid!! try again... : unregistered
00401169|.56            PUSH ESI                                 ; |hWnd
0040116A|.E8 1B9B0000   CALL <JMP.&USER32.SetWindowTextA>      ; \SetWindowTextA
0040116F|.EB 0B         JMP SHORT k4n.0040117C
00401171|>68 C9B44000   PUSH k4n.0040B4C9                        ; /name must contain more than 4 chars and less than 50 chars !!
00401176|.56            PUSH ESI                                 ; |hWnd


--------------------------------------------------------------------------------
【经验总结】
它的算法是:
第一位用户名与1异或,第二位用户名与2异或依次类推,把它们的值放入EBX中,记为A。
用户名最后一位与用户名位数异或的值乘以6,值记为B。
A的值左移7位(2进制)。值记为C。
A和C的值相加,记为D。D即为真码。
次crackme比较简单,适合新手学习~~~

[ 本帖最后由 caterpilla 于 2006-7-26 09:57 编辑 ]

沙粒 发表于 2006-7-30 15:39:44

呵呵!谢谢fantasy为大家提供这些好的练习机会
页: [1] 2
查看完整版本: PYG 5.4 Cracker 小组 课外练习11