中国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
再来一个CRACKME算法分析(适合新手)
作者:逍遥风 时间:2006-12-15 10:36 出处:pediy.com 责编:月夜寒箫
              摘要:再来一个CRACKME算法分析(适合新手)
------------------------------------------------------------------------
1)PEID检查,MASM32 / TASM32 [Overlay] ,无壳。
2)试运行程序,任意输入注册信息后,出现错误提示“try,again”
3)OD载入程序,用超级字符串查找。
超级字串参考+        , 条目 3
 地址=004011F6
 反汇编=PUSH CrackMe0.004020E9
 文本字串=try again
双击,来到004011F6,向上找,发现有两处调用了GetDlgItemTextA.那就在第一处下断。
4)OD重新载入程序,任意输入注册信息确定后,程序被中断。
00401139   $  6A 32         PUSH 32                                  ; /Count = 32 (50.)
0040113B   .  68 F3204000   PUSH CrackMe0.004020F3                   ; |Buffer = CrackMe0.004020F3
00401140   .  68 C8000000   PUSH 0C8                                 ; |ControlID = C8 (200.)
00401145   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
00401148   .  E8 DE000000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \取注册名位数
0040114D   .  83F8 00       CMP EAX,0                                ;  输入注册名了吗
00401150   .  0F84 99000000 JE CrackMe0.004011EF                     ;  没有注册名则跳向失败
00401156   .  83F8 04       CMP EAX,4                                ;  注册名是否大于四位
00401159   .  0F82 90000000 JB CrackMe0.004011EF                     ;  小于四位就跳向失败
0040115F   .  33C9          XOR ECX,ECX                              ;  ECX清零
00401161   .  33DB          XOR EBX,EBX                              ;  EBX清零
00401163   .  33F6          XOR ESI,ESI                              ;  ESI清零
00401165   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX             ;  EAX=注册名位数,放进EBP-4
00401168   >  0FBE81 F32040>MOVSX EAX,BYTE PTR DS:[ECX+4020F3]       ;  取注册名每一位的ASCII值,并放进EAX
0040116F   .  83F8 20       CMP EAX,20                               ;  比较注册名每一位的ASCII值是否等于20
00401172   .  74 07         JE SHORT CrackMe0.0040117B              
00401174   .  6BC0 04       IMUL EAX,EAX,4                           ;  EAX=EAX*4  (过程1开始)
00401177   .  03D8          ADD EBX,EAX                              ;  EBX=EAX+EBX
00401179   .  8BF3          MOV ESI,EBX                              ;  EBX的值给ESI
0040117B   >  41            INC ECX                                  ;  每计算一次ECX+1
0040117C   .  3B4D FC       CMP ECX,DWORD PTR SS:[EBP-4]             ;  计算完了没,没有则继续计算
0040117F   .^ 75 E7         JNZ SHORT CrackMe0.00401168                 
00401181   .  83FE 00       CMP ESI,0                                ;  结果是否为零
00401184   .  74 69         JE SHORT CrackMe0.004011EF               ;  等于零则跳向失败
00401186   .  BB 89476500   MOV EBX,654789                           ;  令EBX=654789         (过程2开始)
0040118B   >  0FBE81 F22040>MOVSX EAX,BYTE PTR DS:[ECX+4020F2]       ;  从右向左取用户名每一位的ASCII值
00401192   .  4B            DEC EBX                                  ;  每计算一次EBX-1
00401193   .  6BC3 02       IMUL EAX,EBX,2                           ;  EAX=EBX*2
00401196   .  03D8          ADD EBX,EAX                              ;  EBX=EAX+EBX
00401198   .  4B            DEC EBX                                  ;  每计算一次EBX-1
00401199   .  49            DEC ECX                                  ;  每计算一次ECX-1
0040119A   .^ 75 EF         JNZ SHORT CrackMe0.0040118B              ;  
0040119C   .  56            PUSH ESI                                 ; /<%lu>
0040119D   .  53            PUSH EBX                                 ; |<%lX>
0040119E   .  68 C7204000   PUSH CrackMe0.004020C7                   ; |bs-%lx-%lu
004011A3   .  68 BB214000   PUSH CrackMe0.004021BB                   ; |s = CrackMe0.004021BB
004011A8   .  E8 6C000000   CALL <JMP.&USER32.wsprintfA>             ; 连接各段注册码
004011AD   .  58            POP EAX
004011AE   .  58            POP EAX
004011AF   .  58            POP EAX
004011B0   .  58            POP EAX
004011B1   .  E8 01000000   CALL CrackMe0.004011B7
004011B6   .  C3            RETN
004011B7   $  33C9          XOR ECX,ECX
004011B9   .  6A 32         PUSH 32                                  ; /Count = 32 (50.)
004011BB   .  68 57214000   PUSH CrackMe0.00402157                   ; |Buffer = CrackMe0.00402157
004011C0   .  68 C9000000   PUSH 0C9                                 ; |ControlID = C9 (201.)
004011C5   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hWnd
004011C8   .  E8 5E000000   CALL <JMP.&USER32.GetDlgItemTextA>       ; \GetDlgItemTextA
004011CD   .  83F8 00       CMP EAX,0
004011D0   .  74 1D         JE SHORT CrackMe0.004011EF
004011D2   .  33C9          XOR ECX,ECX
004011D4   >  0FBE81 572140>MOVSX EAX,BYTE PTR DS:[ECX+402157]
004011DB   .  0FBE99 BB2140>MOVSX EBX,BYTE PTR DS:[ECX+4021BB]
004011E2   .  3BC3          CMP EAX,EBX
004011E4   .  75 09         JNZ SHORT CrackMe0.004011EF
004011E6   .  83F8 00       CMP EAX,0
004011E9   .  74 19         JE SHORT CrackMe0.00401204
004011EB   .  41            INC ECX
004011EC   .^ EB E6         JMP SHORT CrackMe0.004011D4
004011EE   .  C3            RETN
004011EF   >  6A 10         PUSH 10                                  ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1   .  68 E4204000   PUSH CrackMe0.004020E4                   ; |nope
004011F6   .  68 E9204000   PUSH CrackMe0.004020E9                   ; |try again
004011FB   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
004011FE   .  E8 34000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
00401203   .  C3            RETN                                       
00401204   >  6A 40         PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206   .  68 D2204000   PUSH CrackMe0.004020D2                   ; |solved
0040120B   .  68 D9204000   PUSH CrackMe0.004020D9                   ; |well done.
00401210   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
00401213   .  E8 1F000000   CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA


