首页
社区
课程
招聘
[已解决]一个程序的算法问题
发表于: 2009-6-9 13:02 5188

[已解决]一个程序的算法问题

2009-6-9 13:02
5188
小弟刚学习软件破解,英文不好,下了一个中文小程序,分析了一下这个程序的算法,没有分析明白。能否给小弟一点提示?

小弟分析结果:
1.首先判断注册码是否大于10位,否则注册失败
2.貌似是用假注册码来算的。

程序下载:

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哎,没有人回答,
2009-6-10 12:30
0
雪    币: 141
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
わかりました!!
2009-6-10 12:47
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
小弟刚学破解,分析过程可那有点乱或者错误,清谅解。
我分析如下:
用od加载程序,查找关键字符串来到关键call

00491B80  /.  55            PUSH EBP
00491B81  |.  8BEC          MOV EBP,ESP
00491B83  |.  6A 00         PUSH 0
00491B85  |.  6A 00         PUSH 0
00491B87  |.  53            PUSH EBX
00491B88  |.  56            PUSH ESI
00491B89  |.  8BF0          MOV ESI,EAX
00491B8B  |.  33C0          XOR EAX,EAX
00491B8D  |.  55            PUSH EBP
00491B8E  |.  68 651C4900   PUSH crackme.00491C65
00491B93  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
00491B96  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
00491B99  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
00491B9C  |.  8B86 FC020000 MOV EAX,DWORD PTR DS:[ESI+2FC]
00491BA2  |.  E8 211CFBFF   CALL crackme.004437C8
00491BA7  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491BAA  |.  E8 69FFFFFF   CALL crackme.00491B18                    ;  此call为关键call,按f7进入
00491BAF  |.  84C0          TEST AL,AL
00491BB1  |.  0F84 89000000 JE crackme.00491C40                      ;  此跳为关键跳,但是改此跳不能完美爆破。程序重启后还得重新注册。

