首页
社区
课程
招聘
CRACKME分析(算法练习22)
发表于: 2006-4-12 17:47 6069

CRACKME分析(算法练习22)

2006-4-12 17:47
6069

【破文标题】CRACKME分析
【破文作者】逍遥风
【破解工具】OD PEID
【破解平台】winXP
【原版下载】www.crackmes.de
【破解声明】算法练习,简单的循环计算(www.crackmes.de真是个好地方,呵呵!)
----------------------------------------------------------------------
1)PEID检查。ASPack 2.11 -> Alexey Solodovnikov。简单的壳,轻松脱掉。再检查发现是用Delphi写的
2)用字符串查找很容易找到关键处。
3)根据提示来到以下代码处。
算法开始:
00458159  |.  55            push    ebp                  ;  在这里下断
0045815A  |.  68 90824500   push    00458290
0045815F  |.  64:FF30       push    dword ptr fs:[eax]
00458162  |.  64:8920       mov     fs:[eax], esp
00458165  |.  8D55 F8       lea     edx, [ebp-8]
00458168  |.  8B45 FC       mov     eax, [ebp-4]
0045816B  |.  8B80 D8020000 mov     eax, [eax+2D8]
00458171  |.  E8 16BFFCFF   call    0042408C             ;  取注册名
00458176  |.  8D55 EC       lea     edx, [ebp-14]
00458179  |.  8B45 FC       mov     eax, [ebp-4]
0045817C  |.  8B80 D8020000 mov     eax, [eax+2D8]
00458182  |.  E8 05BFFCFF   call    0042408C             ;  取注册名位数
00458187  |.  837D EC 00    cmp     dword ptr [ebp-14], >;  注册名位数与0比较(输入注册名了吗?)
0045818B  |.  75 0A         jnz     short 00458197       ;  没有输入注册名就出现提示
0045818D  |.  B8 A8824500   mov     eax, 004582A8        ;  enter you name, pls.
00458192  |.  E8 4DC1FEFF   call    004442E4
00458197  |>  8D55 E8       lea     edx, [ebp-18]
0045819A  |.  8B45 FC       mov     eax, [ebp-4]
0045819D  |.  8B80 DC020000 mov     eax, [eax+2DC]
004581A3  |.  E8 E4BEFCFF   call    0042408C             ;  取输入的注册码位数
004581A8  |.  837D E8 00    cmp     dword ptr [ebp-18], >;  输入注册码了吗?
004581AC  |.  75 0A         jnz     short 004581B8       ;  没有输入注册码就出现提示
004581AE  |.  B8 C8824500   mov     eax, 004582C8        ;  enter the serial, pls.
004581B3  |.  E8 2CC1FEFF   call    004442E4
004581B8  |>  8B45 F8       mov     eax, [ebp-8]
004581BB  |.  E8 BCB9FAFF   call    00403B7C             ;  取注册名位数
004581C0  |.  8BF8          mov     edi, eax             ;  注册名位数放进EDI,作为循环计算的次数
004581C2  |.  85FF          test    edi, edi
004581C4  |.  7E 50         jle     short 00458216
004581C6  |.  BB 01000000   mov     ebx, 1               ;  使EBX=1
004581CB  |>  8B45 F8       /mov     eax, [ebp-8]        ;  取出注册名
004581CE  |.  0FB67418 FF   |movzx   esi, byte ptr [eax+>;  取注册名每一位的ASCII值
004581D3  |.  8BC6          |mov     eax, esi            ;  EAX=注册名每一位的ASCII值
004581D5  |.  B9 06000000   |mov     ecx, 6              ;  使ECX=6
004581DA  |.  33D2          |xor     edx, edx            ;  EDX清零
004581DC  |.  F7F1          |div     ecx                 ;  EAX中的值除以ECX中的值(注册名每一位的ASCII码除以0x6,A1)
004581DE  |.  8B55 F8       |mov     edx, [ebp-8]        ;  取出注册名
004581E1  |.  8BD6          |mov     edx, esi            ;  EAX=注册名每一位的ASCII值
004581E3  |.  C1EA 02       |shr     edx, 2              ;  EDX中的值除以2的平方(注册名每一位的ASCII码除以2的平方,A2)
004581E6  |.  F7EA          |imul    edx                 ;  EAX=EAX*EDX
004581E8  |.  50            |push    eax                 ;  把所得的积储存(把积设为A)
004581E9  |.  8B45 F8       |mov     eax, [ebp-8]        ;  取出注册名
004581EC  |.  8BC6          |mov     eax, esi            ;  EAX=注册名每一位的ASCII值
004581EE  |.  B9 0A000000   |mov     ecx, 0A             ;  使ECX=0xA
004581F3  |.  33D2          |xor     edx, edx            ;  EDX清零
004581F5  |.  F7F1          |div     ecx                 ;  EAX中的值除以ECX中的值(注册名每一位的ASCII值除以0xA)。结果设为B
004581F7  |.  5A            |pop     edx                 ;  取出A
004581F8  |.  92            |xchg    eax, edx
004581F9  |.  8BCA          |mov     ecx, edx            ;  使ECX=EDX
004581FB  |.  33D2          |xor     edx, edx            ;  EDX清零
004581FD  |.  F7F1          |div     ecx                 ;  EAX/ECX(用A除以B)
004581FF  |.  8D55 E4       |lea     edx, [ebp-1C]
00458202  |.  E8 FDF8FAFF   |call    00407B04            ;  A除以B所得的商转换成对应的十进制数
00458207  |.  8B55 E4       |mov     edx, [ebp-1C]       ;  结果放进EDX中
0045820A  |.  8D45 F4       |lea     eax, [ebp-C]
0045820D  |.  E8 72B9FAFF   |call    00403B84            ;  合并每次计算的结果组成一个字符串设为C
00458212  |.  43            |inc     ebx                 ;  每计算一次EBX+1
00458213  |.  4F            |dec     edi                 ;  每计算一次EDI-1
00458214  |.^ 75 B5         \jnz     short 004581CB      ;  循环计算
00458216  |>  68 E8824500   push    004582E8             ;  adcm4-(固定字符串1)
0045821B  |.  FF75 F4       push    dword ptr [ebp-C]
0045821E  |.  68 F8824500   push    004582F8             ;  -yeah!(固定字符串2)
00458223  |.  8D45 F0       lea     eax, [ebp-10]
00458226  |.  BA 03000000   mov     edx, 3
0045822B  |.  E8 0CBAFAFF   call    00403C3C             ;  将计算结果C与固定字符串合并,字符串1-C-字符串2
00458230  |.  8D55 E0       lea     edx, [ebp-20]
00458233  |.  8B45 FC       mov     eax, [ebp-4]
00458236  |.  8B80 DC020000 mov     eax, [eax+2DC]
0045823C  |.  E8 4BBEFCFF   call    0042408C             ;  取输入的注册码
00458241  |.  8B55 E0       mov     edx, [ebp-20]        ;  EDX=输入的注册码
00458244  |.  8B45 F0       mov     eax, [ebp-10]        ;  EAX=正确的注册码
00458247  |.  E8 40BAFAFF   call    00403C8C             ;  注册码比较CALL
0045824C  |.  75 0A         jnz     short 00458258       ;  不相等就跳向失败
0045824E  |.  B8 08834500   mov     eax, 00458308        ;  well done cracker, you did it!
算法结束

----------------------------------------------------------------------
算法总结:
1)用注册名每一位的ASCII值除以0x6。得到结果设为A1
2)用注册名每一位的ASCII值除以2的平方。得到的结果设为A2
3)设A=(A1)*(A2)
4)用注册名每一位的ASCII值除以0xA。得到结果设为B
5)将A除以B所得的商转换成对应的十进制数。设为Cn  (n为循环次数)
6)如上循环计算,注册名位数为循环次数。并把每次计算结果C1。。。Cn合并得到C
7)把C与两个固定字符串合并,形如:固定字符串1-C-固定字符串2

