首页
社区
课程
招聘
[原创]happytown第九个crackme的破解
2006-2-19 15:44 13320

[原创]happytown第九个crackme的破解

2006-2-19 15:44
13320
原帖子http://bbs.pediy.com/showthread.php?s=&threadid=21435
1)去壳,去anti-debug等。
2)通过DeDe分析,得到下面
004597EC  /.  55            push    ebp
004597ED  |.  8BEC          mov     ebp, esp
004597EF  |.  B9 0B000000   mov     ecx, 0B
004597F4  |>  6A 00         /push    0
004597F6  |.  6A 00         |push    0
004597F8  |.  49            |dec     ecx
004597F9  |.^ 75 F9         \jnz     short 004597F4
004597FB  |.  53            push    ebx
004597FC  |.  56            push    esi
004597FD  |.  8955 C4       mov     [ebp-3C], edx
00459800  |.  8945 FC       mov     [ebp-4], eax
00459803  |.  33C0          xor     eax, eax
00459805  |.  55            push    ebp
00459806  |.  68 6E9A4500   push    00459A6E
0045980B  |.  64:FF30       push    dword ptr fs:[eax]
0045980E  |.  64:8920       mov     fs:[eax], esp
00459811  |.  8D55 C0       lea     edx, [ebp-40]
00459814  |.  8B45 FC       mov     eax, [ebp-4]
00459817  |.  8B80 04030000 mov     eax, [eax+304]
0045981D  |.  E8 C6B7FDFF   call    00434FE8                     ;  get serail
00459822  |.  8B45 C0       mov     eax, [ebp-40]                ;  serail string
00459825  |.  E8 7AAAFAFF   call    004042A4
0045982A  |.  83F8 10       cmp     eax, 10
0045982D  |.  0F85 E1010000 jnz     00459A14
00459833  |.  8D55 F8       lea     edx, [ebp-8]
00459836  |.  8B45 FC       mov     eax, [ebp-4]
00459839  |.  8B80 F8020000 mov     eax, [eax+2F8]
0045983F  |.  E8 A4B7FDFF   call    00434FE8                     ;  get name
00459844  |.  8B45 F8       mov     eax, [ebp-8]                 ;  name string
00459847  |.  E8 80E9FFFF   call    004581CC                     ;  加密name        ;这里不说了,注册机源代码里有这部

分分析
0045984C  |.  8945 F4       mov     [ebp-C], eax
0045984F  |.  8D45 F8       lea     eax, [ebp-8]
00459852  |.  E8 2DF7FFFF   call    00458F84                     ;  getproductid
00459857  |.  8B45 F8       mov     eax, [ebp-8]
0045985A  |.  E8 6DE9FFFF   call    004581CC                     ;  加密productid ;这里不说了,注册机源代码里有这

