samisgod 发表于 2009-1-18 09:30

iawen CM-9 算法分析

【文章标题】: iawen CM-9 算法分析
【文章作者】: samisgod
【作者邮箱】: 21gh@163.com
【软件名称】: iawen CM-9
【下载地址】: 附件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!


某日闲的看见此CM,决定一玩...
怎么找验证函数不说了,难度不大
下面贴下验证函数

验证部分主要分为2部分,前16位注册码验证和后4位解码
前一部分正确后才会进入第二部分
第二部分起始点我标记为The Proc2

这个CM共有2次大循环,两次情况我用/隔开,不代表除法
00401210   $55               push    ebp                                 
00401211   .8BEC               mov   ebp, esp
00401213   .81EC 58020000      sub   esp, 258
00401219   .A1 04B04000      mov   eax, dword ptr
0040121E   .33C5               xor   eax, ebp
00401220   .8945 CC            mov   dword ptr , eax
00401223   .53               push    ebx
00401224   .56               push    esi
00401225   .57               push    edi
00401226   .C705 D8C64000 E816>mov   dword ptr , 004016E8
00401230   .C705 D4C64000 2617>mov   dword ptr , 00401726
0040123A   .C685 00FFFFFF 00   mov   byte ptr , 0
00401241   .68 C7000000      push    0C7
00401246   .6A 00            push    0
00401248   .8D85 01FFFFFF      lea   eax, dword ptr
0040124E   .50               push    eax
0040124F   .E8 1C510000      call    00406370
00401254   .83C4 0C            add   esp, 0C
00401257   .C685 28FEFFFF 00   mov   byte ptr , 0
0040125E   .68 C7000000      push    0C7
00401263   .6A 00            push    0
00401265   .8D8D 29FEFFFF      lea   ecx, dword ptr
0040126B   .51               push    ecx
0040126C   .E8 FF500000      call    00406370
00401271   .83C4 0C            add   esp, 0C
00401274   .68 C8000000      push    0C8
00401279   .6A 00            push    0
0040127B   .8D95 28FEFFFF      lea   edx, dword ptr
00401281   .52               push    edx
00401282   .E8 E9500000      call    00406370
00401287   .83C4 0C            add   esp, 0C
0040128A   .C785 B4FDFFFF E0C6>mov   dword ptr , 0040C6E0
00401294   .8B85 B4FDFFFF      mov   eax, dword ptr
0040129A   .83C0 01            add   eax, 1
0040129D   .8985 B0FDFFFF      mov   dword ptr , eax
004012A3   >8B8D B4FDFFFF      mov   ecx, dword ptr
004012A9   .8A11               mov   dl, byte ptr
004012AB   .8895 AFFDFFFF      mov   byte ptr , dl
004012B1   .8385 B4FDFFFF 01   add   dword ptr , 1
004012B8   .80BD AFFDFFFF 00   cmp   byte ptr , 0
004012BF   .^ 75 E2            jnz   short 004012A3
004012C1   .8B85 B4FDFFFF      mov   eax, dword ptr
004012C7   .2B85 B0FDFFFF      sub   eax, dword ptr
004012CD   .8985 A8FDFFFF      mov   dword ptr , eax
004012D3   .8B8D A8FDFFFF      mov   ecx, dword ptr
004012D9   .898D F4FEFFFF      mov   dword ptr , ecx
004012DF   .8D95 C8FDFFFF      lea   edx, dword ptr
004012E5   .52               push    edx
004012E6   .33DB               xor   ebx, ebx
004012E8   .33FF               xor   edi, edi
004012EA   .33D2               xor   edx, edx
004012EC   .33C9               xor   ecx, ecx
004012EE   .E8 4D040000      call    00401740
004012F3   .83C4 04            add   esp, 4
004012F6   .68 E0C64000      push    0040C6E0                        ;Username
004012FB   .8B85 F4FEFFFF      mov   eax, dword ptr
00401301   .8D8D C8FDFFFF      lea   ecx, dword ptr
00401307   .E8 84040000      call    00401790
0040130C   .83C4 04            add   esp, 4
0040130F   .8DB5 C8FDFFFF      lea   esi, dword ptr
00401315   .8D8D 00FFFFFF      lea   ecx, dword ptr
0040131B   .E8 20050000      call    00401840                                  ;MD5(Username)
00401320   .C785 C0FDFFFF 0000>mov   dword ptr , 0
0040132A   .EB 0F            jmp   short 0040133B
0040132C   >8B85 C0FDFFFF      mov   eax, dword ptr
00401332   .83C0 01            add   eax, 1
00401335   .8985 C0FDFFFF      mov   dword ptr , eax
0040133B   >83BD C0FDFFFF 10   cmp   dword ptr , 10
00401342   .7D 2D            jge   short 00401371
00401344   .8B8D C0FDFFFF      mov   ecx, dword ptr
0040134A   .0FB6940D 00FFFFFFmovzx   edx, byte ptr
00401352   .52               push    edx                                                                     ; /<%02X>
00401353   .68 64A34000      push    0040A364                                             ; |%02x
00401358   .8B85 C0FDFFFF      mov   eax, dword ptr                   ; |
0040135E   .8D8C45 28FEFFFF    lea   ecx, dword ptr     ; |
00401365   .51               push    ecx                                                                      ; |s
00401366   .FF15 F4904000      call    dword ptr [<&USER32.wsprintfA>]   ; \wsprintfA
0040136C   .83C4 0C            add   esp, 0C                                                      ;MD5 HASH -> ASC
0040136F   .^ EB BB            jmp   short 0040132C
00401371   >C645 DB 00         mov   byte ptr , 0                              ; 初始化为 0x0
00401375   .C745 D0 00000000   mov   dword ptr , 0                      ; 初始化为 0x0 设为GLO.K2
0040137C   .C785 C4FDFFFF 0000>mov   dword ptr , 0            ; 初始化为 0x0 设为GLO.K1
00401386   .C745 E0 04000000   mov   dword ptr , 4                     ; 初始化为 0x4 设为GLO.K3
0040138D   .C785 20FEFFFF 0400>mov   dword ptr , 4                ; 初始化为 0x4 设为 GLO.K4
00401397   .C745 D4 01000000   mov   dword ptr , 1                      ; 初始化为 0x1
0040139E   >BA 01000000      mov   edx, 1                                                      ;大循环起始点
004013A3   .85D2               test    edx, edx
004013A5   .0F84 77020000      je      00401622
004013AB   .8B45 D0            mov   eax, dword ptr
004013AE   .8985 B8FDFFFF      mov   dword ptr , eax
004013B4   .8B8D C4FDFFFF      mov   ecx, dword ptr                ;GLO.K1 在大循环运行一次后+1
004013BA   .898D BCFDFFFF      mov   dword ptr , ecx                  ;设为Cir1.S1 = GLO.K1
004013C0   .837D D4 01         cmp   dword ptr , 1
004013C4   .75 6F            jnz   short 00401435
004013C6   .8B95 C4FDFFFF      mov   edx, dword ptr                ;Cir1.S1=GLO.K1
004013CC   .8995 BCFDFFFF      mov   dword ptr , edx
004013D2   .EB 0F            jmp   short 004013E3
004013D4   >8B85 BCFDFFFF      mov   eax, dword ptr                 ;-------循环1-------------
004013DA   .83C0 01            add   eax, 1                                                             ;设为Cir1.Max.其将在子循环2结束-1
004013DD   .8985 BCFDFFFF      mov   dword ptr , eax                  ;Cir1.S1++
004013E3   >8B8D BCFDFFFF      mov   ecx, dword ptr                ;Cir1.S1为循环计数器
004013E9   .3B8D 20FEFFFF      cmp   ecx, dword ptr                    ;Cir1.K4 (循环终止条件)
004013EF   .7D 34            jge   short 00401425                                                ;>=Cir1.K4?
004013F1   .8B95 B8FDFFFF      mov   edx, dword ptr                   ;各比较4/2次 [对每次进入此循环而言]
004013F7   .8B85 BCFDFFFF      mov   eax, dword ptr                   ;40C7A8 为输入SN地址
004013FD   .0FBE8C90 A8C74000movsx   ecx, byte ptr ;依次取SN N+Cir1.S1*4+1位 N为循环计数器
00401405   .0FB655 DB          movzx   edx, byte ptr                                ;即 1 2 3 4 / 6 7位
00401409   .0FBE8415 28FEFFFFmovsx   eax, byte ptr       ;EBP-1D8 为MD5 HASH保存地址
00401411   .3BC8               cmp   ecx, eax                                                             ;用 取MD5 HASH 1 2 3 4/13 14位
00401413   .74 05            je      short 0040141A
00401415   .E9 0C030000      jmp   00401726
0040141A   >8A4D DB            mov   cl, byte ptr
0040141D   .80C1 01            add   cl, 1
00401420   .884D DB            mov   byte ptr , cl                                     ; ++
00401423   .^ EB AF            jmp   short 004013D4                                             ;-------循环1结束-------------
00401425   >C745 D4 02000000   mov   dword ptr , 2                     ;结束循环 = 2
0040142C   .8B55 D0            mov   edx, dword ptr
0040142F   .83C2 01            add   edx, 1
00401432   .8955 D0            mov   dword ptr , edx                              ;GLO.K2 ++
00401435   >0FB645 DB          movzx   eax, byte ptr
00401439   .83F8 10            cmp   eax, 10
0040143C   .7C 05            jl      short 00401443
0040143E   .E9 DF010000      jmp   00401622
00401443   >837D D4 02         cmp   dword ptr , 2
00401447   .75 7E            jnz   short 004014C7
00401449   .8B8D BCFDFFFF      mov   ecx, dword ptr                   ;此时 Cir1.S1=Cir1.Max
0040144F   .83E9 01            sub   ecx, 1
00401452   .898D BCFDFFFF      mov   dword ptr , ecx                  ;Cir1.S1--
00401458   .8B55 D0            mov   edx, dword ptr
0040145B   .8995 B8FDFFFF      mov   dword ptr , edx                   ; = GLO.K2 = 1/2
00401461   .EB 0F            jmp   short 00401472                                              ;-------循环2-------------
00401463   >8B85 B8FDFFFF      mov   eax, dword ptr
00401469   .83C0 01            add   eax, 1
0040146C   .8985 B8FDFFFF      mov   dword ptr , eax                  ;GLO.K3在子循环3结束后将-1
00401472   >8B8D B8FDFFFF      mov   ecx, dword ptr                ;ebp-248为循环计数器
00401478   .3B4D E0            cmp   ecx, dword ptr                            ;>= GLO.K3 ?
0040147B   .7D 34            jge   short 004014B1                                              ;共需循环3/1次 [对每次进入此循环而言]
0040147D   .8B95 B8FDFFFF      mov   edx, dword ptr
00401483   .8B85 BCFDFFFF      mov   eax, dword ptr                   ;eax= Cir1.S1
00401489   .0FBE8C90 A8C74000movsx   ecx, byte ptr ;分别取输入值 Nx4 + Cir1.S1 + 1 位,N=循环计数器
00401491   .0FB655 DB          movzx   edx, byte ptr                            ;即分别取 8 12 16/11 位
00401495   .0FBE8415 28FEFFFFmovsx   eax, byte ptr        ;ebp-25 取MD5 HASH 5 6 7/15位
0040149D   .3BC8               cmp   ecx, eax
0040149F   .74 05            je      short 004014A6
004014A1   .E9 80020000      jmp   00401726
004014A6   >8A4D DB            mov   cl, byte ptr
004014A9   .80C1 01            add   cl, 1
004014AC   .884D DB            mov   byte ptr , cl                                  ; ++
004014AF   .^ EB B2            jmp   short 00401463                                           ;-------循环2结束-------------
004014B1   >C745 D4 03000000   mov   dword ptr , 3                   ; = 3
004014B8   .8B95 20FEFFFF      mov   edx, dword ptr
004014BE   .83EA 01            sub   edx, 1
004014C1   .8995 20FEFFFF      mov   dword ptr , edx                  ;GLO.K4 --
004014C7   >0FB645 DB          movzx   eax, byte ptr
004014CB   .83F8 10            cmp   eax, 10
004014CE   .7C 05            jl      short 004014D5
004014D0   .E9 4D010000      jmp   00401622
004014D5   >83BD 20FEFFFF 01   cmp   dword ptr , 1
004014DC   .7F 05            jg      short 004014E3
004014DE   .E9 3F010000      jmp   00401622
004014E3   >837D D4 03         cmp   dword ptr , 3
004014E7   .0F85 81000000      jnz   0040156E
004014ED   .8B8D B8FDFFFF      mov   ecx, dword ptr             ;==4/3
004014F3   .83E9 01            sub   ecx, 1
004014F6   .898D B8FDFFFF      mov   dword ptr , ecx               ; --
004014FC   .8B95 20FEFFFF      mov   edx, dword ptr
00401502   .83EA 01            sub   edx, 1
00401505   .8995 BCFDFFFF      mov   dword ptr , edx            ; = ( GLO.K4 - 1 ) =2/1
0040150B   .EB 0F            jmp   short 0040151C                                        ;-------循环3-------------
0040150D   >8B85 BCFDFFFF      mov   eax, dword ptr
00401513   .83E8 01            sub   eax, 1
00401516   .8985 BCFDFFFF      mov   dword ptr , eax             ; --
0040151C   >8B8D BCFDFFFF      mov   ecx, dword ptr           ; 为循环计数器
00401522   .3B8D C4FDFFFF      cmp   ecx, dword ptr          ;< = 0 ?
00401528   .7C 34            jl      short 0040155E                                           ;共循环3/1次
0040152A   .8B95 B8FDFFFF      mov   edx, dword ptr              ;edx = =3/2
00401530   .8B85 BCFDFFFF      mov   eax, dword ptr
00401536   .0FBE8C90 A8C74000movsx   ecx, byte ptr
;分别取输入值 EDXx4 +N +1 位,N=为循环计数器
0040153E   .0FB655 DB          movzx   edx, byte ptr                       ;即15 14 13/10 位
00401542   .0FBE8415 28FEFFFFmovsx   eax, byte ptr
;用 取MD5 HASH 8 9 10/16位
0040154A   .3BC8               cmp   ecx, eax
0040154C   .74 05            je      short 00401553
0040154E   .E9 D3010000      jmp   00401726
00401553   >8A4D DB            mov   cl, byte ptr
00401556   .80C1 01            add   cl, 1
00401559   .884D DB            mov   byte ptr , cl                            ; ++
0040155C   .^ EB AF            jmp   short 0040150D                                 ;-------循环3结束-------------
0040155E   >C745 D4 04000000   mov   dword ptr , 4            ;=4
00401565   .8B55 E0            mov   edx, dword ptr                       ;
00401568   .83EA 01            sub   edx, 1
0040156B   .8955 E0            mov   dword ptr , edx                      ;GLO.K3 --
0040156E   >0FB645 DB          movzx   eax, byte ptr                   ;第二轮循环到此时将为(4+3+3+2+2+1+1)=0x10
00401572   .83F8 10            cmp   eax, 10
00401575   .7C 05            jl      short 0040157C
00401577   .E9 A6000000      jmp   00401622                                        ;跳往解码部分
0040157C   >837D E0 01         cmp   dword ptr , 1
00401580   .7F 05            jg      short 00401587
00401582   .E9 9B000000      jmp   00401622
00401587   >837D D4 04         cmp   dword ptr , 4
0040158B   .0F85 81000000      jnz   00401612
00401591   .8B8D BCFDFFFF      mov   ecx, dword ptr
00401597   .83C1 01            add   ecx, 1
0040159A   .898D BCFDFFFF      mov   dword ptr , ecx      ; ++ (=0)
004015A0   .8B55 E0            mov   edx, dword ptr
004015A3   .83EA 01            sub   edx, 1
004015A6   .8995 B8FDFFFF      mov   dword ptr , edx          ; = -1 =2
004015AC   .EB 0F            jmp   short 004015BD                                 ;-------循环4-------------
004015AE   >8B85 B8FDFFFF      mov   eax, dword ptr
004015B4   .83E8 01            sub   eax, 1
004015B7   .8985 B8FDFFFF      mov   dword ptr , eax         ; --
004015BD   >8B8D B8FDFFFF      mov   ecx, dword ptr       ;为循环计数器
004015C3   .3B4D D0            cmp   ecx, dword ptr                   ;<1?
004015C6   .7C 34            jl      short 004015FC                                    ;共循环2次
004015C8   .8B95 B8FDFFFF      mov   edx, dword ptr
004015CE   .8B85 BCFDFFFF      mov   eax, dword ptr
004015D4   .0FBE8C90 A8C74000movsx   ecx, byte ptr ;取输入值的 Nx4 + 0 +1 位,N=为循环计数器
004015DC   .0FB655 DB          movzx   edx, byte ptr                ;即 9 5 位
004015E0   .0FBE8415 28FEFFFFmovsx   eax, byte ptr                ;用取MD5 HASH的11 12位
004015E8   .3BC8               cmp   ecx, eax
004015EA   .74 05            je      short 004015F1
004015EC   .E9 35010000      jmp   00401726
004015F1   >8A4D DB            mov   cl, byte ptr
004015F4   .80C1 01            add   cl, 1
004015F7   .884D DB            mov   byte ptr , cl                        ; ++
004015FA   .^ EB B2            jmp   short 004015AE                              ;-------循环4结束-------------
004015FC   >C745 D4 01000000   mov   dword ptr , 1      ;=1
00401603   .8B95 C4FDFFFF      mov   edx, dword ptr
00401609   .83C2 01            add   edx, 1
0040160C   .8995 C4FDFFFF      mov   dword ptr , edx   ; ++
00401612   >0FB645 DB          movzx   eax, byte ptr
00401616   .83F8 10            cmp   eax, 10
00401619   .7C 02            jl      short 0040161D
0040161B   .EB 05            jmp   short 00401622
0040161D   >^ E9 7CFDFFFF      jmp   0040139E
00401622   >8B0D D8C64000      mov   ecx, dword ptr     ;The Proc2
00401628   .894D DC            mov   dword ptr , ecx
0040162B   .8B15 D4C64000      mov   edx, dword ptr
00401631   .2B15 D8C64000      sub   edx, dword ptr
00401637   .8995 F8FEFFFF      mov   dword ptr , edx
0040163D   .C785 24FEFFFF 1000>mov   dword ptr , 10
00401647   .6A 1C            push    1C                                                                        ; /BufSize = 1C (28.)
00401649   .8D45 E4            lea   eax, dword ptr                                     ; |
0040164C   .50               push    eax                                                                           ; |Buffer
0040164D   .8B4D DC            mov   ecx, dword ptr                                  ; |
00401650   .51               push    ecx                                                                              ; |Address
00401651   .FF15 00904000      call    dword ptr [<&KERNEL32.VirtualQuer>   ; \VirtualQuery
00401657   .8D55 F8            lea   edx, dword ptr
0040165A   .52               push    edx                                                                           ; /pOldProtect
0040165B   .6A 04            push    4                                                                              ; |NewProtect = PAGE_READWRITE
0040165D   .8B45 F0            mov   eax, dword ptr                                     ; |
00401660   .50               push    eax                                                                           ; |Size
00401661   .8B4D E4            mov   ecx, dword ptr                                     ; |
00401664   .51               push    ecx                                                                              ; |Address
00401665   .FF15 04904000      call    dword ptr [<&KERNEL32.VirtualProt>       ; \VirtualProtect
0040166B   >8B95 F8FEFFFF      mov   edx, dword ptr                         ;要解码的字符数
00401671   .8B85 F8FEFFFF      mov   eax, dword ptr
00401677   .83E8 01            sub   eax, 1
0040167A   .8985 F8FEFFFF      mov   dword ptr , eax
00401680   .85D2               test    edx, edx
00401682   .74 47            je      short 004016CB                                                       ;解码完毕,跳出
00401684   .8B4D DC            mov   ecx, dword ptr                                     ;取要解码的地址 设为p
00401687   .0FB611             movzx   edx, byte ptr                                                 ;该地址Byte放入Edx
0040168A   .8B85 24FEFFFF      mov   eax, dword ptr                         ;密钥字符位置,设为p2
00401690   .0FBE88 A8C74000    movsx   ecx, byte ptr                   ;从17位开始取,放ECX
00401697   .33D1               xor   edx, ecx                                                                     ;edx^=ecx
00401699   .8B45 DC            mov   eax, dword ptr
0040169C   .8810               mov   byte ptr , dl                                                      ;放回
0040169E   .8B4D DC            mov   ecx, dword ptr
004016A1   .83C1 01            add   ecx, 1
004016A4   .894D DC            mov   dword ptr , ecx                                    ;p++
004016A7   .8B95 24FEFFFF      mov   edx, dword ptr
004016AD   .83C2 01            add   edx, 1
004016B0   .8995 24FEFFFF      mov   dword ptr , edx                         ;p2++
004016B6   .83BD 24FEFFFF 14   cmp   dword ptr , 14
004016BD   .7C 0A            jl      short 004016C9                     ;解码密钥字符取到20位时返回到16+1位继续
004016BF   .C785 24FEFFFF 1000>mov   dword ptr , 10
004016C9   >^ EB A0            jmp   short 0040166B
004016CB   >8D85 FCFEFFFF      lea   eax, dword ptr
004016D1   .50               push    eax                                                                           ; /pOldProtect
004016D2   .8B4D F8            mov   ecx, dword ptr                                      ; |
004016D5   .51               push    ecx                                                                           ; |NewProtect
004016D6   .8B55 F0            mov   edx, dword ptr                                  ; |
004016D9   .52               push    edx                                                                           ; |Size
004016DA   .8B45 E4            mov   eax, dword ptr                                   ; |
004016DD   .50               push    eax                                                                        ; |Address
004016DE   .FF15 04904000      call    dword ptr [<&KERNEL32.VirtualProt>    ; \VirtualProtect
004016E4   .40               inc   eax
004016E5   .48               dec   eax
004016E6   .50               push    eax
004016E7   .58               pop   eax                               ;以上应该是作者编译后用于查找要加密部分的标签
004016E8   .22F958F6         dd      F658F922
004016EC      EA 0755CCD4 0021   jmp   far 2100 : D4CC5507
004016F3      4D               db      4D                              ;CHAR 'M'
004016F4      C6               db      C6
004016F5      77               db      77                              ;CHAR 'w'
004016F6      5A               db      5A                              ;CHAR 'Z'
004016F7      F1               db      F1
004016F8      38               db      38                              ;CHAR '8'
004016F9   .FD920F2D         dd      2D0F92FD
004016FD      C4               db      C4
004016FE      AF               db      AF
004016FF      1A               db      1A
00401700      59               db      59                              ;CHAR 'Y'
00401701      45               db      45                              ;CHAR 'E'
00401702      BE               db      BE
00401703      6D               db      6D                              ;CHAR 'm'
00401704      22               db      22                              ;CHAR '"'
00401705      F9               db      F9
00401706      50               db      50                              ;CHAR 'P'
00401707   .F4EA0755         dd      5507EAF4
0040170B      CC               int3
0040170C      D5               db      D5
0040170D      08               db      08
0040170E      21               db      21                              ;CHAR '!'
0040170F      4D               db      4D                              ;CHAR 'M'
00401710      C6               db      C6
00401711      53               db      53                              ;CHAR 'S'
00401712      3F               db      3F                              ;CHAR '?'
00401713      4F               db      4F                              ;CHAR 'O'
00401714      45               db      45                              ;CHAR 'E'
00401715   .2BF60F2D         dd      2D0FF62B
00401719      2F               db      2F                              ;CHAR '/'
0040171A   .2DEC6D47         dd      476DEC2D
0040171E      3F               db      3F                              ;CHAR '?'
0040171F      4F               db      4F                              ;CHAR 'O'
00401720      D2               db      D2
00401721      52               db      52                              ;CHAR 'R'
00401722   .A9DF6D47         dd      476DDFA9
00401726   >5F               pop   edi                               ;以上部分将用于解码
00401727   .5E               pop   esi
00401728   .5B               pop   ebx
00401729   .8B4D CC            mov   ecx, dword ptr
0040172C   .33CD               xor   ecx, ebp
0040172E   .E8 CB080000      call    00401FFE
00401733   .8BE5               mov   esp, ebp
00401735   .5D               pop   ebp
00401736   .C3               retn
整理下得到算法
取用户名MD5,这里各位分别M*,*为其所在位数
给出个SN对应表
1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16
M1M2M3M4M12 M13 M14 M5M11 M16M15M6   M10M9   M8   M7
例:
用户名 SFL Violator
MD5=07454ce497cfdc36217f0dde5fd32b5b
列下表,后16位扔掉
12345678910 11 12 13 14 15 16
07454CE497CFDC36
对应位置
12345678910 11 12 13 14 15 16
0745FDC4C63C794E

0745FDC4C63C794E
拼合密钥
即为注册码

下面我们进行密钥推导
从前面的情况看,注册失败会调用MessageBoxA来弹出消息,那么跟据我的
假定,在注册成功后将弹出一个成功提示,且也将使用MessageBoxA方式
Ctrl+N下,看MessageBoxA的调用情况
004010DF   .6A 00         push    0                              ; /Style = MB_OK|MB_APPLMODAL
004010E1   .68 30A34000   push    0040A330                         ; |错误提示
004010E6   .68 54A34000   push    0040A354                         ; |请输入注册码!
004010EB   .6A 00         push    0                              ; |hOwner = NULL
004010ED   .FF15 FC904000 call    dword ptr [<&USER32.MessageBoxA>>; \MessageBoxA
直接查看4010ED处的命令
FF 15 FC 90 40 00
而根据前面的解码算法分析,我们需要一个4位字符的密钥
这里我们开始运算,拿出前面的401725-6+1=401720处的数据D252A9DF6D47
FF 15 FC 90 40 00
D2 52 A9 DF 6D 47
逐位异或
直接得到密钥
2D 47 55 4F 2D 47
注意到密钥为4位
那么最终解码密钥即时2D 47 55 4F
对应ASC为-GUO
连接第一部分注册码,最终得到
0745FDC4C63C794E-GUO
注册成功!

zhimingcom 发表于 2009-1-18 09:51

大大牛,这么复杂的算法都搞定了:victory:

ximo 发表于 2009-1-18 17:55

分析的很精彩,支持多发算法分析的文章.

Hmily 发表于 2009-1-18 17:56

好文章,感谢samisgod 兄分享:lol 让iawen 兄来鉴定下:lol

tianxj 发表于 2009-1-18 19:09

高手哦:L :L

iawen 发表于 2009-1-18 19:09

感觉没触到算法的本质!

不过分析的还是比较精彩!:loveliness:

为了让大家能够更加明白其中的关键,我再次修改了一个加强版的CM,算法没变!
大家可以继续试试!

主要是算法,这里连解码都去掉了!
地址:http://www.52pojie.cn/thread-17602-1-1.html

bbvbvbbv 发表于 2009-1-18 21:18

又是牛人一个...

Hmily 发表于 2009-1-18 23:11

论坛的排版真丑啊......

samisgod 发表于 2009-1-19 13:59

原帖由 chenguo 于 2009-1-18 19:09 发表 http://www.52pojie.cn/images/common/back.gif
感觉没触到算法的本质!

不过分析的还是比较精彩!:loveliness:

为了让大家能够更加明白其中的关键,我再次修改了一个加强版的CM,算法没变!
大家可以继续试试!

主要是算法,这里连解码都去掉了!
地址 ...

刚才搞了下,不想写文了:lol
SFL Violator
0745DC349CEB4F570DFEB3D712C6DF52

a2213572 发表于 2009-2-9 21:54

很困難的教學!
先收藏吧.
页: [1] 2
查看完整版本: iawen CM-9 算法分析