首页
社区
课程
招聘
[原创]keygen_2_by_dmoon算法分析(未完成)
发表于: 2009-10-7 22:52 5375

[原创]keygen_2_by_dmoon算法分析(未完成)

2009-10-7 22:52
5375
【文章标题】: keygen_2_by_dmoon算法分析
【文章作者】: 思远软件
【作者邮箱】: c_s_y@126.com
【作者QQ号】: 495544622
【软件名称】: keygen_2_by_dmoon
【软件大小】: 377 KB
【下载地址】: 627K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4J5j5h3y4C8L8h3g2K6i4K6u0W2k6r3f1`.
【加壳方式】: 无
【编写语言】: MASN
【使用工具】: OD
【操作平台】: XP SP3
【软件介绍】: 难度等级 3-4
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
分析了整整10个小时也没有成功,实在分析不下去了就发上来了,高手指点一下

--------------------------------------------------------------------------------
【详细过程】
   今天我又在96eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4J5j5h3y4C8L8h3g2K6i4K6u0W2k6r3g2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0c8Q4b7U0S2Q4z5o6m8Q4c8e0c8Q4b7U0S2Q4b7f1q4U0L8g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9&6x3g2!0n7y4g2!0q4y4g2)9&6x3g2!0n7y4g2!0q4x3#2)9^5x3q4)9^5x3W2!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4#2)9&6b7#2)9^5b7W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4W2!0n7x3g2)9^5y4#2!0q4y4#2!0n7b7#2)9&6y4W2!0q4y4g2)9^5y4W2)9&6z5g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4x3#2)9^5x3q4)9^5x3R3`.`.
    先一步一步跟踪,发现
    00401A7E  |.  E8 3F250000   call    <jmp.&winmm.waveOutWrite>    ;  声音
    这里是处理声音的,如果觉得这个音乐不好听,可以把他nop掉! 这里不是我们今天的重点,我们继续!!
    到了输入Unlovk   Username    Activation Key 的地方了 ,很明显,这个要先解锁,解锁前那个注册按钮
    是灰色的,解锁成功后才可以注册!!(老外的cm就是就是有创意哈)
    Unlovk:exekill     
    Username:495544622     
    Activation Key:f14K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0m8U0M7X3q4U0K9#2)9J5k6h3y4G2L8b7`.`.
    点击后,稍微分析一下就可以找到关键call : 0040127A  |. /74 53         je      short 004012CF               ;  关键call 跳就失败
    如果跳转,那就失败了!
    每一次失败都有收获嘛,不要着急退出哦,往上找到00401602,可以看到来到4个死亡地址:004012E2, 004016EA, 0040180F, 00401827
    刚才我们失败的是第一个死亡地址调过来的:003012E2
    好 我们继续分析!
    当程序运行到0040127A的时候,我们看寄存器EDX,发现这里1EE84DE7B374768B1F08539FB7B4BEE352BAEF5F81B601B
    恩 很显然这里就是解锁码了,解锁码怎么算出来的呢?我们一会再看,
    我们出入解锁码后,在运行,发现那个按钮已经被激活了。(*^__^*)
    看来004012E2这个死亡地址就是在看看有没有被激活,如果没有激活则跳向失败,
   
    好了 第2步,我们点击Actvation按钮,
    走早这里,我们看到一个小小的算法过程,我们先不分析算法,先整体分析这个流程,
   
    004016BF  |.  B9 06000000   mov     ecx, 6
    004016C4  |>  35 B19E077D   /xor     eax, 7D079EB1               ;  计算过程
    004016C9  |.  BA 41A5DF4A   |mov     edx, 4ADFA541
    004016CE  |.  33C2          |xor     eax, edx
    004016D0  |.  2D D1F40300   |sub     eax, 3F4D1
    004016D5  |.  6BC0 33       |imul    eax, eax, 33
    004016D8  |.^ E2 EA         \loopd   short 004016C4
    004016DA  |.  3D 1C7A33CE   cmp     eax, CE337A1C
    004016DF  |.  75 09         jnz     short 004016EA               ;  关键判断
    004016E1  |.  E8 22000000   call    00401708                        关键call
    004016E6  |.  C9            leave
    004016E7  |.  C2 0400       retn    4
    004016EA  |>  E8 13FFFFFF   call    00401602                     ;  失败
   
    我们修改004016DF,让他进入关键call 004016E1,这里可以看到更多的算法哦!!
   
   
    0040170E   .  BF 8C694000   mov     edi, 0040698C                ;  ASCII "cd7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0m8U0M7X3q4U0K9#2)9J5k6h3y4G2L8b7`.`."
    00401713   .  BE 6D684000   mov     esi, 0040686D                ;  ASCII "1EE84DE7B374768B1F08539FB7B4BEE352BAEF5F81B601B"
    00401718   .  B9 30000000   mov     ecx, 30
    0040171D   >  33DB          xor     ebx, ebx
    0040171F   .  33D2          xor     edx, edx
    00401721   .  33C0          xor     eax, eax
    00401723   .  8A1F          mov     bl, byte ptr [edi]
    00401725   .  80FB 30       cmp     bl, 30
    00401728   .  72 09         jb      short 00401733
    0040172A   .  80FB 39       cmp     bl, 39
    0040172D   .  77 04         ja      short 00401733
    0040172F   .  EB 15         jmp     short 00401746
    00401731   .  EB 13         jmp     short 00401746
    00401733   >  80FB 41       cmp     bl, 41
    00401736   .  72 09         jb      short 00401741
    00401738   .  80FB 5A       cmp     bl, 5A
    0040173B   .  77 04         ja      short 00401741
    0040173D   .  EB 07         jmp     short 00401746
    0040173F   .  EB 05         jmp     short 00401746
    00401741   >  E9 E1000000   jmp     00401827                     ;  失败
    00401746   >  8A06          mov     al, byte ptr [esi]
    00401748   .  E8 43FFFFFF   call    00401690
    0040174D   .  BB DD674000   mov     ebx, 004067DD
    00401752   .  66:8B13       mov     dx, word ptr [ebx]
    00401755   .  66:3353 04    xor     dx, word ptr [ebx+4]
    00401759   .  66:0353 08    add     dx, word ptr [ebx+8]
    0040175D   .  66:2B53 0B    sub     dx, word ptr [ebx+B]
    00401761   .  0FAFC2        imul    eax, edx
    00401764   .  33D2          xor     edx, edx
    00401766   .  50            push    eax
    00401767   .  E8 87FFFFFF   call    004016F3
    0040176C   .  83F9 2C       cmp     ecx, 2C
    0040176F   .  76 06         jbe     short 00401777
    00401771   .  51            push    ecx
    00401772   .  83E9 2C       sub     ecx, 2C
    00401775   .  EB 7A         jmp     short 004017F1
    00401777   >  83F9 28       cmp     ecx, 28
    0040177A   .  76 06         jbe     short 00401782
    0040177C   .  51            push    ecx
    0040177D   .  83E9 28       sub     ecx, 28
    00401780   .  EB 6F         jmp     short 004017F1
    00401782   >  83F9 24       cmp     ecx, 24
    00401785   .  76 06         jbe     short 0040178D
    00401787   .  51            push    ecx
    00401788   .  83E9 24       sub     ecx, 24
    0040178B   .  EB 64         jmp     short 004017F1
    0040178D   >  83F9 20       cmp     ecx, 20
    00401790   .  76 06         jbe     short 00401798
    00401792   .  51            push    ecx
    00401793   .  83E9 20       sub     ecx, 20
    00401796   .  EB 59         jmp     short 004017F1
    00401798   >  83F9 1C       cmp     ecx, 1C
    0040179B   .  76 06         jbe     short 004017A3
    0040179D   .  51            push    ecx
    0040179E   .  83E9 1C       sub     ecx, 1C
    004017A1   .  EB 4E         jmp     short 004017F1
    004017A3   >  83F9 18       cmp     ecx, 18
    004017A6   .  76 06         jbe     short 004017AE
    004017A8   .  51            push    ecx
    004017A9   .  83E9 18       sub     ecx, 18
    004017AC   .  EB 43         jmp     short 004017F1
    004017AE   >  83F9 14       cmp     ecx, 14
    004017B1   .  76 06         jbe     short 004017B9
    004017B3   .  51            push    ecx
    004017B4   .  83E9 14       sub     ecx, 14
    004017B7   .  EB 38         jmp     short 004017F1
    004017B9   >  83F9 10       cmp     ecx, 10
    004017BC   .  76 06         jbe     short 004017C4
    004017BE   .  51            push    ecx
    004017BF   .  83E9 10       sub     ecx, 10
    004017C2   .  EB 2D         jmp     short 004017F1
    004017C4   >  83F9 0C       cmp     ecx, 0C
    004017C7   .  76 06         jbe     short 004017CF
    004017C9   .  51            push    ecx
    004017CA   .  83E9 0C       sub     ecx, 0C
    004017CD   .  EB 22         jmp     short 004017F1
    004017CF   >  83F9 08       cmp     ecx, 8
    004017D2   .  76 06         jbe     short 004017DA
    004017D4   .  51            push    ecx
    004017D5   .  83E9 08       sub     ecx, 8
    004017D8   .  EB 17         jmp     short 004017F1
    004017DA   >  83F9 04       cmp     ecx, 4
    004017DD   .  76 06         jbe     short 004017E5
    004017DF   .  51            push    ecx
    004017E0   .  83E9 04       sub     ecx, 4
    004017E3   .  EB 0C         jmp     short 004017F1
    004017E5   >  83F9 01       cmp     ecx, 1
    004017E8   .  76 06         jbe     short 004017F0
    004017EA   .  51            push    ecx
    004017EB   .  83E9 01       sub     ecx, 1
    004017EE   .  EB 01         jmp     short 004017F1
    004017F0   >  51            push    ecx
    004017F1   >  66:F7F1       div     cx
    004017F4   .  66:0BD2       or      dx, dx
    004017F7   .  59            pop     ecx
    004017F8   .  EB 15         jmp     short 0040180F
    004017FA      49            db      49                           ;  CHAR 'I'
    004017FB      20            db      20                           ;  CHAR ' '
    004017FC      6B            db      6B                           ;  CHAR 'k'
    004017FD      6E            db      6E                           ;  CHAR 'n'
    004017FE      6F            db      6F                           ;  CHAR 'o'
    004017FF      77            db      77                           ;  CHAR 'w'
    00401800      20            db      20                           ;  CHAR ' '
    00401801      77            db      77                           ;  CHAR 'w'
    00401802      68            db      68                           ;  CHAR 'h'
    00401803      61            db      61                           ;  CHAR 'a'
    00401804      74            db      74                           ;  CHAR 't'
    00401805      20            db      20                           ;  CHAR ' '
    00401806      75            db      75                           ;  CHAR 'u'
    00401807      20            db      20                           ;  CHAR ' '
    00401808      77            db      77                           ;  CHAR 'w'
    00401809      61            db      61                           ;  CHAR 'a'
    0040180A      6E            db      6E                           ;  CHAR 'n'
    0040180B      74            db      74                           ;  CHAR 't'
    0040180C      20            db      20                           ;  CHAR ' '
    0040180D      3A            db      3A                           ;  CHAR ':'
    0040180E      29            db      29                           ;  CHAR ')'
    0040180F   >^ 0F85 EDFDFFFF jnz     00401602                     ;  关键call   如果跳了则失败 3
    00401815   .  46            inc     esi
    00401816   .  47            inc     edi
    00401817   .  49            dec     ecx
    00401818   .  83F9 00       cmp     ecx, 0
    0040181B   .^ 0F85 FCFEFFFF jnz     0040171D                     ;  循环计算
    00401821   .  E8 A0FDFFFF   call    004015C6                     ;  成功
    00401826   .  C3            retn
    00401827   >  E8 D6FDFFFF   call    00401602                     ;  失败
    0040182C   .  C3            retn
   
   
   
    简单分析就可以知道,00401741这里跳下到失败,这里是第4个死亡入口~~~~(>_<)~~~~
    我们可以修改0040172D   . /77 04         ja      short 00401733 ,让程序跳到正确的流程 00401746
    又到了一段算法
    00401767   .  E8 87FFFFFF   call    004016F3
    0040176C   .  83F9 2C       cmp     ecx, 2C
    0040176F   .  76 06         jbe     short 00401777
    00401771   .  51            push    ecx
    00401772   .  83E9 2C       sub     ecx, 2C
    00401775   .  EB 7A         jmp     short 004017F1
    00401777   >  83F9 28       cmp     ecx, 28
    0040177A   .  76 06         jbe     short 00401782
    0040177C   .  51            push    ecx
    0040177D   .  83E9 28       sub     ecx, 28
    00401780   .  EB 6F         jmp     short 004017F1
    00401782   >  83F9 24       cmp     ecx, 24
    00401785   .  76 06         jbe     short 0040178D
    00401787   .  51            push    ecx
    00401788   .  83E9 24       sub     ecx, 24
    0040178B   .  EB 64         jmp     short 004017F1
    0040178D   >  83F9 20       cmp     ecx, 20
    00401790   .  76 06         jbe     short 00401798
    00401792   .  51            push    ecx
    00401793   .  83E9 20       sub     ecx, 20
    00401796   .  EB 59         jmp     short 004017F1
    00401798   >  83F9 1C       cmp     ecx, 1C
    0040179B   .  76 06         jbe     short 004017A3
    0040179D   .  51            push    ecx
    0040179E   .  83E9 1C       sub     ecx, 1C
    004017A1   .  EB 4E         jmp     short 004017F1
    004017A3   >  83F9 18       cmp     ecx, 18
    004017A6   .  76 06         jbe     short 004017AE
    004017A8   .  51            push    ecx
    004017A9   .  83E9 18       sub     ecx, 18
    004017AC   .  EB 43         jmp     short 004017F1
    004017AE   >  83F9 14       cmp     ecx, 14
    004017B1   .  76 06         jbe     short 004017B9
    004017B3   .  51            push    ecx
    004017B4   .  83E9 14       sub     ecx, 14
    004017B7   .  EB 38         jmp     short 004017F1
    004017B9   >  83F9 10       cmp     ecx, 10
    004017BC   .  76 06         jbe     short 004017C4
    004017BE   .  51            push    ecx
    004017BF   .  83E9 10       sub     ecx, 10
    004017C2   .  EB 2D         jmp     short 004017F1
    004017C4   >  83F9 0C       cmp     ecx, 0C
    004017C7   .  76 06         jbe     short 004017CF
    004017C9   .  51            push    ecx
    004017CA   .  83E9 0C       sub     ecx, 0C
    004017CD   .  EB 22         jmp     short 004017F1
    004017CF   >  83F9 08       cmp     ecx, 8
    004017D2   .  76 06         jbe     short 004017DA
    004017D4   .  51            push    ecx
    004017D5   .  83E9 08       sub     ecx, 8
    004017D8   .  EB 17         jmp     short 004017F1
    004017DA   >  83F9 04       cmp     ecx, 4
    004017DD   .  76 06         jbe     short 004017E5
    004017DF   .  51            push    ecx
    004017E0   .  83E9 04       sub     ecx, 4
    004017E3   .  EB 0C         jmp     short 004017F1
    004017E5   >  83F9 01       cmp     ecx, 1
    004017E8   .  76 06         jbe     short 004017F0
    004017EA   .  51            push    ecx
    004017EB   .  83E9 01       sub     ecx, 1
    004017EE   .  EB 01         jmp     short 004017F1
    004017F0   >  51            push    ecx
    004017F1   >  66:F7F1       div     cx
    004017F4   .  66:0BD2       or      dx, dx
    004017F7   .  59            pop     ecx
    004017F8   .  EB 15         jmp     short 0040180F
    004017FA      49            db      49                           ;  CHAR 'I'
    004017FB      20            db      20                           ;  CHAR ' '
    004017FC      6B            db      6B                           ;  CHAR 'k'
    004017FD      6E            db      6E                           ;  CHAR 'n'
    004017FE      6F            db      6F                           ;  CHAR 'o'
    004017FF      77            db      77                           ;  CHAR 'w'
    00401800      20            db      20                           ;  CHAR ' '
    00401801      77            db      77                           ;  CHAR 'w'
    00401802      68            db      68                           ;  CHAR 'h'
    00401803      61            db      61                           ;  CHAR 'a'
    00401804      74            db      74                           ;  CHAR 't'
    00401805      20            db      20                           ;  CHAR ' '
    00401806      75            db      75                           ;  CHAR 'u'
    00401807      20            db      20                           ;  CHAR ' '
    00401808      77            db      77                           ;  CHAR 'w'
    00401809      61            db      61                           ;  CHAR 'a'
    0040180A      6E            db      6E                           ;  CHAR 'n'
    0040180B      74            db      74                           ;  CHAR 't'
    0040180C      20            db      20                           ;  CHAR ' '
    0040180D      3A            db      3A                           ;  CHAR ':'
    0040180E      29            db      29                           ;  CHAR ')'
    0040180F   >^ 0F85 EDFDFFFF jnz     00401602                     ;  关键call   如果跳了则失败 3
    00401815   .  46            inc     esi
    00401816   .  47            inc     edi
    00401817   .  49            dec     ecx
    00401818   .  83F9 00       cmp     ecx, 0
    0040181B   .^ 0F85 FCFEFFFF jnz     0040171D                     ;  循环计算
    00401821   .  E8 A0FDFFFF   call    004015C6                     ;  成功
    00401826   .  C3            retn
    00401827   >  E8 D6FDFFFF   call    00401602                     ;  失败
   
    恩,我们死亡路口3也看到了 0040180F;
    再修改这里0040180F   >^\0F85 EDFDFFFF jnz     00401602                     ;  关键call   如果跳了则失败 3
    不让它跳,就可以看到与死亡路口4在一起的计算过程!
    这里应该是一个循环计算,若果再改一下0040181B,就可以爆破了(*^__^*)
    好了 爆破成功,我们该重新分析算法了
   
    好,我们来到这里
    00401246  |.  68 28694000   push    00406928                     ;  ASCII "495544622"
    0040124B  |.  E8 9B000000   call    004012EB                     ;  注册算法
    00401250  |.  6A 64         push    64                           ; /Count = 64 (100.)
    00401252  |.  68 B1664000   push    004066B1                     ; |Buffer = keygen_2.004066B1
    00401257  |.  68 D0070000   push    7D0                          ; |ControlID = 7D0 (2000.)
    0040125C  |.  FF75 08       push    dword ptr [ebp+8]            ; |hWnd
    0040125F  |.  E8 F4050000   call    <jmp.&user32.GetDlgItemTextA>; \GetDlgItemTextA
    00401264  |.  E8 16030000   call    0040157F
    00401269  |.  68 6D684000   push    0040686D                     ;  ASCII "1EE84DE7B374768B1F08539FB7B4BEE352BAEF5F81B601B"
    0040126E  |.  68 B1664000   push    004066B1
    00401273  |.  E8 BC030000   call    00401634
    00401278  |.  85C0          test    eax, eax
    0040127A  |.  74 53         je      short 004012CF               ;  关键call 跳就失败
   
    很明显,0040124B里面是所谓是算法
    00401358  |.  57            push    edi                                    ;  算法过程
    00401359  |>  50            /push    eax                                   ;  eax压栈  算第一个字符,算6次
    0040135A  |.  330495 006040>|xor     eax, dword ptr [edx*4+406000]         ;  和[406000+4X]异或
    00401361  |.  50            |push    eax
    00401362  |.  25 FFFF0000   |and     eax, 0FFFF                            ;  EBX=后四位
    00401367  |.  8BD8          |mov     ebx, eax
    00401369  |.  58            |pop     eax                                   ;  恢复eax
    0040136A  |.  25 0000FFFF   |and     eax, FFFF0000                         ;  eax=前4位
    0040136F  |.  0FAFC3        |imul    eax, ebx                              ;  EAX=前4位和后4位相乘
    00401372  |.  33C3          |xor     eax, ebx                              ;  再和EBX异或  结果放到eax中
    00401374  |.  8907          |mov     dword ptr [edi], eax                  ;  存储
    00401376  |.  83C7 04       |add     edi, 4                                ;  指向后一位
    00401379  |.  83C2 04       |add     edx, 4
    0040137C  |.  58            |pop     eax
    0040137D  |.^ E2 DA         \loopd   short 00401359
    0040137F  |.  5F            pop     edi
    00401380  |.  57            push    edi
    00401381  |.  E8 A5010000   call    0040152B                                ;注意这里的call里面有算法
   
   
    这是计算第一个字符的,后面还有相似的6段,也就是说计算前6个字符,也就是说有效注册码解锁码只有6个,后面的解锁码
    是不参与运算的!!那五段我这里就不写咯!!
   
   
    我们进入这个call 分析一下里面的算法
    0040152F  |.  33C9          xor     ecx, ecx                               ;  ECX=0
    00401531  |.  41            inc     ecx                                    ;  ECX=1
    00401532  |.  33C0          xor     eax, eax                               ;  EAX=0
    00401534  |.  33DB          xor     ebx, ebx                               ;  EBX=0
    00401536  |.  33D2          xor     edx, edx                               ;  EDX=0
    00401538  |.  33FF          xor     edi, edi                               ;  EDX=0
    0040153A  |.  43            inc     ebx                                    ;  EBX=1
    0040153B  |.  43            inc     ebx                                    ;  EBX=2
    0040153C  |.  8B75 08       mov     esi, dword ptr [ebp+8]
    0040153F  |>  8A06          /mov     al, byte ptr [esi]                    ;  取刚刚计算完的那个地址
    00401541  |.  3C 00         |cmp     al, 0                                 ;  判断是不是去完了
    00401543  |.  74 18         |je      short 0040155D                        ;  取完了则退出
    00401545  |.  66:F7F3       |div     bx                                    ;  否则除以2
    00401548  |.  66:0BD2       |or      dx, dx                                ;                 (为了改变标志位的)
    0040154B  |.  75 0D         |jnz     short 0040155A                        ;  如果有余数则本次结束
    0040154D  |.  41            |inc     ecx                                   ;  ecx=ecx+1(ecx最后等于整除个数+1)
    0040154E  |.  46            |inc     esi
    0040154F  |.  51            |push    ecx                                   ;  存储ecx
    00401550  |.  FF75 08       |push    dword ptr [ebp+8]
    00401553  |.  E8 0A000000   |call    00401562
    00401558  |.^ EB E5         |jmp     short 0040153F
    0040155A  |>  46            |inc     esi
    0040155B  |.^ EB E2         \jmp     short 0040153F
    0040155D  |>  61            popad
    0040155E  |.  C9            leave
    0040155F  \.  C2 0400       retn    4
   
   
    在这里 我们又发现一个call            00401553  |.  E8 0A000000   |call    00401562,
    天啊好复杂啊,我们在进去看看
   
   
    00401562  /$  55            push    ebp
    00401563  |.  8BEC          mov     ebp, esp
    00401565  |.  60            pushad
    00401566  |.  56            push    esi
    00401567  |.  50            push    eax
    00401568  |.  51            push    ecx
    00401569  |.  33C0          xor     eax, eax                               ;  eax=0
    0040156B  |.  8B75 08       mov     esi, dword ptr [ebp+8]
    0040156E  |>  8A06          mov     al, byte ptr [esi]                     ;  esi字符串前ecx个字符都和10异或
    00401570  |.  34 10         xor     al, 10
    00401572  |.  8806          mov     byte ptr [esi], al
    00401574  |.  46            inc     esi
    00401575  |.^ E2 F7         loopd   short 0040156E
    00401577  |.  59            pop     ecx
    00401578  |.  58            pop     eax
    00401579  |.  5E            pop     esi
    0040157A  |.  61            popad
    0040157B  |.  C9            leave
   
    还好,这里还简单些,就是将前ecx个字符与10H异或,再保存 ecx是什么呢?对了就是被整除的个数+1。
   
    这一段分析完了,喝一杯茶,休息一会,我们 继续分析哈!
    00401240  |. /0F8C 89000000 jl      004012CF                               ;  下面是注册算法
    00401246  |. |68 28694000   push    00406928                               ;  ASCII "495544622"
    0040124B  |. |E8 9B000000   call    004012EB                               ;  注册算法
    00401250  |. |6A 64         push    64                                     ; /Count = 64 (100.)
    00401252  |. |68 B1664000   push    004066B1                               ; |Buffer = keygen_2.004066B1
    00401257  |. |68 D0070000   push    7D0                                    ; |ControlID = 7D0 (2000.)
    0040125C  |. |FF75 08       push    dword ptr [ebp+8]                      ; |hWnd
    0040125F  |. |E8 F4050000   call    <jmp.&user32.GetDlgItemTextA>          ; \GetDlgItemTextA
    00401264  |. |E8 16030000   call    0040157F                               ;  又是算法
    00401269  |. |68 6D684000   push    0040686D
    0040126E  |. |68 B1664000   push    004066B1
    00401273  |. |E8 BC030000   call    00401634
    00401278  |. |85C0          test    eax, eax
    0040127A  |. |74 53         je      short 004012CF                         ;  关键call 跳就失败
   
   
    好,返回了,这次我们来到00401264
    0040157F  /$  60            pushad
    00401580  |.  B9 06000000   mov     ecx, 6                                 ;  ecx=6
    00401585  |.  33D2          xor     edx, edx                               ;  edx=0
    00401587  |.  33C0          xor     eax, eax                               ;  eax=0
    00401589  |.  BE ED664000   mov     esi, 004066ED
    0040158E  |.  BB E9674000   mov     ebx, 004067E9
    00401593  |.  EB 04         jmp     short 00401599
    00401595  |>  42            /inc     edx                                   ;  整个是6次
    00401596  |.  83C6 10       |add     esi, 10
    00401599  |>  0306           /add     eax, dword ptr [esi]                 ; |?
    0040159B  |.  83C6 04       ||add     esi, 4                               ; |
    0040159E  |.^ E2 F9         |\loopd   short 00401599                       ; |
    004015A0  |.  B9 06000000   |mov     ecx, 6                                ; |恢复ecx=6
    004015A5  |.  50            |push    eax                                   ; |压栈
    004015A6  |.  8903          |mov     dword ptr [ebx], eax                  ; |存储eax
    004015A8  |.  83C3 04       |add     ebx, 4                                ; |指向下一个字符
    004015AB  |.  33C0          |xor     eax, eax                              ; |
    004015AD  |.  83FA 05       |cmp     edx, 5                                ; |
    004015B0  |.^ 75 E3         \jnz     short 00401595                        ; |
    004015B2  |.  68 A9684000   push    004068A9                               ; |%lx%lx%lx%lx%lx%lx
    004015B7  |.  68 6D684000   push    0040686D                               ; |s = keygen_2.0040686D
    004015BC  |.  E8 79020000   call    <jmp.&user32.wsprintfA>                ; \wsprintfA
   
    其实仔细分析便知道,这里是最后的算法了
   
    这里是将每一组的6个数累加,一共有6组;
    加完就计算出激活码啦!给出一个正确的注册码  
    1EE84DE7B374768B1F08539FB7B4BEE352BAEF5F81B601B  495544622
  本人编程功底不是很高
  因此写注册机有点问题,不知道自己分析的对不对,希望高手能指导一下哈!!
  下面是我写是算法 当然是写错了 今天弄这个弄了10个小时,头也大了,贴上来吧,大家指点我一下 嘻嘻
  #include<stdio.h>
  #include<string.h>
  
  
  unsigned short Table2[200];            //004066ED
  
  void text(int i, int j,unsigned int T)
  {
          int c=1,j2=j;
          if(j==0||T%2!=0)
          {
                  c++;
                  for(;j2<=0;j2--)
                          Table2[6*i+j2]=Table2[6*i+j2]^0x10;
          }
  }
  int main()
  {
  
  unsigned int Table[88]={             //00406000
                  0x0000,0x0000, 0x9630, 0x0777, 0x2C61, 0x0EEE, 0xBA51, 0x0999,
                  0x19C4,0x6D07, 0x8FF4, 0x6A70, 0x35A5, 0x63E9, 0xA395, 0x649E,
                  0x3288,0xDB0E, 0xA4B8, 0xDC79, 0x1EE9, 0xD5E0, 0x88D9, 0xD297,
                  0x2B4C,0xB609, 0xBD7C, 0xB17E, 0x072D, 0xB8E7, 0x911D, 0xBF90,
                  0x6410,0xB71D, 0xF220, 0xB06A, 0x4871, 0xB9F3, 0xDE41, 0xBE84,
                  0x7DD4,0xDA1A, 0xEBE4, 0xDD6D, 0x51B5, 0xD4F4, 0xC785, 0xD383,  
                  0x5698,0x6C13, 0xC0A8, 0x6B64, 0x7AF9, 0x62FD, 0xECC9, 0x658A,  
                  0x4F5C,0x0114, 0xD96C, 0x0663, 0x633D, 0x0FFA, 0xF50D, 0x088D,  
                  0xC820,0x6E3B, 0x5E10, 0x694C, 0xE441, 0x60D5, 0x7271, 0x67A2,
                  0xD1E4,0x033C, 0x47D4, 0x044B, 0xFD85, 0x0DD2, 0x6BB5, 0x0AA5,
                  0xFAA8,0xB535, 0x6C98, 0xB242, 0xD6C9, 0xBBDB, 0x40F9, 0xBCAC};
          int i,b,a[6],w[6],k,j;
          char ch;
          printf("请输入激活码");
          for(i=0;i<6;i++)
                  scanf("%c",&ch);
          for(i=0;i<6;i++)
                                  for(j=6*i+0;j<6*i+6;j++)
                                  {
                                          a[j]=ch;
                                          a[j]=a[j]^(Table[(j+1)]);
                                          b=a[j] & 0x0ffff;  //b=ebx
                                          a[j]=a[j] & 0x0ffff0000;
                                          a[j]=a[j]*b;
                                          a[j]=a[j]^b;
                                          Table2[j]=Table[j];
                          }
      text(i,j,Table2);
                  i=0;j=0;
                  for(i=0;i<6;i++)
                  {       
                          for(k=0;k<6;k++)
                          {
                                  w[i]=Table2[6*i+4*i+j];
                                  j++;
                          }
  
                  }
                  for(i=0;i<6;i++)
                  {
  
                          printf("%x",w[i]);
                  }
  
  
         
  
  }
  
--------------------------------------------------------------------------------
【版权声明】: 【版权声明】: 本文原创于看雪软件安全论坛 , 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年10月05日 下午 10:48:53

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 76
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持一个,期待完成版
2009-10-7 22:57
0
雪    币: 433
活跃值: (1895)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
3
Support!有时候我可不只十小时,哈哈…
2009-10-7 23:01
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
很明显,上面的图是爆破的,Ulock码我已经写出kegen了,是分别对6个表求和,然后把6个和连起来的一个字符串,这几天比较忙,没有去分析注册码,过几天再说吧,注册码是个长度为48的字符串
2009-10-10 20:32
0
雪    币: 88
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
对 就是爆破的,大体思路差不多,就是写不出来注册机,郁闷啊
2009-10-12 13:59
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
keyGen写出来了,但是有个问题没有解决,就是这个crackme对用户名要求很严格,没有找到产生合法用户名的方法
2009-10-13 14:19
0
游客
登录 | 注册 方可回帖
返回