首页
社区
课程
招聘
一个Delphi CRACKME的算法分析(适合新手)
发表于: 2006-2-9 16:45 11777

一个Delphi CRACKME的算法分析(适合新手)

2006-2-9 16:45
11777

------------------------------------------------------------------------
1)PEID,检查,Borland Delphi 4.0 - 5.0。无壳
2)试运行程序,任意输入注册信息,有错误提示“WRONG CODE”
3)OD载入程序,用超级字符串查找“WRONG CODE”
超级字串参考+        , 条目 174
地址=00441829
反汇编=MOV EDX,CrackMe0.0044188C
文本字串=wrong code
双击来到00441829处。并向上找到注册信息计算开始的地方,下断。
4)OD重新载入程序,输入注册信息确定后程序中断。
004417C6  |.  55            PUSH EBP                          在这里下断                       
004417C7  |.  68 60184400   PUSH CrackMe0.00441860
004417CC  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004417CF  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004417D2  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
004417D5  |.  8B83 C8020000 MOV EAX,DWORD PTR DS:[EBX+2C8]
004417DB  |.  E8 C419FEFF   CALL CrackMe0.004231A4                   ;  取假码位数
004417E0  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004417E3  |.  50            PUSH EAX                                 ;  EAX=假码
004417E4  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
004417E7  |.  8B83 C4020000 MOV EAX,DWORD PTR DS:[EBX+2C4]
004417ED  |.  E8 B219FEFF   CALL CrackMe0.004231A4                   ;  取注册名位数
004417F2  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  EBP-C=注册名
004417F5  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004417F8  |.  E8 FBFEFFFF   CALL CrackMe0.004416F8                   ;  算法CALL,跟进
004417FD  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
00441800  |.  58            POP EAX
00441801  |.  E8 3E23FCFF   CALL CrackMe0.00403B44                      真假注册码比较
00441806  |.  75 1A         JNZ SHORT CrackMe0.00441822                 不相等则跳向失败。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
进入算法CALL
来到这里。。。。。。
004416F8  /$  53            PUSH EBX
004416F9  |.  56            PUSH ESI
004416FA  |.  57            PUSH EDI
004416FB  |.  83C4 DC       ADD ESP,-24
004416FE  |.  891424        MOV DWORD PTR SS:[ESP],EDX
00441701  |.  8BF8          MOV EDI,EAX
00441703  |.  BB 05033949   MOV EBX,49390305
00441708  |.  BE 20126348   MOV ESI,48631220
0044170D  |.  8BC7          MOV EAX,EDI
0044170F  |.  E8 2023FCFF   CALL CrackMe0.00403A34                   ;  取注册名位数
00441714  |.  85C0          TEST EAX,EAX                             ;  有注册名吗?没有则跳向OVER
00441716  |.  7E 2E         JLE SHORT CrackMe0.00441746
00441718  |.  BA 01000000   MOV EDX,1                                ;  令EDX=1
0044171D  |>  33C9          /XOR ECX,ECX                             ;  ECX清零
0044171F  |.  8A4C17 FF     |MOV CL,BYTE PTR DS:[EDI+EDX-1]          ;  取注册名的ASCII值
00441723  |.  33D9          |XOR EBX,ECX
00441725  |.  33F3          |XOR ESI,EBX
00441727  |.  F6C3 01       |TEST BL,1                                   判断EBX的后两位转换成十进制数后的奇偶性
0044172A  |.  74 0F         |JE SHORT CrackMe0.0044173B                  偶数就跳,奇数就不跳
0044172C  |.  D1FB          |SAR EBX,1
0044172E  |.  79 03         |JNS SHORT CrackMe0.00441733
00441730  |.  83D3 00       |ADC EBX,0
00441733  |>  81F3 11032001 |XOR EBX,1200311
00441739  |.  EB 07         |JMP SHORT CrackMe0.00441742
0044173B  |>  D1FB          |SAR EBX,1                               ;  EBX/2 即EBX除以2的一次方
0044173D  |.  79 03         |JNS SHORT CrackMe0.00441742
0044173F  |.  83D3 00       |ADC EBX,0
00441742  |>  42            |INC EDX                                 ;  EDX+1
00441743  |.  48            |DEC EAX                                 ;  EAX-1
00441744  |.^ 75 D7         \JNZ SHORT CrackMe0.0044171D
00441746  |>  8B0424        MOV EAX,DWORD PTR SS:[ESP]
00441749  |.  50            PUSH EAX                                 ;  
0044174A  |.  8BC3          MOV EAX,EBX                              ;  将EBX的值赋给EAX
0044174C  |.  25 FFFF0000   AND EAX,0FFFF                            ;  取EAX的后四位
00441751  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX             ;  ESP+8=EAX的后四位
00441755  |.  C64424 0C 00  MOV BYTE PTR SS:[ESP+C],0                ;  
0044175A  |.  C1EB 10       SHR EBX,10                               ;  取EBX的前四位
0044175D  |.  895C24 10     MOV DWORD PTR SS:[ESP+10],EBX            ;  ESP+10=EBX的前四位
00441761  |.  C64424 14 00  MOV BYTE PTR SS:[ESP+14],0               ;
00441766  |.  8BC6          MOV EAX,ESI                              ;  将ESI的值赋给EAX
00441768  |.  25 FFFF0000   AND EAX,0FFFF                            ;  取ESI的后四位
0044176D  |.  894424 18     MOV DWORD PTR SS:[ESP+18],EAX            ;  ESP+18=ESI的后四位
00441771  |.  C64424 1C 00  MOV BYTE PTR SS:[ESP+1C],0               ;
00441776  |.  C1EE 10       SHR ESI,10                               ;  取ESI的前四位
00441779  |.  897424 20     MOV DWORD PTR SS:[ESP+20],ESI            ; ESP+20=ESI的前四位
0044177D  |.  C64424 24 00  MOV BYTE PTR SS:[ESP+24],0               ;
00441782  |.  8D5424 08     LEA EDX,DWORD PTR SS:[ESP+8]             ;
00441786  |.  B9 03000000   MOV ECX,3                                ;
0044178B  |.  B8 A4174400   MOV EAX,CrackMe0.004417A4                ; |%.4x-%.4x-%.4x-%.4x
00441790  |.  E8 6F68FCFF   CALL CrackMe0.00408004                   ; 合并成注册码。
00441795  |.  83C4 24       ADD ESP,24
00441798  |.  5F            POP EDI
00441799  |.  5E            POP ESI
0044179A  |.  5B            POP EBX
0044179B  \.  C3            RETN
------------------------------------------------------------------------BY 逍遥风
算法总结:
1)取用户名第一位的ASCII值。
2)将这个值与A=49390305做XOR运算。得到A1。
3)将A1与B1=48631220做XOR运算,得到B2。
4)将A1最右边两位转换成相应的十进制数,判断其奇偶性。
5)若为偶数:
     则A1除以2,结果再与1200311进行XOR运算。得到A2。
   若为奇数:
     则A1除以2,得到A2。
