首页
社区
课程
招聘
CRACKME分析(算法练习20)
2006-4-8 11:52 5848

CRACKME分析(算法练习20)

2006-4-8 11:52
5848
【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD,PEID
【破解平台】WINXP
【破解声明】简单的算法练习
----------------------------------------------------------------------
1)PEID检查,Borland Delphi 4.0 - 5.0,无壳
2)发现用字符串查找找不到什么有用的信息。但用RUN跟踪很容易找到关键点。RUN跟踪可以找到很多关键点,随便找一个就好了。寻找过程不在多说,CC兄的OD教程
  里说的很清楚了
3)找到关键点,来到这里
0044645A  |.  8D95 F0FDFFFF LEA EDX,DWORD PTR SS:[EBP-210]           ;  就在这里下断
00446460  |.  8B83 D8020000 MOV EAX,DWORD PTR DS:[EBX+2D8]
00446466  |.  E8 C1D3FDFF   CALL 26.0042382C                         ;  取注册名的位数
0044646B  |.  83BD F0FDFFFF>CMP DWORD PTR SS:[EBP-210],0             ;  输入注册名了吗?
00446472  |.  0F84 51020000 JE 26.004466C9                           ;  没有注册名就跳向失败
00446478  |.  8D95 ECFDFFFF LEA EDX,DWORD PTR SS:[EBP-214]
0044647E  |.  8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
00446484  |.  E8 A3D3FDFF   CALL 26.0042382C                         ;  取输入的假码的位数
00446489  |.  83BD ECFDFFFF>CMP DWORD PTR SS:[EBP-214],0             ;  输入注册码了吗?
00446490  |.  0F84 33020000 JE 26.004466C9                           ;  没有输入注册码就跳向失败
---------------------先是对注册信息进行初步检测
00446496  |.  FF75 C4       PUSH DWORD PTR SS:[EBP-3C]               ;  注册信息输入完整,就来到这里
00446499  |.  FF75 F8       PUSH DWORD PTR SS:[EBP-8]
0044649C  |.  FF75 F4       PUSH DWORD PTR SS:[EBP-C]
---------------------以下都是些对寄存器的操作,省略些代码
来到算法部分。。。
00446545  |.  BA 0A000000   MOV EDX,0A                               ;  使EDX=0A
0044654A  |.  E8 C1D6FBFF   CALL 26.00403C10
0044654F  |.  8B95 E0FDFFFF MOV EDX,DWORD PTR SS:[EBP-220]
00446555  |.  8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
0044655B  |.  E8 3EEFFBFF   CALL 26.0040549E
00446560  |.  8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
00446566  |.  E8 24F1FBFF   CALL 26.0040568F
0044656B  |.  E8 34C2FBFF   CALL 26.004027A4
00446570  |.  33C0          XOR EAX,EAX                              ;  EAX清零
00446572  |.  A3 30884400   MOV DWORD PTR DS:[448830],EAX            ;  为计算结果的储存赋一个地址
00446577  |.  EB 1B         JMP SHORT 26.00446594                    ;  开始计算
00446579  |>  8D85 F4FDFFFF /LEA EAX,DWORD PTR SS:[EBP-20C]          ;  注册名的每一位取完但计算仍未结束。
0044657F  |.  E8 5CF0FBFF   |CALL 26.004055E0                        ;  依次取0xD,0xA
00446584  |.  E8 1BC2FBFF   |CALL 26.004027A4                        ;  取注册名每一位的ASCII值
00446589  |.  25 FF000000   |AND EAX,0FF                             ;  去掉高位
0044658E  |.  0105 30884400 |ADD DWORD PTR DS:[448830],EAX           ;  注册名的ASCII值累加
00446594  |>  8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0044659A  |.  E8 DDEFFBFF   |CALL 26.0040557C
0044659F  |.  E8 00C2FBFF   |CALL 26.004027A4
004465A4  |.  84C0          |TEST AL,AL                              ;  计算完了吗?
004465A6  |.^ 74 D1         \JE SHORT 26.00446579                    ;  没有就继续
注意当注册名计算完后循环并没有结束,无论注册名如何,都会在最后取 0xD和0xA再计算
所以: 这个循环是把注册名的ASCII值进行累加,累加后的结果再依次加上  0xD,0xA        
把循环累加的结果设为A
继续计算。。。。。。
004465AE  |.  E8 8DEFFBFF   CALL 26.00405540
004465B3  |.  E8 ECC1FBFF   CALL 26.004027A4
004465B8  |.  8D85 F4FDFFFF LEA EAX,DWORD PTR SS:[EBP-20C]
004465BE  |.  E8 EDEFFBFF   CALL 26.004055B0
004465C3  |.  E8 DCC1FBFF   CALL 26.004027A4
004465C8  |.  33C0          XOR EAX,EAX
省略一些代码。。。
004465E4  |.  A1 30884400   MOV EAX,DWORD PTR DS:[448830]
004465E9  |.  05 46020000   ADD EAX,246                              ;  第一步计算结果A加上246
004465EE  |.  A3 34884400   MOV DWORD PTR DS:[448834],EAX            ;  储存结果
004465F3  |.  A1 34884400   MOV EAX,DWORD PTR DS:[448834]
004465F8  |.  D1F8          SAR EAX,1                                ;  结果除以2的一次方
------------------------------------------------------这一步可以总结为(A+0x246)/2。结果设为B
004465FA  |. /79 03         JNS SHORT 26.004465FF
004465FC  |. |83D0 00       ADC EAX,0
004465FF  |> \A3 38884400   MOV DWORD PTR DS:[448838],EAX
00446604  |.  A1 38884400   MOV EAX,DWORD PTR DS:[448838]
00446609  |.  F72D 38884400 IMUL DWORD PTR DS:[448838]               ;  B*B(求B的平方)
0044660F  |.  A3 3C884400   MOV DWORD PTR DS:[44883C],EAX
00446614  |.  A1 3C884400   MOV EAX,DWORD PTR DS:[44883C]
00446619  |.  2D 5B1E0000   SUB EAX,1E5B                             ;  平方的结果减去1E5B
0044661E  |.  A3 40884400   MOV DWORD PTR DS:[448840],EAX
------------------------------------------------------这一步可以总结为B*B-0x1E5B。结果设为C,
00446623  |.  8D95 DCFDFFFF LEA EDX,DWORD PTR SS:[EBP-224]
00446629  |.  8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
0044662F  |.  E8 F8D1FDFF   CALL 26.0042382C                         ;  取注册码
00446634  |.  8B85 DCFDFFFF MOV EAX,DWORD PTR SS:[EBP-224]           ;  假码放进EAX
0044663A  |.  E8 2DFCFFFF   CALL 26.0044626C
0044663F  |.  3C 01         CMP AL,1
00446641  |.  0F85 82000000 JNZ 26.004466C9
00446647  |.  8D95 D8FDFFFF LEA EDX,DWORD PTR SS:[EBP-228]
0044664D  |.  8B83 DC020000 MOV EAX,DWORD PTR DS:[EBX+2DC]
00446653  |.  E8 D4D1FDFF   CALL 26.0042382C                         ;  取假码的位数
00446658  |.  8B85 D8FDFFFF MOV EAX,DWORD PTR SS:[EBP-228]
0044665E  |.  E8 B115FCFF   CALL 26.00407C14                         ;  将假码转换成对应的16进制数
00446663  |.  3B05 40884400 CMP EAX,DWORD PTR DS:[448840]            ;  真假注册码比较
00446669  |.  75 5E         JNZ SHORT 26.004466C9                    ;  不相等就跳向失败

