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