6)取用户名下一位的ASCII值,并与A2,B2重复以上运算。
7)循环的次数为用户名的位数。
8)将最终得到的结果An,Bn分成四段,每段四位。
9)An的后四位-An的前四位-Bn的后四位-Bn的前四位。(n=循环计算次数=用户名位数)
例:注册名tc (两位,所以循环计算两次)
第一步
    第一次:
1)取t的ASCII值74,与49390305进行XOR运算等于49390371
2)49390371再与ESI(此时ESI=48631220)进行XOR运算等于015A1151
3)将49390371的后两位即71,转换成十进制为133。
4)133是奇数所以。将49390371除以2商为249C81B8。249C81B8再与1200311进行XOR运算等于25BC82A9
   第二次:
1)取c的ASCII值63,与25BC82A9进行XOR运算等于25BC82CA
2)25BC82CA再与ESI(此时ESI=015A1151)进行XOR运算等于24E6939B
3)将25BC82CA的后两位即CA,转换成十进制为202。
4)202是偶数,所以。将25BC82CA除以2的商等于12DE4165。
第二步
    第一次:
1)将最终EBX的值An=12DE4165,按前四位后四位分成两段每段四位即:12DE,4165
2)将最终ESI的值Bn=24E6939B,按前四位后四位分成两段每段四位即:24E6,939B
    第二次
1)将An的后四位作为注册码的第一部分,前四为作为注册码的第二部分
2)将Bn的后四位作为注册码的第三部分,前四为作为注册码的第四部分
最后输出结果
4165-12DE-939B-24E6
所以:注册名tc
      注册码4165-12DE-939B-24E6
----------------------------------------------------------------------
有疏漏或错误的地方请大家指出,谢谢!


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (31)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我是一个小菜鸟,已跟过一遍,不过爆破了一下,再跟下去,发现EDX的值很象注册码,就试着输了进去,不料却对了,由此想到了keymake,想到菜鸟的痛苦
2006-2-9 20:35
0
雪    币: 225
活跃值: (1241)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
keymake已经好久没用了,都是自己试着写注册机,一路艰辛啊
  
