-
-
一个适合新手的crackme算法分析[原创]
-
发表于:
2006-7-26 03:23
6889
-
【文章标题】: 一个适合新手的crackme算法分析
【文章作者】: 网游难民
【作者邮箱】: goqq2008
【软件名称】: k4n
【软件大小】: 60.0
【下载地址】: 本地下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++ [Overlay]
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一,用PEID查壳为Borland C++ [Overlay]无壳。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
二,运行软件,注册窗口进行注册,输入错误的注册信息进行检测!软件有尾巴!
提示说:“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:[EBP+ECX-B8]-----把用户名的第一位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:[EBP-28]----------SS:[EBP-28]里的值和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:[EBP-38],EAX
00401129 |. FF75 C8 PUSH DWORD PTR SS:[EBP-38] ; /Arg3
0040112C |. 68 38B44000 PUSH k4n.0040B438 ; |%lx
00401131 |. 8D8D 80FEFFFF LEA ECX,DWORD PTR SS:[EBP-180] ; |
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:[EBP-180]
00401146 |. 50 PUSH EAX ; /String2
00401147 |. 8D95 E4FEFFFF LEA EDX,DWORD PTR SS:[EBP-11C]-----------我们的注册码放入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比较简单,适合新手学习~~~
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年07月26日 3:22:52
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!