部分分析
0045985F  |.  3145 F4       xor     [ebp-C], eax                 ;  xor 加密name 和 加密productid 送到important
00459862  |.  8D45 F8       lea     eax, [ebp-8]
00459865  |.  E8 7AA7FAFF   call    00403FE4
0045986A  |.  8B45 F4       mov     eax, [ebp-C]
0045986D  |.  33D2          xor     edx, edx
0045986F  |.  52            push    edx                          ; /Arg2 => 00000000
00459870  |.  50            push    eax                          ; |Arg1
00459871  |.  8D55 D4       lea     edx, [ebp-2C]                ; |
00459874  |.  B8 08000000   mov     eax, 8                       ; |
00459879  |.  E8 C6E7FAFF   call    00408044                     ; \上面的结果important转换成的字符strimportant
0045987E  |.  8D55 BC       lea     edx, [ebp-44]
00459881      8B45 D4       mov     eax, [ebp-2C]                ;  strimportant
00459884  |.  E8 2BE7FFFF   call    00457FB4                     ;  md5变换上面的东西
00459889      8B45 BC       mov     eax, [ebp-44]
0045988C  |.  8D55 D0       lea     edx, [ebp-30]
0045988F  |.  E8 24E3FAFF   call    00407BB8                     ;  大写变换
00459894  |.  8D55 B4       lea     edx, [ebp-4C]
00459897  |.  8B45 D0       mov     eax, [ebp-30]
0045989A  |.  E8 29C9FFFF   call    004561C8                     ;  sha变换
0045989F  |.  8B45 B4       mov     eax, [ebp-4C]                ;  变换的字符String1
004598A2  |.  8D55 B8       lea     edx, [ebp-48]
004598A5  |.  E8 0EE3FAFF   call    00407BB8                     ;  大写变换
004598AA  |.  8B55 B8       mov     edx, [ebp-48]                ;  String1的大写字符串String2
004598AD  |.  8D45 D0       lea     eax, [ebp-30]
004598B0  |.  E8 C7A7FAFF   call    0040407C
004598B5  |.  8B45 D0       mov     eax, [ebp-30]
004598B8  |.  E8 E3EBFFFF   call    004584A0                     ;  blowfish_初始化 Key是String2
004598BD  |.  8B45 F4       mov     eax, [ebp-C]
004598C0  |.  33D2          xor     edx, edx
004598C2  |.  8945 D8       mov     [ebp-28], eax
004598C5  |.  8955 DC       mov     [ebp-24], edx
004598C8  |.  FF75 DC       push    dword ptr [ebp-24]           ; /Arg2
004598CB  |.  FF75 D8       push    dword ptr [ebp-28]           ; |Arg1
004598CE  |.  E8 6DEAFFFF   call    00458340                     ; \Blowfish加密(important,0)
004598D3  |.  52            push    edx                          ; /Blowfish加密的right DWORD
004598D4  |.  50            push    eax                          ; |Blowfish加密的left DWORD
004598D5  |.  8D55 CC       lea     edx, [ebp-34]                ; |
004598D8  |.  33C0          xor     eax, eax                     ; |
004598DA  |.  E8 65E7FAFF   call    00408044                     ; \转换合并成一个字符串16位的String
004598DF  |.  B8 849A4500   mov     eax, 00459A84                ;  ASCII "kernel32.dll"
004598E4  |.  E8 B7EBFFFF   call    004584A0                     ;  blowfish_初始化 Key是"kernel32.dll"
004598E9  |.  8D55 B0       lea     edx, [ebp-50]
004598EC  |.  8B45 FC       mov     eax, [ebp-4]
004598EF  |.  8B80 04030000 mov     eax, [eax+304]
004598F5  |.  E8 EEB6FDFF   call    00434FE8
004598FA  |.  8B45 B0       mov     eax, [ebp-50]                ;  Serial String
004598FD  |.  E8 F6CFFFFF   call    004568F8                     ;  转换成数值
00459902  |.  8945 D8       mov     [ebp-28], eax
00459905  |.  8955 DC       mov     [ebp-24], edx
00459908  |.  FF75 DC       push    dword ptr [ebp-24]           ; /Blowfish_decipher Left DWORD
0045990B  |.  FF75 D8       push    dword ptr [ebp-28]           ; |Blowfish Decipher RIGHT DWORD
0045990E  |.  E8 7DE9FFFF   call    00458290                     ; \Blowfish Decipher
00459913  |.  52            push    edx                          ; /解密Left DWORD
00459914  |.  50            push    eax                          ; |解密的Right DWORD
00459915  |.  8D55 C8       lea     edx, [ebp-38]                ; |
00459918  |.  33C0          xor     eax, eax                     ; |
0045991A  |.  E8 25E7FAFF   call    00408044                     ; \转换成字符串String3
0045991F  |.  8B45 F4       mov     eax, [ebp-C]
00459922  |.  33D2          xor     edx, edx
00459924  |.  52            push    edx                          ; /Arg2 => 00000000
00459925  |.  50            push    eax                          ; |Arg1
00459926  |.  8D55 A8       lea     edx, [ebp-58]                ; |
00459929  |.  33C0          xor     eax, eax                     ; |
0045992B  |.  E8 14E7FAFF   call    00408044                     ; \dumped_1.00408044
00459930  |.  8B45 A8       mov     eax, [ebp-58]
00459933  |.  8D55 AC       lea     edx, [ebp-54]
00459936  |.  E8 7DE2FAFF   call    00407BB8
0045993B  |.  8B55 AC       mov     edx, [ebp-54]                ;String
0045993E  |.  8B45 C8       mov     eax, [ebp-38]                ;第二次
00459941  |.  E8 AAAAFAFF   call    004043F0                     ;  比较函数
00459946      0F85 C8000000 jnz     00459A14                        ;关键跳
0045994C  |.  8D45 F0       lea     eax, [ebp-10]
0045994F  |.  BA 9C9A4500   mov     edx, 00459A9C
00459954  |.  E8 23A7FAFF   call    0040407C
00459959  |.  8D45 EC       lea     eax, [ebp-14]
0045995C  |.  BA B49A4500   mov     edx, 00459AB4
00459961  |.  E8 16A7FAFF   call    0040407C
00459966  |.  C745 E4 01000>mov     dword ptr [ebp-1C], 1
0045996D  |>  8D45 F0       /lea     eax, [ebp-10]
00459970  |.  E8 87ABFAFF   |call    004044FC
00459975  |.  8B55 E4       |mov     edx, [ebp-1C]
00459978  |.  8B4D F0       |mov     ecx, [ebp-10]
0045997B  |.  8B5D E4       |mov     ebx, [ebp-1C]
0045997E  |.  8A4C19 FF     |mov     cl, [ecx+ebx-1]
00459982  |.  8B5D EC       |mov     ebx, [ebp-14]
00459985  |.  8B75 E4       |mov     esi, [ebp-1C]
00459988  |.  8A5C33 FF     |mov     bl, [ebx+esi-1]
0045998C  |.  32CB          |xor     cl, bl
0045998E  |.  884C10 FF     |mov     [eax+edx-1], cl
00459992  |.  FF45 E4       |inc     dword ptr [ebp-1C]
00459995  |.  837D E4 10    |cmp     dword ptr [ebp-1C], 10
00459999  |.^ 75 D2         \jnz     short 0045996D
0045999B  |.  8D45 E8       lea     eax, [ebp-18]
0045999E  |.  8B55 F0       mov     edx, [ebp-10]
004599A1  |.  E8 D6A6FAFF   call    0040407C
004599A6  |.  8B45 FC       mov     eax, [ebp-4]
004599A9  |.  8B80 14030000 mov     eax, [eax+314]
004599AF  |.  8B40 68       mov     eax, [eax+68]
004599B2  |.  BA FF000000   mov     edx, 0FF
004599B7  |.  E8 F82DFCFF   call    0041C7B4
004599BC  |.  8B45 FC       mov     eax, [ebp-4]
004599BF  |.  8B80 14030000 mov     eax, [eax+314]
004599C5  |.  8B40 68       mov     eax, [eax+68]
004599C8  |.  8A15 C49A4500 mov     dl, [459AC4]
004599CE  |.  E8 AD30FCFF   call    0041CA80
004599D3  |.  8B55 E8       mov     edx, [ebp-18]
004599D6  |.  8B45 FC       mov     eax, [ebp-4]
004599D9  |.  8B80 14030000 mov     eax, [eax+314]
004599DF  |.  E8 34B6FDFF   call    00435018
004599E4  |.  33D2          xor     edx, edx
004599E6  |.  8B45 FC       mov     eax, [ebp-4]
004599E9  |.  8B80 F8020000 mov     eax, [eax+2F8]
004599EF  |.  8B08          mov     ecx, [eax]
004599F1  |.  FF51 64       call    [ecx+64]
004599F4  |.  33D2          xor     edx, edx
004599F6  |.  8B45 FC       mov     eax, [ebp-4]
004599F9  |.  8B80 04030000 mov     eax, [eax+304]
004599FF  |.  8B08          mov     ecx, [eax]
00459A01  |.  FF51 64       call    [ecx+64]
00459A04  |.  33D2          xor     edx, edx
00459A06  |.  8B45 FC       mov     eax, [ebp-4]
00459A09  |.  8B80 0C030000 mov     eax, [eax+30C]
00459A0F  |.  8B08          mov     ecx, [eax]
00459A11  |.  FF51 64       call    [ecx+64]
00459A14  |>  33C0          xor     eax, eax
00459A16  |.  5A            pop     edx
00459A17  |.  59            pop     ecx
00459A18  |.  59            pop     ecx
00459A19  |.  64:8910       mov     fs:[eax], edx
00459A1C  |.  68 759A4500   push    00459A75
00459A21  |>  8D45 A8       lea     eax, [ebp-58]
00459A24  |.  BA 02000000   mov     edx, 2
00459A29  |.  E8 DAA5FAFF   call    00404008
00459A2E  |.  8D45 B0       lea     eax, [ebp-50]
00459A31  |.  E8 AEA5FAFF   call    00403FE4
00459A36  |.  8D45 B4       lea     eax, [ebp-4C]
00459A39  |.  BA 03000000   mov     edx, 3
00459A3E  |.  E8 C5A5FAFF   call    00404008
00459A43  |.  8D45 C0       lea     eax, [ebp-40]
00459A46  |.  E8 99A5FAFF   call    00403FE4
00459A4B  |.  8D45 C8       lea     eax, [ebp-38]
00459A4E  |.  BA 04000000   mov     edx, 4
00459A53  |.  E8 B0A5FAFF   call    00404008
00459A58  |.  8D45 E8       lea     eax, [ebp-18]
00459A5B  |.  BA 03000000   mov     edx, 3
00459A60  |.  E8 A3A5FAFF   call    00404008
00459A65  |.  8D45 F8       lea     eax, [ebp-8]
00459A68  |.  E8 77A5FAFF   call    00403FE4
00459A6D  \.  C3            retn