我输入的用户名:maomao   假注册码:0123456789
进入此(00491BAA  |.  E8 69FFFFFF   CALL crackme.00491B18call,f8单步来到
00491B38  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491B3B  |.  E8 9C2CF7FF   CALL crackme.004047DC
00491B40  |.  83F8 0A       CMP EAX,0A                               ;  判断注册码是否大于10位,否则直接跳过算法部分
,00491B43  |.  7C 0E         JL SHORT crackme.00491B53
00491B45  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491B48  |.  E8 F7FCFFFF   CALL crackme.00491844                    ;  此call重要,必须进入
00491B4D  |.  84C0          TEST AL,AL
00491B4F  |.  74 02         JE SHORT crackme.00491B53

继续f7进入后,单步来到
00491892  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
00491895  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491898  |.  8A52 01       MOV DL,BYTE PTR DS:[EDX+1]               ;  读取假注册码的第二位
0049189B  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
0049189E  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918A1  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
004918A4  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
004918A7  |.  E8 2816F7FF   CALL crackme.00402ED4
004918AC  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918AF  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
004918B2  |.  8A52 04       MOV DL,BYTE PTR DS:[EDX+4]               ;  读取第五位
004918B5  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
004918B8  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918BB  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
004918BE  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
004918C1  |.  B1 02         MOV CL,2
004918C3  |.  E8 DC15F7FF   CALL crackme.00402EA4
004918C8  |.  8D55 E4       LEA EDX,DWORD PTR SS:[EBP-1C]            ;  把从假注册码取出的两位放在一起
004918CB  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004918CE  |.  E8 0116F7FF   CALL crackme.00402ED4
004918D3  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918D6  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
004918D9  |.  8A52 06       MOV DL,BYTE PTR DS:[EDX+6]               ;  读取第7位
004918DC  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
004918DF  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918E2  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
004918E5  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004918E8  |.  B1 03         MOV CL,3
004918EA  |.  E8 B515F7FF   CALL crackme.00402EA4
004918EF  |.  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
004918F2  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
004918F5  |.  E8 DA15F7FF   CALL crackme.00402ED4
004918FA  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918FD  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491900  |.  8A52 07       MOV DL,BYTE PTR DS:[EDX+7]               ;  读取第八位
00491903  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
00491906  |.  C600 01       MOV BYTE PTR DS:[EAX],1
00491909  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
0049190C  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
0049190F  |.  B1 04         MOV CL,4
00491911  |.  E8 8E15F7FF   CALL crackme.00402EA4
00491916  |.  8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
00491919  |.  8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
0049191C  |.  E8 B315F7FF   CALL crackme.00402ED4
00491921  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
00491924  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491927  |.  8A52 09       MOV DL,BYTE PTR DS:[EDX+9]               ;  读取第九位
0049192A  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
0049192D  |.  C600 01       MOV BYTE PTR DS:[EAX],1
00491930  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
00491933  |.  8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
00491936  |.  B1 05         MOV CL,5
00491938  |.  E8 6715F7FF   CALL crackme.00402EA4
0049193D  |.  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
00491940  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
00491943  |.  E8 382EF7FF   CALL crackme.00404780
00491948  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
0049194B  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
0049194E  |.  59            POP ECX                                  ;  这出站的是假注册码的位数
0049194F  |.  E8 D42EF7FF   CALL crackme.00404828
00491954  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  从假注册码中取出的2、5、7、10位和注册码的位数放在一起,我假设为x
00491957  |.  0FB600        MOVZX EAX,BYTE PTR DS:[EAX]              ;  从x中取出第一位
0049195A  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049195D  |.  0FB652 01     MOVZX EDX,BYTE PTR DS:[EDX+1]            ;  取出第二位
00491961  |.  03C2          ADD EAX,EDX                              ;  貌似主要的算法从这开始
00491963  |.  B9 05000000   MOV ECX,5
00491968  |.  99            CDQ
00491969  |.  F7F9          IDIV ECX
0049196B  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为b
0049196E  |.  8855 F4       MOV BYTE PTR SS:[EBP-C],DL
00491971  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00491974  |.  33C9          XOR ECX,ECX
00491976  |.  8A48 02       MOV CL,BYTE PTR DS:[EAX+2]               ;  取x的第3位
00491979  |.  8BC1          MOV EAX,ECX
0049197B  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049197E  |.  0FB652 03     MOVZX EDX,BYTE PTR DS:[EDX+3]            ;  第4为
00491982  |.  03C2          ADD EAX,EDX
00491984  |.  BE 05000000   MOV ESI,5
00491989  |.  99            CDQ
0049198A  |.  F7FE          IDIV ESI
0049198C  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为e
0049198F  |.  8855 F5       MOV BYTE PTR SS:[EBP-B],DL
00491992  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00491995  |.  0FB640 04     MOVZX EAX,BYTE PTR DS:[EAX+4]            ;  第5位
00491999  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049199C  |.  0FB652 05     MOVZX EDX,BYTE PTR DS:[EDX+5]            ;  第6位
004919A0  |.  03C2          ADD EAX,EDX
004919A2  |.  BE 05000000   MOV ESI,5
004919A7  |.  99            CDQ
004919A8  |.  F7FE          IDIV ESI
004919AA  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为b
004919AD  |.  8855 F6       MOV BYTE PTR SS:[EBP-A],DL
004919B0  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004919B3  |.  0FB640 06     MOVZX EAX,BYTE PTR DS:[EAX+6]            ;  第7位
004919B7  |.  03C1          ADD EAX,ECX
004919B9  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
004919BC  |.  0FB652 01     MOVZX EDX,BYTE PTR DS:[EDX+1]            ;  取x的第二位
004919C0  |.  03C2          ADD EAX,EDX
004919C2  |.  B9 05000000   MOV ECX,5
004919C7  |.  99            CDQ
004919C8  |.  F7F9          IDIV ECX
004919CA  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为e
004919CD  |.  8855 F7       MOV BYTE PTR SS:[EBP-9],DL
我就只能分析到这,下面的我就分析的模糊不清了,忘大侠指点一下关键之处!!!!谢谢!!!
注册码也没有追出来,哎!郁闷
只会爆破,爆破关键点在:
00491B69   .^\E9 5A23F7FF   JMP crackme.00403EC8
00491B6E   .^ EB F0         JMP SHORT crackme.00491B60
00491B70   .  8BC3          MOV EAX,EBX                              ;  此为爆破关键点,吧mov改为or
00491B72   .  5B            POP EBX
00491B73   .  59            POP ECX
00491B74   .  5D            POP EBP
00491B75   .  C3            RETN

希望大大们指点一下
2009-6-10 20:21
0
雪    币: 295
活跃值: (346)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
5
设假码: "ABCDEFGHIJKL",    长度 = 12

2、5、7、8、10位,再加长度,得 "BEGHJ12"

再做如下运算:
('B'+'E') % 5      + 'a' ==> x1
('G'+'H') % 5      + 'a' ==> x2
('J'+'1') % 5      + 'a' ==> x3
('2'+'B'+'G') % 5  + 'a' ==> x4

设x1x2x3x4 为 "abcd"

'A' 应满足 ( 'A' % 0x3b ) <= 0x2e
'I' 应满足 ( 'I' % 0x3d ) <= 0x2a

由 "BEGHJ12" 和 "abcd" 挑出8位排成 dEbG12

最后判断 adEbG12 == "be9c912" ?
2009-6-11 04:16
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
标 题: 一个小程序的算法分析送给初学者
作 者: mkamao
时 间: 2009-06-11,23:00
链接:http://bbs.pediy.com/showthread.php?p=640505#post640505

小弟刚学破解,分析过程可那有点乱或者错误,清谅解。
本程序无壳,直接用od加载程序,查找关键字符串来到关键call

00491B80  /.  55            PUSH EBP
00491B81  |.  8BEC          MOV EBP,ESP
00491B83  |.  6A 00         PUSH 0
00491B85  |.  6A 00         PUSH 0
00491B87  |.  53            PUSH EBX
00491B88  |.  56            PUSH ESI
00491B89  |.  8BF0          MOV ESI,EAX
00491B8B  |.  33C0          XOR EAX,EAX
00491B8D  |.  55            PUSH EBP
00491B8E  |.  68 651C4900   PUSH crackme.00491C65
00491B93  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
00491B96  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
00491B99  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
00491B9C  |.  8B86 FC020000 MOV EAX,DWORD PTR DS:[ESI+2FC]
00491BA2  |.  E8 211CFBFF   CALL crackme.004437C8
00491BA7  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491BAA  |.  E8 69FFFFFF   CALL crackme.00491B18                    ;  此call为关键call,按f7进入
00491BAF  |.  84C0          TEST AL,AL
00491BB1  |.  0F84 89000000 JE crackme.00491C40                      ;  此跳为关键跳,但是改此跳不能完美爆破。程序重启后还得重新注册。

我输入的用户名:maomao   假注册码:A1234567B910
进入此(00491BAA  |.  E8 69FFFFFF   CALL crackme.00491B18call,f8单步来到
00491B38  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491B3B  |.  E8 9C2CF7FF   CALL crackme.004047DC
00491B40  |.  83F8 0A       CMP EAX,0A                               ;  判断注册码是否大于10位,否则直接跳过算法部分
,00491B43  |.  7C 0E         JL SHORT crackme.00491B53
00491B45  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491B48  |.  E8 F7FCFFFF   CALL crackme.00491844                    ;  此call重要,必须进入
00491B4D  |.  84C0          TEST AL,AL
00491B4F  |.  74 02         JE SHORT crackme.00491B53

继续f7进入后,单步来到
00491892  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
00491895  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491898  |.  8A52 01       MOV DL,BYTE PTR DS:[EDX+1]               ;  读取假注册码的第二位
0049189B  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
0049189E  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918A1  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
004918A4  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
004918A7  |.  E8 2816F7FF   CALL crackme.00402ED4
004918AC  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918AF  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
004918B2  |.  8A52 04       MOV DL,BYTE PTR DS:[EDX+4]               ;  读取第五位
004918B5  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
004918B8  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918BB  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
004918BE  |.  8D45 E4       LEA EAX,DWORD PTR SS:[EBP-1C]
004918C1  |.  B1 02         MOV CL,2
004918C3  |.  E8 DC15F7FF   CALL crackme.00402EA4
004918C8  |.  8D55 E4       LEA EDX,DWORD PTR SS:[EBP-1C]            ;  把从假注册码取出的两位放在一起
004918CB  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004918CE  |.  E8 0116F7FF   CALL crackme.00402ED4
004918D3  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918D6  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
004918D9  |.  8A52 06       MOV DL,BYTE PTR DS:[EDX+6]               ;  读取第7位
004918DC  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
004918DF  |.  C600 01       MOV BYTE PTR DS:[EAX],1
004918E2  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
004918E5  |.  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
004918E8  |.  B1 03         MOV CL,3
004918EA  |.  E8 B515F7FF   CALL crackme.00402EA4
004918EF  |.  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
004918F2  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
004918F5  |.  E8 DA15F7FF   CALL crackme.00402ED4
004918FA  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
004918FD  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491900  |.  8A52 07       MOV DL,BYTE PTR DS:[EDX+7]               ;  读取第八位
00491903  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
00491906  |.  C600 01       MOV BYTE PTR DS:[EAX],1
00491909  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
0049190C  |.  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
0049190F  |.  B1 04         MOV CL,4
00491911  |.  E8 8E15F7FF   CALL crackme.00402EA4
00491916  |.  8D55 D4       LEA EDX,DWORD PTR SS:[EBP-2C]
00491919  |.  8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
0049191C  |.  E8 B315F7FF   CALL crackme.00402ED4
00491921  |.  8D45 E0       LEA EAX,DWORD PTR SS:[EBP-20]
00491924  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
00491927  |.  8A52 09       MOV DL,BYTE PTR DS:[EDX+9]               ;  读取第九位
0049192A  |.  8850 01       MOV BYTE PTR DS:[EAX+1],DL
0049192D  |.  C600 01       MOV BYTE PTR DS:[EAX],1
00491930  |.  8D55 E0       LEA EDX,DWORD PTR SS:[EBP-20]
00491933  |.  8D45 CC       LEA EAX,DWORD PTR SS:[EBP-34]
00491936  |.  B1 05         MOV CL,5
00491938  |.  E8 6715F7FF   CALL crackme.00402EA4
0049193D  |.  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
00491940  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
00491943  |.  E8 382EF7FF   CALL crackme.00404780
00491948  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
0049194B  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
0049194E  |.  59            POP ECX                                  ;  这出站的是假注册码的位数
0049194F  |.  E8 D42EF7FF   CALL crackme.00404828
00491954  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  从假注册码中取出的2、5、7、10位和注册码的位数放在一起,我假设为x
00491957  |.  0FB600        MOVZX EAX,BYTE PTR DS:[EAX]              ;  从x中取出第一位
0049195A  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049195D  |.  0FB652 01     MOVZX EDX,BYTE PTR DS:[EDX+1]            ;  取出第二位
00491961  |.  03C2          ADD EAX,EDX                              ;  貌似主要的算法从这开始
00491963  |.  B9 05000000   MOV ECX,5
00491968  |.  99            CDQ
00491969  |.  F7F9          IDIV ECX
0049196B  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为b
0049196E  |.  8855 F4       MOV BYTE PTR SS:[EBP-C],DL
00491971  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00491974  |.  33C9          XOR ECX,ECX
00491976  |.  8A48 02       MOV CL,BYTE PTR DS:[EAX+2]               ;  取x的第3位
00491979  |.  8BC1          MOV EAX,ECX
0049197B  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049197E  |.  0FB652 03     MOVZX EDX,BYTE PTR DS:[EDX+3]            ;  第4为
00491982  |.  03C2          ADD EAX,EDX
00491984  |.  BE 05000000   MOV ESI,5
00491989  |.  99            CDQ
0049198A  |.  F7FE          IDIV ESI
0049198C  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为e
0049198F  |.  8855 F5       MOV BYTE PTR SS:[EBP-B],DL
00491992  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00491995  |.  0FB640 04     MOVZX EAX,BYTE PTR DS:[EAX+4]            ;  第5位
00491999  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0049199C  |.  0FB652 05     MOVZX EDX,BYTE PTR DS:[EDX+5]            ;  第6位
004919A0  |.  03C2          ADD EAX,EDX
004919A2  |.  BE 05000000   MOV ESI,5
004919A7  |.  99            CDQ
004919A8  |.  F7FE          IDIV ESI
004919AA  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为b
004919AD  |.  8855 F6       MOV BYTE PTR SS:[EBP-A],DL
004919B0  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
004919B3  |.  0FB640 06     MOVZX EAX,BYTE PTR DS:[EAX+6]            ;  第7位
004919B7  |.  03C1          ADD EAX,ECX
004919B9  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
004919BC  |.  0FB652 01     MOVZX EDX,BYTE PTR DS:[EDX+1]            ;  取x的第二位
004919C0  |.  03C2          ADD EAX,EDX
004919C2  |.  B9 05000000   MOV ECX,5
004919C7  |.  99            CDQ
004919C8  |.  F7F9          IDIV ECX
004919CA  |.  80C2 61       ADD DL,61                                ;  余数+61,其结果ascii码为e
004919CD  |.  8855 F7       MOV BYTE PTR SS:[EBP-9],DL

接下来继续:
004919D0  |.  8D45 C8       LEA EAX,DWORD PTR SS:[EBP-38]
004919D3  |.  8A55 F4       MOV DL,BYTE PTR SS:[EBP-C]               ;  取x中的数算出的结果为bebb的第一位
004919D6  |.  E8 292DF7FF   CALL crackme.00404704
004919DB  |.  8B45 C8       MOV EAX,DWORD PTR SS:[EBP-38]
004919DE  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004919E1  |.  B9 01000000   MOV ECX,1
004919E6  |.  E8 D130F7FF   CALL crackme.00404ABC                    ;  把b放到14678912
004919EB  |.  8D45 C4       LEA EAX,DWORD PTR SS:[EBP-3C]
004919EE  |.  8A55 F7       MOV DL,BYTE PTR SS:[EBP-9]               ;  取bbeb的最后一位
004919F1  |.  E8 0E2DF7FF   CALL crackme.00404704
004919F6  |.  8B45 C4       MOV EAX,DWORD PTR SS:[EBP-3C]
004919F9  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
004919FC  |.  B9 03000000   MOV ECX,3
00491A01  |.  E8 B630F7FF   CALL crackme.00404ABC                    ;  变为b467912
00491A06  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491A09  |.  0FB600        MOVZX EAX,BYTE PTR DS:[EAX]
00491A0C  |.  B9 3B000000   MOV ECX,3B
00491A11  |.  33D2          XOR EDX,EDX
00491A13  |.  F7F1          DIV ECX
00491A15  |.  83FA 2E       CMP EDX,2E                               ;  判断假注册码的第一位是否为字母,否为注册失败
00491A18  |.  0F87 A4000000 JA crackme.00491AC2
00491A1E  |.  8D45 C0       LEA EAX,DWORD PTR SS:[EBP-40]
00491A21  |.  8A55 F5       MOV DL,BYTE PTR SS:[EBP-B]               ;  取bbeb的第三位
00491A24  |.  E8 DB2CF7FF   CALL crackme.00404704
00491A29  |.  8B45 C0       MOV EAX,DWORD PTR SS:[EBP-40]
00491A2C  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
00491A2F  |.  B9 05000000   MOV ECX,5
00491A34  |.  E8 8330F7FF   CALL crackme.00404ABC                    ;  e67912
00491A39  |.  8D45 BC       LEA EAX,DWORD PTR SS:[EBP-44]
00491A3C  |.  8A55 F6       MOV DL,BYTE PTR SS:[EBP-A]
00491A3F  |.  E8 C02CF7FF   CALL crackme.00404704
00491A44  |.  8B45 BC       MOV EAX,DWORD PTR SS:[EBP-44]
00491A47  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
00491A4A  |.  B9 09000000   MOV ECX,9
00491A4F  |.  E8 6830F7FF   CALL crackme.00404ABC
00491A54  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]             ;  b12
00491A57  |.  B9 01000000   MOV ECX,1
00491A5C  |.  BA 09000000   MOV EDX,9
00491A61  |.  E8 0E30F7FF   CALL crackme.00404A74
00491A66  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]             ;  b1b4e67912
00491A69  |.  B9 01000000   MOV ECX,1
00491A6E  |.  BA 07000000   MOV EDX,7
00491A73  |.  E8 FC2FF7FF   CALL crackme.00404A74
00491A78  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00491A7B  |.  0FB640 08     MOVZX EAX,BYTE PTR DS:[EAX+8]
00491A7F  |.  B9 3D000000   MOV ECX,3D
00491A84  |.  33D2          XOR EDX,EDX
00491A86  |.  F7F1          DIV ECX
00491A88  |.  83FA 2A       CMP EDX,2A
00491A8B  |.  77 35         JA SHORT crackme.00491AC2                ;  判断假注册码的第九位是否为字母,否则注册失败
00491A8D  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00491A90  |.  B9 01000000   MOV ECX,1
00491A95  |.  BA 02000000   MOV EDX,2
00491A9A  |.  E8 D52FF7FF   CALL crackme.00404A74                    ;  bb4e6912
00491A9F  |.  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
00491AA2  |.  B9 01000000   MOV ECX,1
00491AA7  |.  BA 06000000   MOV EDX,6
00491AAC  |.  E8 C32FF7FF   CALL crackme.00404A74
00491AB1  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00491AB4  |.  BA 101B4900   MOV EDX,crackme.00491B10                 ;  bb4e612
00491AB9  |.  E8 622EF7FF   CALL crackme.00404920                    ;  此值为软件给的固定值为be9c912,用来与用假注册码算出来的值进行比较,相等则注册成功
00491ABE  |.  75 02         JNZ SHORT crackme.00491AC2