------------------------------------------------------------------------
BY 逍遥风
算法总结:
1)过程1:注册名必须大于等于4位,取用户名每一位的对应的16进制数,与4相乘。并把结果相加,设为“甲”
2)过程2:可以归纳出一个通项公式:其中A1=654789为定值。A2=[(A1-1)*2]-1+(A1-1)。。。A(n)={[A(n-1)-1]*2}-1+[A(n-1)-1],n=注册名位数。所得A(n)设为“乙”
3)将“甲”转换成相应的十进制。
4)合并注册码:BS-乙-甲(十进制)
例:注册名tcxb
1)取t的16进制值等于74,74*4=1D0。取c的16进制值等于63,63*4=18C。取x的16进制值等于78,78*4=1E0
   取b的16进制值等于62,62*4=188。1DO+18C+1E0+188=6C4。
2)根据上面所的的通项公式A1=654789,n+1=5,则A2=12FD697,A3=38F83C1,A4=AAE8B3F,A5=200BA1B9
   所以A5=乙
3)联结BS-乙-甲(十进制):BS-200BA1B9-480
所以:注册名tcxb
      注册码BS-200BA1B9-1732
----------------------------------------------------------------------
有疏漏或错误的地方请大家指出。谢谢
所上传文件
crackme.rar (上传时间2006-02-10,10:38,2.6 KB,112 次点击)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有