xor 加密name 和 加密productid 送到important。
important这个很重要。
昨天分析?算法用了md5,sha,今天继续分析,进入004584A0发现很像Blowfish的初始化过程,对比PArray和SBox,果然是

BlowFish的初始话

004584A0  /$  55            push    ebp
004584A1  |.  8BEC          mov     ebp, esp
004584A3  |.  83C4 E0       add     esp, -20
004584A6  |.  8945 FC       mov     [ebp-4], eax
004584A9  |.  8B45 FC       mov     eax, [ebp-4]
004584AC  |.  E8 E3BFFAFF   call    00404494
004584B1  |.  33C0          xor     eax, eax
004584B3  |.  55            push    ebp
004584B4  |.  68 F4854500   push    004585F4
004584B9  |.  64:FF30       push    dword ptr fs:[eax]
004584BC  |.  64:8920       mov     fs:[eax], esp
004584BF  |.  B8 00E04500   mov     eax, 0045E000
004584C4  |.  33C9          xor     ecx, ecx
004584C6  |.  BA 48100000   mov     edx, 1048
004584CB  |.  E8 E0A7FAFF   call    00402CB0                     ;  分配内存
004584D0  |.  C745 F4 01000>mov     dword ptr [ebp-C], 1
004584D7  |.  C745 F8 01000>mov     dword ptr [ebp-8], 1
004584DE  |>  33C0          /xor     eax, eax
004584E0  |.  8945 EC       |mov     [ebp-14], eax
004584E3  |.  33C0          |xor     eax, eax
004584E5  |.  8945 F0       |mov     [ebp-10], eax
004584E8  |>  8B45 EC       |/mov     eax, [ebp-14]
004584EB  |.  C1E0 08       ||shl     eax, 8
004584EE  |.  8B55 FC       ||mov     edx, [ebp-4]
004584F1  |.  8B4D F4       ||mov     ecx, [ebp-C]
004584F4  |.  0FB6540A FF   ||movzx   edx, byte ptr [edx+ecx-1]
004584F9  |.  0BC2          ||or      eax, edx
004584FB  |.  8945 EC       ||mov     [ebp-14], eax
004584FE  |.  FF45 F4       ||inc     dword ptr [ebp-C]
00458501  |.  8B45 FC       ||mov     eax, [ebp-4]
00458504  |.  E8 9BBDFAFF   ||call    004042A4                   ;  获得blowfish key的长度
00458509  |.  3B45 F4       ||cmp     eax, [ebp-C]
0045850C  |.  7D 07         ||jge     short 00458515
0045850E  |.  C745 F4 01000>||mov     dword ptr [ebp-C], 1
00458515  |>  FF45 F0       ||inc     dword ptr [ebp-10]
00458518  |.  837D F0 04    ||cmp     dword ptr [ebp-10], 4
0045851C  |.^ 75 CA         |\jnz     short 004584E8
0045851E  |.  8B45 F8       |mov     eax, [ebp-8]
00458521  |.  8B0485 A0AD45>|mov     eax, [eax*4+45ADA0]
00458528  |.  3345 EC       |xor     eax, [ebp-14]
0045852B  |.  8B55 F8       |mov     edx, [ebp-8]
0045852E  |.  890495 FCDF45>|mov     [edx*4+45DFFC], eax
00458535  |.  FF45 F8       |inc     dword ptr [ebp-8]
00458538  |.  837D F8 13    |cmp     dword ptr [ebp-8], 13
0045853C  |.^ 75 A0         \jnz     short 004584DE              ;  初始化PArray
0045853E  |.  33C0          xor     eax, eax
00458540  |.  8945 F8       mov     [ebp-8], eax
00458543  |>  33C0          /xor     eax, eax
00458545  |.  8945 F4       |mov     [ebp-C], eax
00458548  |>  8B45 F8       |/mov     eax, [ebp-8]
0045854B  |.  C1E0 07       ||shl     eax, 7
0045854E  |.  8D04C5 ECAD45>||lea     eax, [eax*8+45ADEC]
00458555  |.  8B55 F4       ||mov     edx, [ebp-C]
00458558  |.  8B0490        ||mov     eax, [eax+edx*4]
0045855B  |.  8B55 F8       ||mov     edx, [ebp-8]
0045855E  |.  C1E2 08       ||shl     edx, 8
00458561  |.  0355 F4       ||add     edx, [ebp-C]
00458564  |.  890495 48E045>||mov     [edx*4+45E048], eax
0045856B  |.  FF45 F4       ||inc     dword ptr [ebp-C]
0045856E  |.  817D F4 00010>||cmp     dword ptr [ebp-C], 100
00458575  |.^ 75 D1         |\jnz     short 00458548
00458577  |.  FF45 F8       |inc     dword ptr [ebp-8]
0045857A  |.  837D F8 04    |cmp     dword ptr [ebp-8], 4
0045857E  |.^ 75 C3         \jnz     short 00458543              ;  初始化SBox
00458580  |.  C745 E0 00000>mov     dword ptr [ebp-20], 0
00458587  |.  C745 E4 00000>mov     dword ptr [ebp-1C], 0
0045858E  |.  C745 F8 01000>mov     dword ptr [ebp-8], 1
00458595  |>  FF75 E4       /push    dword ptr [ebp-1C]          ; /Arg2
00458598  |.  FF75 E0       |push    dword ptr [ebp-20]          ; |Arg1
0045859B  |.  E8 A0FDFFFF   |call    00458340                    ; \Blowfish_encipher
004585A0  |.  8945 E0       |mov     [ebp-20], eax
004585A3  |.  8955 E4       |mov     [ebp-1C], edx
004585A6  |.  8B45 E4       |mov     eax, [ebp-1C]
004585A9  |.  33D2          |xor     edx, edx
004585AB  |.  8B55 F8       |mov     edx, [ebp-8]
004585AE  |.  03D2          |add     edx, edx
004585B0  |.  890495 F8DF45>|mov     [edx*4+45DFF8], eax         ;  保存Left加密数据
004585B7  |.  6A 01         |push    1
004585B9  |.  6A 00         |push    0
004585BB  |.  8B45 E0       |mov     eax, [ebp-20]
004585BE  |.  8B55 E4       |mov     edx, [ebp-1C]
004585C1  |.  E8 16C8FAFF   |call    00404DDC
004585C6  |.  8B55 F8       |mov     edx, [ebp-8]
004585C9  |.  03D2          |add     edx, edx
004585CB  |.  890495 FCDF45>|mov     [edx*4+45DFFC], eax         ;  保存Right加密数据
004585D2  |.  FF45 F8       |inc     dword ptr [ebp-8]
004585D5  |.  817D F8 0A020>|cmp     dword ptr [ebp-8], 20A
004585DC  |.^ 75 B7         \jnz     short 00458595
004585DE  |.  33C0          xor     eax, eax
004585E0  |.  5A            pop     edx
004585E1  |.  59            pop     ecx
004585E2  |.  59            pop     ecx
004585E3  |.  64:8910       mov     fs:[eax], edx
004585E6  |.  68 FB854500   push    004585FB
004585EB  |>  8D45 FC       lea     eax, [ebp-4]
004585EE  |.  E8 F1B9FAFF   call    00403FE4
004585F3  \.  C3            retn

