中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 看雪学院专区 > CrackMe
easycrackme算法分析
作者:佚名 时间:2006-12-15 10:40 出处:pediy.com 责编:月夜寒箫
              摘要:easycrackme算法分析
【破文标题】easycrackme破解手记
【破文作者】网游难民
【作者邮箱】
【作者主页】http://bbs.chinapyg.com/discuz.php
【破解工具】PEiD,OD
【破解平台】Windows XP
【软件名称】easycrackme
【软件大小】22.0 KB
【原版下载】本地
【保护方式】注册码
【软件简介】一个比较简单的crackme,偶分析了给大家分享,
不足之处请大家多多指教~~
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
------------------------------------------------------------------------
用PEID查壳为Borland Delphi 4.0 - 5.0,无壳
+++++++++++++++++++++++++++++++++++++++++++
运行软件,输入试练码,点确定弹出对话框"Invalid",退出软件
再用OD截入脱壳后的程序,右键超级字串查找,找到"Invalid",双击进入程序代码段,往上查找合适地方下断。
+++++++++++++++++++++++++++++++++++++++++++++
004040BE  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  用户名放如EAX中
004040C1  |.  E8 0AEEFFFF   CALL easycrac.00402ED0
004040C6  |.  8BD0          MOV EDX,EAX                              ;  用户名位数
004040C8  |.  85D2          TEST EDX,EDX
004040CA  |.  7F 1F         JG SHORT easycrac.004040EB               ;  检测用户名是否为空~~
004040CC  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
004040CF  |.  BA E0414000   MOV EDX,easycrac.004041E0                ;  your name?
004040D4  |.  E8 A7EDFFFF   CALL easycrac.00402E80
004040D9  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
004040DC  |.  BA F4414000   MOV EDX,easycrac.004041F4                ;  error
004040E1  |.  E8 9AEDFFFF   CALL easycrac.00402E80
004040E6  |.  E9 98000000   JMP easycrac.00404183
004040EB  |>  33F6          XOR ESI,ESI
004040ED  |.  8BDA          MOV EBX,EDX
004040EF  |.  85DB          TEST EBX,EBX
004040F1  |.  7E 19         JLE SHORT easycrac.0040410C
004040F3  |.  B8 01000000   MOV EAX,1                                ;  EAX=1
004040F8  |>  8B4D FC       /MOV ECX,DWORD PTR SS:[EBP-4]            ;  用户名放入ECX
004040FB  |.  0FB64C01 FF   |MOVZX ECX,BYTE PTR DS:[ECX+EAX-1]
00404100  |.  8BF8          |MOV EDI,EAX
00404102  |.  4F            |DEC EDI
00404103  |.  0FAFCF        |IMUL ECX,EDI
00404106  |.  03F1          |ADD ESI,ECX
00404108  |.  40            |INC EAX
00404109  |.  4B            |DEC EBX
0040410A  |.^ 75 EC         \JNZ SHORT easycrac.004040F8             ;  循环,用户名第一位*0,第二位*1。依次类推~~结果相加,和记为A
0040410C  |>  8D1C12        LEA EBX,DWORD PTR DS:[EDX+EDX]           ;  用户名位数*2放入EBX
0040410F  |.  83C3 63       ADD EBX,63                               ;  用户名位数*2放入EBX加上63
00404112  |.  81E3 FFFF0000 AND EBX,0FFFF
00404118  |.  81E6 FFFF0000 AND ESI,0FFFF
0040411E  |.  C1E3 10       SHL EBX,10                               ;  左移10位
00404121  |.  03F3          ADD ESI,EBX                              ;  A加上上面的数,值放在ESI中。
00404123  |.  8BDE          MOV EBX,ESI                              ;  
00404125  |.  8BF3          MOV ESI,EBX
00404127  |.  83E6 0F       AND ESI,0F                               ;  ESI与0F与,结果放入ESI中
0040412A  |.  8B1CB5 B85040>MOV EBX,DWORD PTR DS:[ESI*4+4050B8]      ;  把ESI与0F与后的数*2+4050B8对应的地址里的数放入EBX,值记为B---在后面给出这个表格
00404131  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00404134  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]             ;  注册码放入ECX
00404137  |.  BA 04424000   MOV EDX,easycrac.00404204                ;  0
0040413C  |.  E8 DBEDFFFF   CALL easycrac.00402F1C
00404141  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  0+注册码
00404144  |.  E8 57FEFFFF   CALL easycrac.00403FA0                   ;  关键CALL哦,跟进
00404149  |.  8BF0          MOV ESI,EAX                              ;  得到的值C放入ESI
0040414B  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
0040414E  |.  BA F4414000   MOV EDX,easycrac.004041F4                ;  error
00404153  |.  E8 28EDFFFF   CALL easycrac.00402E80
00404158  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
0040415B  |.  BA 10424000   MOV EDX,easycrac.00404210                ;  invalid
00404160  |.  E8 1BEDFFFF   CALL easycrac.00402E80                   
00404165  |.  3BDE          CMP EBX,ESI                              ;  关键比较,即B与C比较,不相等则GAMEOVER
00404167  |.  75 1A         JNZ SHORT easycrac.00404183              ;  关键跳转
00404169  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
0040416C  |.  BA 20424000   MOV EDX,easycrac.00404220                ;  ok
00404171  |.  E8 0AEDFFFF   CALL easycrac.00402E80
00404176  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00404179  |.  BA 2C424000   MOV EDX,easycrac.0040422C                ;  thanks a lot
0040417E  |.  E8 FDECFFFF   CALL easycrac.00402E80
00404183  |>  6A 00         PUSH 0
++++++++++++++++++++++++++++++++++++++++++++++++++++
在0040412A处在信息窗口右击--数据窗口中跟随地址:
004050B8  19791126
004050BC  19791007
004050C0  11261979
004050C4  10071979
004050C8  12345678
004050CC  9ABCDEF0
004050D0  12123434
004050D4  78787878
004050D8  CCC6CCC6
004050DC  CC00CC00
004050E0  FFEFEFFF
004050E4  DDCC5555
004050E8  67678789
004050EC  CECECBCC
004050F0  778899AB
004050F4  44337766
004050F8  00000000
004050FC  00000000
00405100  00000000
SI与0F与后的数*2+4050B8对应的地址里的数,就是上面的地址对应的数,即为B。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关键CALL:
00403FA0  /$  55            PUSH EBP
00403FA1  |.  8BEC          MOV EBP,ESP
00403FA3  |.  83C4 F8       ADD ESP,-8
00403FA6  |.  53            PUSH EBX
00403FA7  |.  33D2          XOR EDX,EDX
00403FA9  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
00403FAC  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
00403FAF  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00403FB2  |.  E8 D9EFFFFF   CALL easycrac.00402F90
00403FB7  |.  33C0          XOR EAX,EAX
00403FB9  |.  55            PUSH EBP
00403FBA  |.  68 16404000   PUSH easycrac.00404016
00403FBF  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
00403FC2  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
00403FC5  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00403FC8  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00403FCB  |.  E8 B0EEFFFF   CALL easycrac.00402E80
00403FD0  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             
00403FD3  |.  E8 F8EEFFFF   CALL easycrac.00402ED0                   ;  
00403FD8  |.  8BC8          MOV ECX,EAX                              ;0用户名的位数放入ECX,即用户名位数+1
00403FDA  |.  41            INC ECX                                  ;0用户名的位数+1,即用户名位数+2
00403FDB  |.  33D2          XOR EDX,EDX
00403FDD  |.  B8 01000000   MOV EAX,1
00403FE2  |>  03D2          /ADD EDX,EDX
00403FE4  |.  8D1492        |LEA EDX,DWORD PTR DS:[EDX+EDX*4]
00403FE7  |.  8B5D F8       |MOV EBX,DWORD PTR SS:[EBP-8]
00403FEA  |.  0FB65C03 FF   |MOVZX EBX,BYTE PTR DS:[EBX+EAX-1]
00403FEF  |.  03D3          |ADD EDX,EBX
00403FF1  |.  83EA 30       |SUB EDX,30                              ;  EDX-30
00403FF4  |.  40            |INC EAX
00403FF5  |.  3BC8          |CMP ECX,EAX
00403FF7  |.^ 75 E9         \JNZ SHORT easycrac.00403FE2             ;关键循环,得到值C,在EDX中,在下面有详细解说, 
00403FF9  |.  8BDA          MOV EBX,EDX                               ;C放入EBX中
00403FFB  |.  33C0          XOR EAX,EAX
00403FFD  |.  5A            POP EDX
00403FFE  |.  59            POP ECX
00403FFF  |.  59            POP ECX
00404000  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
00404003  |.  68 1D404000   PUSH easycrac.0040401D
00404008  |>  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
0040400B  |.  BA 02000000   MOV EDX,2
00404010  |.  E8 F7EDFFFF   CALL easycrac.00402E0C
00404015  \.  C3            RETN
00404016   .^ E9 BDE8FFFF   JMP easycrac.004028D8
0040401B   .^ EB EB         JMP SHORT easycrac.00404008
0040401D   .  8BC3          MOV EAX,EBX                      ;把C的值放入EAX中
0040401F   .  5B            POP EBX
00404020   .  59            POP ECX
00404021   .  59            POP ECX
00404022   .  5D            POP EBP
00404023   .  C3            RETN