注册名:lovetc
注册码:ADCM4-484450405042-YEAH!
----------------------------------------------------------------------
【版权声明】本文只为交流,转载请保留作者及文章完整性。


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 50161
活跃值: (20665)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
逍遥风 真是佩服你,以后可以出个专辑了。;)
2006-4-12 18:00
0
雪    币: 2256
活跃值: (941)
能力值: (RANK:2210 )
在线值:
发帖
回帖
粉丝
3
说的我不好意思了
我只是喜欢所以有时间就做做。呵呵
(拿软件练习会涉及版权,再怎么说也是学法的。)
2006-4-12 18:02
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
我也成功破了一个
2006-4-13 21:23
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
5
补个注册机:

Public CF As Boolean
Public Function SHR(iShr As Long, n As Integer) As Long
  Dim i As Integer
  For i = 1 To n - 1
    iShr = iShr \ 2
  Next i
  CF = iShr And 1
  SHR = iShr \ 2
End Function
Private Sub Command1_Click()
Dim a, b As String

If Text1.Text = "" Then
    MsgBox "忘了输入用户名了吧!"
Else
For i = 1 To Len(Text1.Text)
    a = Asc(Mid(Text1.Text, i, 1))
    b = b & Fix((a \ &H6) * (SHR(Val(a), 2)) / (a \ &HA))
Next i
End If   
Text2.Text = "ADCM4-" & Val(b) & "-YEAH!"

End Sub
上传的附件:
2006-4-14 16:15
0
游客
登录 | 注册 方可回帖
返回
//