很明显00458340就是BlowFish的加密过程,程序共进行两次blowfish初始化,第一次用Key=String2,第二次Key="kernel32.dll"

,后来分析,其实前面的md5,sha,第一次blowfish都是没用的,只有最后一次blowfish才是真正的核心。于是猜想
0045990E  |.  E8 7DE9FFFF   call    00458290                     ; \Blowfish Decipher是Blowfish的解密过程,跟进去

果然没错。

序列号的解密过程是,把序列号变成两个DWORD,用第二次Blowfish解密,转换成字符串,看看和strimportant相等,相等就正确

了。第二次Blowfish的Key是"kernel32.dll"。

所以获得序列号的过程就是Blowfish加密(0,important),在把加密结果转换成16位的字符串就是serial了。

我的注册是:
name:nightfox
productid:76481-640-4179232-23767
serial:BE40505B4EE98FF2

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞7
打赏
分享
最新回复 (20)
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-19 15:47
2
0
由于上传不了,帖注册机代码。主要部分:
KenGen4CrackMeDlg.cpp
// KenGen4CrackMeDlg.cpp : implementation file
//Coded By NightFox 2006.2.19

#include "stdafx.h"
#include "KenGen4CrackMe.h"
#include "KenGen4CrackMeDlg.h"

#include "BlowFish.h"        //BLOWFISH类

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//以下是用OllyDBG对加密name和productid过程的逆向分析
//SBox直接从内存中Dump出来 位于CrackMe 0x45dbe0 256个DWORD
DWORD dumpmem[256]={
0x00000000    ,0x77073096    ,0xEE0E612C    ,0x990951BA,
0x076DC419    ,0x706AF48F    ,0xE963A535    ,0x9E6495A3,
0x0EDB8832    ,0x79DCB8A4    ,0xE0D5E91E    ,0x97D2D988,
0x09B64C2B    ,0x7EB17CBD    ,0xE7B82D07    ,0x90BF1D91,
0x1DB71064    ,0x6AB020F2    ,0xF3B97148    ,0x84BE41DE,
0x1ADAD47D    ,0x6DDDE4EB    ,0xF4D4B551    ,0x83D385C7,
0x136C9856    ,0x646BA8C0    ,0xFD62F97A    ,0x8A65C9EC,
0x14015C4F    ,0x63066CD9    ,0xFA0F3D63    ,0x8D080DF5,
0x3B6E20C8    ,0x4C69105E    ,0xD56041E4    ,0xA2677172,
0x3C03E4D1    ,0x4B04D447    ,0xD20D85FD    ,0xA50AB56B,
0x35B5A8FA    ,0x42B2986C    ,0xDBBBC9D6    ,0xACBCF940,
0x32D86CE3    ,0x45DF5C75    ,0xDCD60DCF    ,0xABD13D59,
0x26D930AC    ,0x51DE003A    ,0xC8D75180    ,0xBFD06116,
0x21B4F4B5    ,0x56B3C423    ,0xCFBA9599    ,0xB8BDA50F,
0x2802B89E    ,0x5F058808    ,0xC60CD9B2    ,0xB10BE924,
0x2F6F7C87    ,0x58684C11    ,0xC1611DAB    ,0xB6662D3D,
0x76DC4190    ,0x01DB7106    ,0x98D220BC    ,0xEFD5102A,
0x71B18589    ,0x06B6B51F    ,0x9FBFE4A5    ,0xE8B8D433,
0x7807C9A2    ,0x0F00F934    ,0x9609A88E    ,0xE10E9818,
0x7F6A0DBB    ,0x086D3D2D    ,0x91646C97    ,0xE6635C01,
0x6B6B51F4    ,0x1C6C6162    ,0x856530D8    ,0xF262004E,
0x6C0695ED    ,0x1B01A57B    ,0x8208F4C1    ,0xF50FC457,
0x65B0D9C6    ,0x12B7E950    ,0x8BBEB8EA    ,0xFCB9887C,
0x62DD1DDF    ,0x15DA2D49    ,0x8CD37CF3    ,0xFBD44C65,
0x4DB26158    ,0x3AB551CE    ,0xA3BC0074    ,0xD4BB30E2,
0x4ADFA541    ,0x3DD895D7    ,0xA4D1C46D    ,0xD3D6F4FB,
0x4369E96A    ,0x346ED9FC    ,0xAD678846    ,0xDA60B8D0,
0x44042D73    ,0x33031DE5    ,0xAA0A4C5F    ,0xDD0D7CC9,
0x5005713C    ,0x270241AA    ,0xBE0B1010    ,0xC90C2086,
0x5768B525    ,0x206F85B3    ,0xB966D409    ,0xCE61E49F,
0x5EDEF90E    ,0x29D9C998    ,0xB0D09822    ,0xC7D7A8B4,
0x59B33D17    ,0x2EB40D81    ,0xB7BD5C3B    ,0xC0BA6CAD,
0xEDB88320    ,0x9ABFB3B6    ,0x03B6E20C    ,0x74B1D29A,
0xEAD54739    ,0x9DD277AF    ,0x04DB2615    ,0x73DC1683,
0xE3630B12    ,0x94643B84    ,0x0D6D6A3E    ,0x7A6A5AA8,
0xE40ECF0B    ,0x9309FF9D    ,0x0A00AE27    ,0x7D079EB1,
0xF00F9344    ,0x8708A3D2    ,0x1E01F268    ,0x6906C2FE,
0xF762575D    ,0x806567CB    ,0x196C3671    ,0x6E6B06E7,
0xFED41B76    ,0x89D32BE0    ,0x10DA7A5A    ,0x67DD4ACC,
0xF9B9DF6F    ,0x8EBEEFF9    ,0x17B7BE43    ,0x60B08ED5,
0xD6D6A3E8    ,0xA1D1937E    ,0x38D8C2C4    ,0x4FDFF252,
0xD1BB67F1    ,0xA6BC5767    ,0x3FB506DD    ,0x48B2364B,
0xD80D2BDA    ,0xAF0A1B4C    ,0x36034AF6    ,0x41047A60,
0xDF60EFC3    ,0xA867DF55    ,0x316E8EEF    ,0x4669BE79,
0xCB61B38C    ,0xBC66831A    ,0x256FD2A0    ,0x5268E236,
0xCC0C7795    ,0xBB0B4703    ,0x220216B9    ,0x5505262F,
0xC5BA3BBE    ,0xB2BD0B28    ,0x2BB45A92    ,0x5CB36A04,
0xC2D7FFA7    ,0xB5D0CF31    ,0x2CD99E8B    ,0x5BDEAE1D,
0x9B64C2B0    ,0xEC63F226    ,0x756AA39C    ,0x026D930A,
0x9C0906A9    ,0xEB0E363F    ,0x72076785    ,0x05005713,
0x95BF4A82    ,0xE2B87A14    ,0x7BB12BAE    ,0x0CB61B38,
0x92D28E9B    ,0xE5D5BE0D    ,0x7CDCEFB7    ,0x0BDBDF21,
0x86D3D2D4    ,0xF1D4E242    ,0x68DDB3F8    ,0x1FDA836E,
0x81BE16CD    ,0xF6B9265B    ,0x6FB077E1    ,0x18B74777,
0x88085AE6    ,0xFF0F6A70    ,0x66063BCA    ,0x11010B5C,
0x8F659EFF    ,0xF862AE69    ,0x616BFFD3    ,0x166CCF45,
0xA00AE278    ,0xD70DD2EE    ,0x4E048354    ,0x3903B3C2,
0xA7672661    ,0xD06016F7    ,0x4969474D    ,0x3E6E77DB,
0xAED16A4A    ,0xD9D65ADC    ,0x40DF0B66    ,0x37D83BF0,
0xA9BCAE53    ,0xDEBB9EC5    ,0x47B2CF7F    ,0x30B5FFE9,
0xBDBDF21C    ,0xCABAC28A    ,0x53B39330    ,0x24B4A3A6,
0xBAD03605    ,0xCDD70693    ,0x54DE5729    ,0x23D967BF,
0xB3667A2E    ,0xC4614AB8    ,0x5D681B02    ,0x2A6F2B94,
0xB40BBE37    ,0xC30C8EA1    ,0x5A05DF1B    ,0x2D02EF8D
};
//SBox直接从内存中Dump出来 位于CrackMe 0x45dbe0 256个DWORD