然后找注册码的存放位置:
00491BCC  |.  E8 83D9FDFF   CALL crackme.0046F554
00491BD1  |.  B1 01         MOV CL,1
00491BD3  |.  BA 7C1C4900   MOV EDX,crackme.00491C7C                 ;  software\lansee     根据这个提示我们就可以想到它的注册码放在注册表里面。
00491BD8  |.  8BC3          MOV EAX,EBX
00491BDA  |.  E8 D9D9FDFF   CALL crackme.0046F5B8
00491BDF  |.  84C0          TEST AL,AL
00491BE1  |.  74 1D         JE SHORT crackme.00491C00
00491BE3  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
00491BE6  |.  8B86 FC020000 MOV EAX,DWORD PTR DS:[ESI+2FC]
00491BEC  |.  E8 D71BFBFF   CALL crackme.004437C8
00491BF1  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]
00491BF4  |.  BA 941C4900   MOV EDX,crackme.00491C94                 ;  serial

算法分析结果:
经过大致的分析,还有与be9c912比较,我们可以推出:
1.注册码必须是十二位的,第一位和第九位必须是字母,字母任意。
2.注册码的第五位和7位都必须是9
3.注册码的第2位与第5位相加结果对5求余+61,结果转化为ASCII码必须是b
4. 注册码的第7位与第8位相加结果对5求余+61,结果转化为ASCII码必须是c
5.注册码的第5位与第7位相加结果在加2,然后对5求余+61,结果转化为ASCII码必须是e
6.其余位数随便。
7.注册码保存在[HKEY_LOCAL_MACHINE\SOFTWARE\LanSee]下的。
这个算法必须进行逆推。才能找到知道注册码。

