关于Luckly大大的单注册码型 CrackMe [更新#1] 算法分析
本人菜鸟一个,有什么错误的地方请指正!可能有些地方没有说明白,请慢慢吸收:loveliness:
00401540 .83EC 18 SUB ESP,18
00401543 .53 PUSH EBX
00401544 .33C0 XOR EAX,EAX
00401546 .55 PUSH EBP
00401547 .56 PUSH ESI
00401548 .894424 19 MOV DWORD PTR SS:,EAX
0040154C .BE 01000000 MOV ESI,1
00401551 .57 PUSH EDI
00401552 .8BD9 MOV EBX,ECX
00401554 .894424 21 MOV DWORD PTR SS:,EAX
00401558 .56 PUSH ESI
00401559 .895C24 14 MOV DWORD PTR SS:,EBX
0040155D .C64424 20 00MOV BYTE PTR SS:,0
00401562 .884424 29 MOV BYTE PTR SS:,AL
00401566 .E8 CF030000 CALL <JMP.&MFC42.#6334>
0040156B .8B4B 60 MOV ECX,DWORD PTR DS: ;取假注册码
0040156E .8B51 F8 MOV EDX,DWORD PTR DS:
00401571 .83FA 0B CMP EDX,0B
00401574 .7D 18 JGE SHORT 0040158E
00401576 .6A 00 PUSH 0
00401578 .6A 00 PUSH 0
0040157A .68 64304000 PUSH 00403064
0040157F .8BCB MOV ECX,EBX
00401581 .E8 AE030000 CALL <JMP.&MFC42.#4224>
00401586 .5F POP EDI
00401587 .5E POP ESI
00401588 .5D POP EBP
00401589 .5B POP EBX
0040158A .83C4 18 ADD ESP,18
0040158D .C3 RETN
0040158E >0FBE01 MOVSX EAX,BYTE PTR DS: ;取假注册码的十六进制(1)
00401591 .8D7A FD LEA EDI,DWORD PTR DS: ;注册码的位数减去3
00401594 .894424 14 MOV DWORD PTR SS:,EAX ;把取假注册码的十六进制数 esp+14 保存(固定值)
00401598 .897C24 18 MOV DWORD PTR SS:,EDI ;把每次edx-3注册码的位数保存
0040159C >0FBE2C31 MOVSX EBP,BYTE PTR DS: ;取注册码的十六进制数
004015A0 .03C6 ADD EAX,ESI ;把取的第一个注册码加esi
004015A2 .25 FF000000 AND EAX,0FF ;这个是小写转大写的
004015A7 .33C5 XOR EAX,EBP ;把取的第一个注册码加+esi与取的第二个注册码 或
004015A9 .46 INC ESI ;循环加一
004015AA .3BF7 CMP ESI,EDI
004015AC .^ 7E EE JLE SHORT 0040159C
004015AE .0FBE7411 FE MOVSX ESI,BYTE PTR DS: ;取注册码的倒数第二位(1)
004015B3 .83C0 42 ADD EAX,42 ;把前8注册码计算的数加上42
004015B6 .8BF8 MOV EDI,EAX
004015B8 .C1FF 04 SAR EDI,4 ;把相加的结果右移4
004015BB .83C7 41 ADD EDI,41 ;右移的后加上41
004015BE .3BF7 CMP ESI,EDI ;结果比较
004015C0 .74 18 JE SHORT 004015DA
004015C2 .6A 00 PUSH 0
004015C4 .6A 00 PUSH 0
004015C6 .68 58304000 PUSH 00403058
004015CB .8BCB MOV ECX,EBX
004015CD .E8 62030000 CALL <JMP.&MFC42.#4224> ;提示错误
004015D2 .5F POP EDI
004015D3 .5E POP ESI
004015D4 .5D POP EBP
004015D5 .5B POP EBX
004015D6 .83C4 18 ADD ESP,18
004015D9 .C3 RETN
004015DA >0FBE5411 FF MOVSX EDX,BYTE PTR DS: ;取最后一位注册码 (2)
004015DF .83E0 0F AND EAX,0F ;eax=65 和0F进行与计算
004015E2 .83C0 41 ADD EAX,41 ;再加上41
004015E5 .3BD0 CMP EDX,EAX ;进行比较
004015E7 .74 18 JE SHORT 00401601
004015E9 .6A 00 PUSH 0
004015EB .6A 00 PUSH 0
004015ED .68 58304000 PUSH 00403058
004015F2 .8BCB MOV ECX,EBX
004015F4 .E8 3B030000 CALL <JMP.&MFC42.#4224>
004015F9 .5F POP EDI
004015FA .5E POP ESI
004015FB .5D POP EBP
004015FC .5B POP EBX
004015FD .83C4 18 ADD ESP,18
00401600 .C3 RETN
00401601 >BD 01000000 MOV EBP,1
00401606 .33FF XOR EDI,EDI
00401608 .8BF5 MOV ESI,EBP
0040160A .8D51 01 LEA EDX,DWORD PTR DS: ;取注册码
0040160D .2BF1 SUB ESI,ECX
0040160F >8A0A MOV CL,BYTE PTR DS: ;从注册码第二位开始取十六进制 (2)
00401611 .8D0416 LEA EAX,DWORD PTR DS:
00401614 .0FBE5A 01 MOVSX EBX,BYTE PTR DS: ;取注册码位数+1的注册码
00401618 .83E1 0F AND ECX,0F ;取的第一位注册码和0F进行与计算
0040161B .C1E1 04 SHL ECX,4 ;结果逻辑左移4
0040161E .D1F8 SAR EAX,1 ;注册码位数算术左移1
00401620 .8D4C19 AF LEA ECX,DWORD PTR DS: ;这个是把左移4的ecx+取的第二位注册码的和减去51,把结果设A
00401624 .8B5C24 14 MOV EBX,DWORD PTR SS: ;把先前取的注册码第二位十六进制数 (固定值)
00401628 .83C0 06 ADD EAX,6 ;位数加6
0040162B .8D4403 FF LEA EAX,DWORD PTR DS: ;把先前取的第一位注册码十六进制数加上eax-1
0040162F .25 FF000000 AND EAX,0FF ;结果与0FF进行与计算,结果设为B
00401634 .33C8 XOR ECX,EAX ;A与B 进行异或计算
00401636 .83F9 20 CMP ECX,20 ;结果与20H比较
00401639 .0F8C AF000000 JL 004016EE ;小于20H就跳
0040163F .81F9 80000000 CMP ECX,80 ;与80H比较
00401645 .0F8F A3000000 JG 004016EE ;大于80H就跳
0040164B .884C3C 1C MOV BYTE PTR SS:,CL ;把计算结果保存
0040164F .8B4C24 18 MOV ECX,DWORD PTR SS:
00401653 .83C5 02 ADD EBP,2 ;循环次数加2
00401656 .83C2 02 ADD EDX,2 ;注册码加2 每次取二个注册码
00401659 .47 INC EDI ;edi+1
0040165A .41 INC ECX ;ecx+1
0040165B .3BE9 CMP EBP,ECX
0040165D .^ 7E B0 JLE SHORT 0040160F
0040165F .83FF 02 CMP EDI,2
00401662 .7D 1A JGE SHORT 0040167E
00401664 .8B4C24 10 MOV ECX,DWORD PTR SS:
00401668 .6A 00 PUSH 0
0040166A .6A 00 PUSH 0
0040166C .68 48304000 PUSH 00403048
00401671 .E8 BE020000 CALL <JMP.&MFC42.#4224>
00401676 .5F POP EDI
00401677 .5E POP ESI
00401678 .5D POP EBP
00401679 .5B POP EBX
0040167A .83C4 18 ADD ESP,18
0040167D .C3 RETN
0040167E >8D7C24 1C LEA EDI,DWORD PTR SS:
00401682 .83C9 FF OR ECX,FFFFFFFF ;9与FFFFFFFF 进行或
00401685 .33C0 XOR EAX,EAX ;清零
00401687 .F2:AE REPNE SCAS BYTE PTR ES:
00401689 .F7D1 NOT ECX
0040168B .49 DEC ECX
0040168C .83F9 03 CMP ECX,3
0040168F .7D 18 JGE SHORT 004016A9
00401691 .8B4C24 10 MOV ECX,DWORD PTR SS:
00401695 .50 PUSH EAX
00401696 .50 PUSH EAX
00401697 .68 3C304000 PUSH 0040303C
0040169C .E8 93020000 CALL <JMP.&MFC42.#4224>
004016A1 .5F POP EDI
004016A2 .5E POP ESI
004016A3 .5D POP EBP
004016A4 .5B POP EBX
004016A5 .83C4 18 ADD ESP,18
004016A8 .C3 RETN
004016A9 >6A 02 PUSH 2 ; /maxlen = 2
004016AB .8D540C 1D LEA EDX,DWORD PTR SS: ; |
004016AF .68 38304000 PUSH 00403038 ; |s2 = "PS"
004016B4 .52 PUSH EDX ; |s1
004016B5 .FF15 B4214000 CALL DWORD PTR DS:[<&MSVCRT.strncmp>] ; \strncmp
004016BB .83C4 0C ADD ESP,0C
004016BE .85C0 TEST EAX,EAX
004016C0 .6A 00 PUSH 0
004016C2 .6A 00 PUSH 0
004016C4 .74 07 JE SHORT 004016CD
004016C6 .68 3C304000 PUSH 0040303C
004016CB .EB 05 JMP SHORT 004016D2
004016CD >68 2C304000 PUSH 0040302C
004016D2 >8B7424 1C MOV ESI,DWORD PTR SS:
004016D6 .8BCE MOV ECX,ESI
004016D8 .E8 57020000 CALL <JMP.&MFC42.#4224>
004016DD .6A 00 PUSH 0
004016DF .8BCE MOV ECX,ESI
004016E1 .E8 54020000 CALL <JMP.&MFC42.#6334>
004016E6 .5F POP EDI
004016E7 .5E POP ESI
004016E8 .5D POP EBP
004016E9 .5B POP EBX
004016EA .83C4 18 ADD ESP,18
004016ED .C3 RETN
004016EE >8B4C24 10 MOV ECX,DWORD PTR SS:
004016F2 .6A 00 PUSH 0
004016F4 .6A 00 PUSH 0
004016F6 .68 20304000 PUSH 00403020
004016FB .E8 34020000 CALL <JMP.&MFC42.#4224>
00401700 .5F POP EDI
00401701 .5E POP ESI
00401702 .5D POP EBP
00401703 .5B POP EBX
00401704 .83C4 18 ADD ESP,18
00401707 .C3 RETN
分析结果:
这个算法分成二个部分判断
第一部分:
用一个假注册码来解释 12345678910 ,取前8位假注册码比如23456789进行计算的和(计算过程从绿(1)开始),再进行计算的和和假注册码的倒数第二位比较相等不(计算过程从我标注的红(1)开始),不相等提示错误。然后再用23456789计算和,再进行计算的和和最后一位假注册码进行比较是否相等(计算过程从红(2)开始),不相等提示错误。
问题:
1、很奇怪的就是为什么注册码是从第二位开始取而不是第一位开始取,第一个注册码到哪里去了?是什么作用?
第二部分:
这部分的算法就更夸张了,从绿(2)开始:还是用一个假注册码解释 12345678910,这个算法每次取二个注册码进行计算,在和一个固定值进行计算。在这里我饶了很久后来发现一个问题一个字符串"PS",后来发现注册码最后三个组合的计算必须等于字符串“PS(”比如: 23 45 57 89 10
P(50H)S(53H) ((28H)
总结:
1、注册码最后二位必须为红(1)红(2)
2、注册码最后六位的注册码两位组合计算的字符串味"PS("
最后还是没有把注册码找出来/:013 最后还是没有把注册码找出来
呵呵 多做记录好,我所有的分析都好像流水一样,第二天会几乎完全忘了(真的),最要命的是不想记起来 (怕再痛苦一次) /:010
现在动手在搞海风的那个G,VM 折磨人,patch 倒是比较容易的,应该是 NP 或 ZP 的变种,int3 跳转来看应该是 NP 的
,麻烦在它分批解码,现在的东西都TMM折磨人为快乐之本,郁闷
[ 本帖最后由 lgjxj 于 2010-3-13 19:09 编辑 ] 呵呵 /:good
向lgjxj学习
tianxj大哥 /:013 菜鸟 来学习了。。。。呵呵 照分析结果看岂不是要穷举? 谢谢楼主的详细解说,收藏了 谢谢楼主的详细解说,收藏了 进来看一下群众们的分析,大家好!
页:
[1]