整个过程到此结束

----------------------------------------------------------------------
算法总结:
1)注册名的ASCII值循环相加,所得的和依次加上0xD,0xA。结果设为A
2)A加上定值246,在除以2的一次方。可以归纳为(A+0x246)/2。结果设为B
3)将B进行乘方运算,所得的积减去定值1E5B,可以归纳为B*B-0x1E5B。结果设为C
4)C转换成对应的十进制数就是要输入的注册码。
一组注册信息:
name:lovetc
Serial:387870
----------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
thinkSJ 4 2006-4-8 12:04
2
0
支持一下
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
foretell 2006-4-8 19:04
3
0
我也顶一个!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
have 2006-4-9 14:29
4
0
支持哦~~~~~~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xsxuexi 2006-4-10 14:46
5
0
我是新手,向大家学习
雪    币: 560
活跃值: (309)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
laomms 34 2006-4-12 10:40
6
0
分析的很不错。替你贴个注册机:

Public CF As Boolean '定义CF标志
Public Function SAR(xsar As Long, n As Integer) As Long '自定义Sar算术右移函数
Dim I As Integer
For I = 1 To n - 1
xsar = xsar \ 2 '右移
Next I
CF = xsar And 1 '判断是否进位
SAR = xsar \ 2 '右移
End Function

Private Sub Command1_Click()
Dim a1, a2, zcm As String

yhm = Text1.Text
For I = 1 To Len(yhm)
    a1 = a1 + (Asc(Mid(yhm, I, 1)))
Next I
    a2 = a1 + &HA + &HD
    zcm = (SAR((a2 + &H246), 1)) ^ 2 - &H1E5B
Text2.Text = zcm
End Sub

VB6 XP下通过。
雪    币: 176
活跃值: (558)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
waruqi 3 2006-4-13 21:17
7
0
学习。。。
希望多发点
游客
登录 | 注册 方可回帖
返回