//加密过程逆向分析
DWORD EncipherString(char* str)
{
        int len=strlen(str);
        DWORD result=0xffffffff;
        DWORD temp1,temp2;
        for(int i=0;i<len;i++)
        {
                temp1=(DWORD)str[i];
                temp2=result;
                temp2^=temp1;
                temp2=temp2&0xff;
                temp1=result;
                temp1>>=8;
                temp1&=0xffffff;
                temp1^=dumpmem[temp2];
                result=temp1;
        }
        result=~result;
        return result;;
}
//以上是用OllyDBG对加密name过程的逆向分析

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
        CAboutDlg();

// Dialog Data
        //{{AFX_DATA(CAboutDlg)
        enum { IDD = IDD_ABOUTBOX };
        //}}AFX_DATA

        // ClassWizard generated virtual function overrides
        //{{AFX_VIRTUAL(CAboutDlg)
        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
        //}}AFX_VIRTUAL

// Implementation
protected:
        //{{AFX_MSG(CAboutDlg)
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
        //{{AFX_DATA_INIT(CAboutDlg)
        //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CAboutDlg)
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
        //{{AFX_MSG_MAP(CAboutDlg)
                // No message handlers
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKenGen4CrackMeDlg dialog

CKenGen4CrackMeDlg::CKenGen4CrackMeDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CKenGen4CrackMeDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CKenGen4CrackMeDlg)
        m_strUser = _T("");
        m_strSerial = _T("");
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKenGen4CrackMeDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CKenGen4CrackMeDlg)
        DDX_Text(pDX, IDC_EDIT1, m_strUser);
        DDX_Text(pDX, IDC_EDIT2, m_strSerial);
        //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CKenGen4CrackMeDlg, CDialog)
        //{{AFX_MSG_MAP(CKenGen4CrackMeDlg)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CKenGen4CrackMeDlg message handlers

