MOV 发表于 2010-3-11 01:09:28

关于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

tianxj 发表于 2010-3-13 18:52:37

最后还是没有把注册码找出来

呵呵

lgjxj 发表于 2010-3-13 19:06:29

多做记录好,我所有的分析都好像流水一样,第二天会几乎完全忘了(真的),最要命的是不想记起来 (怕再痛苦一次) /:010

现在动手在搞海风的那个G,VM 折磨人,patch 倒是比较容易的,应该是 NP 或 ZP 的变种,int3 跳转来看应该是 NP 的
,麻烦在它分批解码,现在的东西都TMM折磨人为快乐之本,郁闷

[ 本帖最后由 lgjxj 于 2010-3-13 19:09 编辑 ]

MOV 发表于 2010-3-13 19:23:39

呵呵 /:good
向lgjxj学习

tianxj大哥 /:013

流浪的风 发表于 2010-3-14 21:08:43

菜鸟 来学习了。。。。呵呵

飘云 发表于 2010-4-9 18:55:35

照分析结果看岂不是要穷举?

nuojiya8 发表于 2010-4-12 18:27:44

谢谢楼主的详细解说,收藏了

chinapyg123 发表于 2010-4-15 17:50:08

谢谢楼主的详细解说,收藏了

suave 发表于 2010-5-15 16:43:44

进来看一下群众们的分析,大家好!
页: [1]
查看完整版本: 关于Luckly大大的单注册码型 CrackMe [更新#1] 算法分析