关于关键循环C:
因为程序在我们注册码第一位填加的是0,可以忽略不记,至于为什么,你看完就知道了~~
那个循环等价于:
取用户名的第一位的ASCII码-30的值*2记为a1,a1+a1*4的值记为c1.
c1+用户名第二位的ASCII码-30的值*2记为a2,a2+a2*4的值记为c2.
c2+用户名第三位的ASCII码-30的值*2记为a3,a3+a3*4的值记为c3.
.........................
这样一直循环到用户名最后一位。最后的值记为c0
取c0的后8位就是C。

因为0的ASCII码是30上面-30后就位0了,就不记入总值了,所以说忽略不记。

而用户名第一位*0,第二位*1。依次类推~~结果相加的值为A
用户名位数*2加上63的值左移10位后加上A记为B.
最后B和C比较,相等则注册成功,不等则注册失败~

总结下,经过asdmusic 兄弟提醒,求出C的那个循环原来是把注册码的16进制保存在计算机中,C即为注册码的16进制~~~:)
即B的十进制即为真码~~:)
偶新手对这些汇编的进制转换不太敏感,以后注意~~

------------------------------------------------------------------------
此crackme算法比较简单,就是把算法表达出来比较麻烦:)
如果没有看懂的朋友建议跟一遍就知道了~~~
------------------------------------------------------------------------
【版权声明】本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
所上传文件
easycrackme.rar (上传时间2006-08-04,02:17,11 KB,35 次点击)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有