BOOL CKenGen4CrackMeDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // Add "About..." menu item to system menu.

        // IDM_ABOUTBOX must be in the system command range.
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);

        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
                CString strAboutMenu;
                strAboutMenu.LoadString(IDS_ABOUTBOX);
                if (!strAboutMenu.IsEmpty())
                {
                        pSysMenu->AppendMenu(MF_SEPARATOR);
                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                }
        }

        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);                        // Set big icon
        SetIcon(m_hIcon, FALSE);                // Set small icon
       
        // TODO: Add extra initialization here
       
        return TRUE;  // return TRUE  unless you set the focus to a control
}

void CKenGen4CrackMeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
                CAboutDlg dlgAbout;
                dlgAbout.DoModal();
        }
        else
        {
                CDialog::OnSysCommand(nID, lParam);
        }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CKenGen4CrackMeDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // device context for painting

                SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                // Center icon in client rectangle
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // Draw the icon
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CDialog::OnPaint();
        }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CKenGen4CrackMeDlg::OnQueryDragIcon()
{
        return (HCURSOR) m_hIcon;
}

void CKenGen4CrackMeDlg::OnOK()
{
        // TODO: Add extra validation here
        CAboutDlg dlg;
        dlg.DoModal();
       
        //CDialog::OnOK();
}