还有就是完美爆破的关键点:
爆破,爆破关键点在:
00491B69   .^\E9 5A23F7FF   JMP crackme.00403EC8
00491B6E   .^ EB F0         JMP SHORT crackme.00491B60
00491B70   .  8BC3          MOV EAX,EBX                              ;  此为爆破关键点,吧mov改为or
00491B72   .  5B            POP EBX
00491B73   .  59            POP ECX
00491B74   .  5D            POP EBP
00491B75   .  C3            RETN

btw:通过这次的算法分析,收获颇多。呵呵,这是俺第一次仔细分析,说来惭愧啊。学习了一两个月,看了黑鹰算法分析教程的几个例子,心就痒痒,总想自己分析一个,就下了一个小程序先分析了一下了,没有分析出来。然后在看雪求助:http://bbs.pediy.com/showthread.php?t=91136,谢谢blackeyes大哥的帮助。经过这一提示后,俺也花了一上午时间才分析出来,可能是小弟笨吧。但是幸苦分析出来了,心情还不错的。就好好地整理了一下,发出来吧,供我一样的菜菜鸟学习吧。

要想分析算法清楚明了并且速度快,还是得多多的看前辈的帖子。积累经验。就不会像我这样慢了。破解速度自然就快了。还有一点就是像前辈们说的要有一颗恒心,坚持到底。不放弃。
2009-6-11 22:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
也不知道你是怎么学的,我学了很长时间也看不懂,能教教我吗
2009-6-12 16:34
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
就我个人经验而谈。多向论坛一些破解高手询问请教,再买有关编程的书箱多研究研究。关键是实践,没有实践光有理论不行,不要怕失败,多失败几次就好了。
2009-6-12 16:50
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
需要那方面的书籍?那以后多向你请教了
2009-6-12 16:58
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
又是一帖多发额
2009-6-12 19:37
0
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
11
感谢提醒,己将两个主题合并到本帖。
2009-6-13 09:33
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
呵呵,一个求助帖与一个花时间整理出来,同等待遇!!!无人问津,呵呵,发贴失败。

我就没有明白,一贴多发是什么意思,一个求助帖与一个花幸苦时间整理出来的贡献给其他人学习一样吗?我单独开贴,就是方面大家直接看到,标题能与求助帖区别。方面大家学习。如果管管觉得一贴多发,我认为删除那求助帖就可以,以救助帖法出来不知道有什么人回去看?呵呵
2009-6-13 12:15
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
我所指的一帖多发是指lz同时在unpack 上也发了,
这种现象。。怎么说呢,投稿的话也不能同时投两份杂志的吧。。可能lz只是想让更多的人看到吧。。算我多事。。
2009-6-14 10:31
0
游客
登录 | 注册 方可回帖
返回
//