2006-2-10 09:11
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
工作需要,现在开始学PJ,复习了汇编,下一个练练手看看
2006-2-12 19:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不发言没法下载?
2006-2-17 22:58
0
雪    币: 200
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢了,希望高手多多扔点。学习中
2006-2-19 10:16
0
雪    币: 200
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大大...我是菜菜?...
??一下,大大是如何得知是在
004417C6  |.  55            PUSH EBP
下??的呢?我?法理解?何是在那下???也不知道?如何判?他是檫始?算暂?瘁的地方....
2006-3-10 02:28
0
雪    币: 390
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
004417C6  |.  55            PUSH EBP                          在这里下断                       
004417C7  |.  68 60184400   PUSH CrackMe0.00441860
004417CC  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
004417CF  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
004417D2  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
004417D5  |.  8B83 C8020000 MOV EAX,DWORD PTR DS:[EBX+2C8]
004417DB  |.  E8 C419FEFF   CALL CrackMe0.004231A4                   ;  取假码位数
004417E0  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004417E3  |.  50            PUSH EAX                                 ;  EAX=假码
004417E4  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
004417E7  |.  8B83 C4020000 MOV EAX,DWORD PTR DS:[EBX+2C4]
004417ED  |.  E8 B219FEFF   CALL CrackMe0.004231A4                   ;  取注册名位数
004417F2  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  EBP-C=注册名
004417F5  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004417F8  |.  E8 FBFEFFFF   CALL CrackMe0.004416F8                   ;  算法CALL,跟进
004417FD  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
00441800  |.  58            POP EAX
00441801  |.  E8 3E23FCFF   CALL CrackMe0.00403B44                      真假注册码比较
00441806  |.  75 1A         JNZ SHORT CrackMe0.00441822                 不相等则跳向失败。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

老大啊,这些你是怎么分析出来的?我实在是太菜鸟了,能耐心给我讲将=讲吗?毕竟我们都是向我这样过来的
2006-3-10 18:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习学习。。。。
2006-3-13 16:43
0
雪    币: 218
活跃值: (299)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习学习。。。。
2006-3-16 15:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
俺不会算法!!!5555555555555555
2006-4-23 23:14
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
正准备破解手头一个Delphi程序,很变态的,初学破解,要走的路很长啊!!
2006-4-30 08:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
明码比较
用户名随便
注册码在004417FD MOV EDX DWORD PTR SS:[EBP-8]中显示
2006-4-30 12:21
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
已经试过一遍了,注册码能看到,只是不会分析,继续学习。
2006-5-1 00:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我是个小小菜鸟,第一次发贴!顶一下
2006-5-17 15:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习一下,看看如何PJ
2006-5-18 13:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习。。。
2006-5-23 11:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tdk
18
努力学习
这两天突击的有点晕了
2006-5-23 18:22
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
请问 你是怎么知道 什么时候拿用户名长度--用户名第一个ASC码
  我头都大了
2006-6-1 17:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习!学习!
2006-6-5 08:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 逍遥风 发布
------------------------------------------------------------------------
1)PEID,检查,Borland Delphi 4.0 - 5.0。无壳
2)试运行程序,任意输入注册信息,有错误提示“WRONG CODE”
3)OD载入程序,用超级字符串查找“WRONG CODE”
超级字串参考+ , 条目 174
........

好好学习汇编吧。。
2006-6-8 00:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
dddddddddddddddddddddddddd
2006-6-8 10:55
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
00441718  |.  BA 01000000   MOV EDX,1                                ;  令EDX=1
0044171D  |>  33C9          /XOR ECX,ECX                             ;  ECX清零
0044171F  |.  8A4C17 FF     |MOV CL,BYTE PTR DS:[EDI+EDX-1]          ;  取注册名的ASCII值

上面代码中,取注册名的ASCII值,这句怎么汇编成加1然后减1啊
搞不明白啊
2006-6-13 21:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
最初由 大笨猫 发布
004417C6 |. 55 PUSH EBP 在这里下断
004417C7 |. 68 60184400 PUSH CrackMe0.00441860
004417CC |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004417CF |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004417D2 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
........

其实代码旁边的注释大部分都是动态调试的时候看出来的,直接拿来分析效果不是很好,建议像我这样的菜边调试边看破文,呵呵
2006-6-14 18:47
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
今天才看见啊,跟了一下,有些地方还是看不太懂.
2006-6-19 17:45
0
游客
登录 | 注册 方可回帖
返回
//