void CKenGen4CrackMeDlg::OnChangeEdit1()
{
        // TODO: If this is a RICHEDIT control, the control will not
        // send this notification unless you override the CDialog::OnInitDialog()
        // function and call CRichEditCtrl().SetEventMask()
        // with the ENM_CHANGE flag ORed into the mask.
       
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);
        if(m_strUser=="")
        {
                m_strSerial="";
                UpdateData(FALSE);
                return;
        }
        //获得ProductID
        char produtid[256]="\0";
       
        HKEY hSubkey;
        LONG nValue=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\",0,KEY_READ,&hSubkey);
       
        if(nValue!=ERROR_SUCCESS)
        {
                return;
        }
        else
        {
                //ZeroMemory(data,256);
                DWORD type_2=REG_SZ;//定义数据类型
                DWORD cbData_2=80;//定义数据长度

                LONG rt=RegQueryValueEx(hSubkey,"ProductId",NULL,&type_2,(LPBYTE)produtid,&cbData_2);
                if(rt!=ERROR_SUCCESS)
                {
                        return;
                }
        }
        //获得ProductID

        //char serial[]="76481-640-4179232-23767";

        DWORD ret1=EncipherString((LPSTR)(LPCSTR)m_strUser);        //加密name
        DWORD ret2=EncipherString(produtid);                        //加密productid
       
        CBlowFish blowfish;
        DWORD left=0;        //BLOWFISH加密的左DWORD
        DWORD right=ret1^ret2;        //BLOWFISH加密的右DWORD 由ret1^ret2得到
        //blowfish.Blowfish_encipher(&left,&right);

        char key[]="kernel32.dll";                //BLOWFISH的密钥KEY
        blowfish.Initialize((BYTE*)key,0xc);        //KEY初始化

        blowfish.Blowfish_encipher(&left,&right);        //加密

        CString temp1;
        CString temp2;

        temp1.Format("%X",left);
        temp2.Format("%X",right);

        m_strSerial=temp1+temp2;

        UpdateData(FALSE);
}
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-19 15:52
3
0
注册机加源代码!!!
vc6.0下调试通过。感谢happytown的辛勤劳动。
上传的附件:
雪    币: 242
活跃值: (135)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
mirrormask 3 2006-2-19 16:04
4
0
厉害,佩服!!
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-19 16:10
5
0
比较幸运而已,正好几个加密的过程我都比较熟悉。
雪    币: 32410
活跃值: (18730)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2006-2-19 16:10
6
0
功力确实不错。;)
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-19 16:15
7
0
最初由 kanxue 发布
功力确实不错。;)


不敢当,只是爱好罢了,不想当什么顶尖的。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gaojun14 2006-2-19 17:10
8
0
高手,要是能有你一半一半的功力就好了.
雪    币: 3136
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scihkimo 2006-2-19 20:38
9
0
分析的很好!
多多发帖吧^^
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
genius62 2006-2-20 00:59
10
0
高手!能告诉我你学什么专业的吗?
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-20 10:19
11
0
最初由 genius62 发布
高手!能告诉我你学什么专业的吗?

本科学数学的,硕士在中科院学计算机,人工智能方向,马上要毕业了。我的QQ448089717,希望能和大家多多交流,共同进步。
雪    币: 242
活跃值: (135)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
mirrormask 3 2006-2-20 17:50
12
0
在论坛精华3的序言中,JOJO老大总结了一下Crack技术的几个阶段,再次转贴一下,并分
析个组织需要的成员阶段。以飨初学者。
___________________________________________________________________________­___
__________________

