中国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:39 出处:pediy.com 责编:月夜寒箫
              摘要:CRACKME破解分析(简单的逆推练习)
【破文标题】CRACKME破解分析
【破文作者】逍遥风
【破解工具】OD, 计算器
【破解平台】WINXP
【破解声明】菜鸟偶得一点心得,与大家分享
----------------------------------------------------------------------

ACG'S CRACKME
简单的CRACKME练习.主要练习逆推出注册码

这个CRACKME的主要验证过程是

F(注册名)+G(注册码) = 定值.

用OD载入这个CRACKME,根据字符串提示信息很容易找到关键代码

来到关键代码处


0040124C   .  6A 28         PUSH 28                            ; /Count = 28 (40.)
0040124E   .  68 06214000   PUSH crcme1.00402106               ; |Buffer = crcme1.00402106
00401253   .  68 E9030000   PUSH 3E9                           ; |ControlID = 3E9 (1001.)
00401258   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]          ; |hWnd
0040125B   .  E8 10020000   CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00401260   .  83F8 05       CMP EAX,5                          ;  注册名位数与5比较
00401263   .  0F82 BD000000 JB crcme1.00401326                 ;  小于5位就跳向失败

注册名位数不得小于5位

00401269   .  6A 28         PUSH 28                            ; /Count = 28 (40.)
0040126B   .  68 2E214000   PUSH crcme1.0040212E               ; |Buffer = crcme1.0040212E
00401270   .  68 EA030000   PUSH 3EA                           ; |ControlID = 3EA (1002.)
00401275   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]          ; |hWnd
00401278   .  E8 F3010000   CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040127D   .  BF 06214000   MOV EDI,crcme1.00402106            ;  取输入的注册码
00401282   .  33DB          XOR EBX,EBX                        ;  EBX清零
00401284   .  33C0          XOR EAX,EAX                        ;  EAX清零
00401286   >  8A1F          MOV BL,BYTE PTR DS:[EDI]           ;  取注册名每一位的ASCII码
00401288   .  80FB 20       CMP BL,20                          ;  格式验证
0040128B   .  0F82 95000000 JB crcme1.00401326
00401291   .  03C3          ADD EAX,EBX                        ;  注册名每一位的 ASCII码累加
00401293   .  47            INC EDI                            ;  每计算一次EDI中的值加1
00401294   .  803F 00       CMP BYTE PTR DS:[EDI],0            ;  累加完了吗
00401297   .^ 75 ED         JNZ SHORT crcme1.00401286          ;  循环计算

将注册名的每一位进行累加计算
例如:
注册名lovetc, 对应的累加结果就是28D

00401299   .  C1C0 03       ROL EAX,3                          ;  累加的结果设为A,ROL(A,3)得到B
0040129C   .  35 A5150500   XOR EAX,515A5                      ;  XOR(B,0x515A5),得到的结果设为C

到这里对注册名的计算就完成了.

对注册名的计算步骤是:

1)将注册名的每一位进行累加
2)ROL(累加结果,3),得到B
3) 将B与定值0x515A5进行XOR运算,得到最后结果C


004012A1   .  50            PUSH EAX
004012A2   .  33C0          XOR EAX,EAX
004012A4   .  33DB          XOR EBX,EBX
004012A6   .  33FF          XOR EDI,EDI                        ;  个寄存器清零
004012A8   .  BE 2E214000   MOV ESI,crcme1.0040212E            ;  使ESI等于输入的注册码
004012AD   >  B8 0A000000   MOV EAX,0A                         ;  令EAX等于定值0xA
作者:逍遥风
004012B2   .  8A1E          MOV BL,BYTE PTR DS:[ESI]           ;  取注册码的每一位进行转换
004012B4   .  85DB          TEST EBX,EBX
004012B6   .  74 15         JE SHORT crcme1.004012CD
004012B8   .  80FB 30       CMP BL,30                          ;  格式验证
004012BB   .  72 69         JB SHORT crcme1.00401326
004012BD   .  80FB 39       CMP BL,39                          ;  格式验证
004012C0   .  7F 64         JG SHORT crcme1.00401326
004012C2   .  83EB 30       SUB EBX,30
004012C5   .  0FAFF8        IMUL EDI,EAX
004012C8   .  03FB          ADD EDI,EBX
004012CA   .  46            INC ESI
004012CB   .^ EB E0         JMP SHORT crcme1.004012AD          ;  循环计算

在注意这里,这个循环的作用是将输入的注册码转换成对应的16进制形式

004012CD   >  81F7 CA870000 XOR EDI,87CA                       ;  XOR(注册码的16进制,0x87CA),得到的结果设为D
004012D3   .  8BDF          MOV EBX,EDI

以上代码是对输入的注册码进行的计算.

主要步骤是将注册码的16进制与定值0x87CA)进行XOR运算

004012D5   .  58            POP EAX
004012D6   .  03C3          ADD EAX,EBX                        ;  将注册名和注册码的计算结果相加,得到的和设为E

将注册名的计算结果与注册码的计算结果相加

004012D8   .  35 E7970700   XOR EAX,797E7                      ;  XOR(E,0x797E7)
004012DD   .  85C0          TEST EAX,EAX                       ;  检验是否等于零

从这里可以得知,最后的计算结果必须等于0x797E7
就是说:
F (注册名) + G (注册码) = 定值0x797E7


004012DF   .  75 45         JNZ SHORT crcme1.00401326          ;  不等于零就跳向失败
004012E1   .  6A 00         PUSH 0                             ; /Style = MB_OK|MB_APPLMODAL
004012E3   .  68 1B204000   PUSH crcme1.0040201B               ; |-=acg=- t h e   b e s t -=acg=-
004012E8   .  68 77204000   PUSH crcme1.00402077               ; |Text = "Yeah You Did It!!!
Czyli nareszczie ci si?uda硂
Teraz mo縠sz przy彻czy?si?do ACG"
004012ED   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]          ; |hOwner
004012F0   .  E8 5D010000   CALL <JMP.&USER32.MessageBoxA>     ; \MessageBoxA


----------------------------------------------------------------------
算法总结:
由于注册信息必须满足
F(注册名) + G(注册码) = 定值
所以要进行逆推.已知定值等于0x797E7

很容易得出:G(注册码) = 定值0x797E7 - F(注册名)

根据分析的结论,以注册名lovetc为例,
F(注册名) = 0x501CD
所以: G(注册码) = 定值0x797E7 - F(注册名) = 0x797E7 -  0x501CD = 0x296EA

因为
G(注册码) = XOR(注册码的16进制,0x87CA), 

所以:注册码的16进制就等于XOR(0x296EA,0x87CA) 
即::注册码的16进制 = XOR(0x296EA,0x87CA)  = 211D0

所以注册码就应该等于135632

注册名:lovetc
注册码:135632

----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整
所上传文件
crcme1.rar (上传时间2006-10-04,13:11,2.6 KB,110 次点击)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有