第一个阶段应该算是爆破的阶段(暂不考虑加壳的因素),绝大多数软件都可以通过修改
来得到破解,它需要我们大致了解程序加密的过程并准确的找到其判断点,由于一些现成
的工具和经验使我们找这些近乎成为机械的运动(尤其是在WINDOWS下的软件)所以爆破一
个软件变的相对容易,但不是说一定是容易的。

如果有一天你不是一上来就是拿着斧头砍来砍去而是从内存里嗅出了一串儿注册码的话,
那就恭喜你进阶了。

第三个阶段应该是追出非明码比较的注册码了,它们通常多为多条件和计算型形式,这个
时候你要拿出笔和纸来,在搞清楚部分算法的同时,找到合适的断点让软件的自动计算和
你的手动计算结合一起算出注册码来。

第四个阶段就是作出通用的注册机。这需要你完全搞明白注册算法和加密原理。通常这个
过程是非常痛苦的。如果你对自己充满信心想体会一下的话那最好的选择就是AJJ的CRACK
ME2――层层设防了。通常到这个时候你就可以算是一名高手了。

第五个阶段就是学习掌握一定的密码学知识,并了解常见的公共加密算法,做出利用成熟
加密算法或密码学原理加密软件的注册机或提出解决之方法。如果你能达到这个境界,那
么恭喜你可以成为一名职业选手了,你将和世界最知名的CRACKER平起平坐。

NightFox兄弟已经很高了
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2006-2-20 20:06
13
0
事实上,我也没想到Ryosuke这么快就做出了注册机(有bugger吗?只是凭感觉有!过两天到学校后我再仔细检查看看,希望没有!)

怪不得这么厉害,原来是数学专业的!是我最敬佩的专业了。

=============================================
这个CrackMe我在www.crackmes.de给的难度是4/10,链接:http://www.crackmes.de/users/happytown/crackme_0009/。 大家也可以经常去那里和国外的高手交流。

=============================================
还有,有人知道CCG的近况吗?如何联系到他们?
雪    币: 236
活跃值: (160)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
busheler 3 2006-2-21 00:07
14
0
BlowFish加密解密
确实有意思!
学习中。。。
以前只是md5,呵呵!

看样子,对我,破解的路太长了............
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-21 13:02
15
0
最初由 happytown 发布
事实上,我也没想到Ryosuke这么快就做出了注册机(有bugger吗?只是凭感觉有!过两天到学校后我再仔细检查看看,希望没有!)

怪不得这么厉害,原来是数学专业的!是我最敬佩的专业了。

=============================================
........

好像没有BUG,其实别的地方也没仔细看。大家对我的评价有点过了,我也只才学习半年,要学习的东西还很多,我觉得学习一个东西最重要的就是要细心,多想,多实践,没别的窍门,以后我会更加努力的学习,谢谢大家的支持。
雪    币: 200
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
angie 2006-2-21 13:06
16
0
都是高手,有谁愿意教教我,我不会天天麻烦你们的,就是有什么不懂的时候可以请教一下!
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2006-2-21 14:44
17
0
你的注册机的确存在个小bug,请使用下面的数据验证:

(为了使用方便,压缩包内包含ProductID.reg文件,双击即可,请先备份你注册表的这项,机器可能需要

重起)

ProductID:55661-640-5222971-23698

Name:happytown!@
Serial:983E8C229B766E1

内含的CrackMe_0009 Key Generator文件是我写的注册机,可用于参考。还有默认的名字和序列号是由我机器的ProductID,可能和你的不一样。
上传的附件:
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zymmeng 2006-2-21 14:54
18
0
长知识了....多多发共享贴
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-21 15:29
19
0
最初由 happytown 发布
你的注册机的确存在个小bug,请使用下面的数据验证:

(为了使用方便,压缩包内包含ProductID.reg文件,双击即可,请先备份你注册表的这项,机器可能需要

重起)
........

用你的数据在我这里不能通过!你CrackMe中是打开HKEY_LOCAL_MACHINE\\SOFTWARE\Microsoft\Windows\CurrentVersion这个键的,而你给的ProductID.reg是修改HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Registration这个键,是不是有点问题。另外我的程序也有点小问题,就是忘记RegCloseKey了,呵呵。
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
happytown 31 2006-2-21 15:44
20
0
Sorry,疏忽了!

你用我的注册机在Name中输入,直到Serial框中第一个字符为0,然后你去用相同的Name看你的注册机,是不是少了个0。

上面的0很容易出现的。

其实就是这个0的差异而已。
雪    币: 370
活跃值: (78)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
Ryosuke 24 2006-2-21 16:03
21
0
最初由 happytown 发布
Sorry,疏忽了!

你用我的注册机在Name中输入,直到Serial框中第一个字符为0,然后你去用相同的Name看你的注册机,是不是少了个0。

上面的0很容易出现的。
........

谢谢提醒,忘记固定字符串长度了,修改了。
上传的附件:
游客
登录 | 注册 方可回帖
返回