首页
社区
课程
招聘
[破解练习]KeygenMe 2.0 By CuteSnail 新鲜出炉啦~~
发表于: 2009-7-1 14:58 13670

[破解练习]KeygenMe 2.0 By CuteSnail 新鲜出炉啦~~

2009-7-1 14:58
13670
收藏
免费 0
支持
分享
最新回复 (44)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
看下 验收哈
2009-7-20 13:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
far
27
用户名和注册码各位asci 字符加起来=0x701,我的是name:arrrrrrrr      sn:bbbbbbbb
后来写了两个注册机,玩的。delphi版。现附上C源码!

#include <stdio.h>
#include <stdlib.h>

long getsum(char *na)        //求和
{
        int sum = 0;
        for(;*na != 0;na++) sum += *na;
        return sum;
}

char crack(char *na,char *sa)
{
        long sum = 0;
        int moder = 0, cnt = 0;
        int i,j;
        sum = 0x701 - getsum(na);
        if (sum <= 0x20)
        {
                printf("need shorter name!\n");
                return 0;
        }

        moder = sum % 0x7a;                //只能算出ASCII和小于0x7a - 0x20 = 0x6e1 ('XXX' - ' ' = 0x6e1)
        cnt = sum / 0x7a;       //0x7a == 'z';

        for (i=0; i<cnt; i++)   //前面几个用‘Z’代
        {
                sa[i] = 0x7a;
        }

        if (moder  == 0)            //刚好整除
        {
                return 1;
        }
        else if (moder <= 0x20)    //非常用字符(空格符以下)
        {
                sa[i-1] -= moder;
                sa[i] = 2 * moder;
                return 1;
        }
        else                                                //常用字符
        {
                sa[i] = moder;
                return 1;
        }
        return 0;

}

int main(int argc, char *argv[])
{
       
        char name[40] = {0};
        char sn[40]   = {0};

        printf("Input your name:\n");
        scanf("%s",name);            //输入姓名
        if (crack(name,sn) == 1)
        {
                printf("sn is: %s \n",sn);
        }
        else printf("input error!\n"); //其他错误
  
        system("PAUSE");       
        return 0;
}
上传的附件:
2009-7-20 18:00
0
雪    币: 337
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
一就搞出来了,真厉害啊
2009-8-14 18:02
0
雪    币: 206
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
name:    searise
code:    BC9999999999999999

虽然知道算法,姓名的ASCII累加为2EC,code的ASCII累加必须为415,但还是凑了很久才凑了个415出来。:-&
2009-8-23 03:16
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
我是菜鸟,用的爆破,成功。

但是,为什么看不到真实注册码啊?????

求大侠解答。
2009-8-23 08:55
0
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
楼上大牛很多,偶一小菜鸟亦解出了。

(Name的ASCII码总和)+20090000=20090701-(Code的ASCII码总和);

一个Name对应太多Code了,看来写注册机只能用随机函数了。
2009-8-25 10:59
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
0040EBA6  |.  E8 C144FFFF          call KeyGenMe.0040306C
0040EBAB  |.  85C0                 test eax,eax
0040EBAD      7E 13                jle short KeyGenMe.0040EBC2
0040EBAF >|.  BA 01000000          mov edx,1                                ;  ebx -1
0040EBB4  |>  8B4D FC              /mov ecx,dword ptr ss:[ebp-4]            ;  用户名放到ecx
0040EBB7 >|.  0FB64C11 FF          |movzx ecx,byte ptr ds:[ecx+edx-1]       ;  先零扩展,再传送
0040EBBC  |.  03D9                 |add ebx,ecx
0040EBBE  |.  42                   |inc edx                                 ;  edx+1
0040EBBF >|.  48                   |dec eax                                 ;  eax -1
0040EBC0  |.^ 75 F2                \jnz short KeyGenMe.0040EBB4             ;  不等与则循环
0040EBC2  |>  8B45 F8              mov eax,dword ptr ss:[ebp-8]             ;  取完后保存在eax
0040EBC5  |.  E8 A244FFFF          call KeyGenMe.0040306C                   ;  取出注册码
0040EBCA  |.  85C0                 test eax,eax                             ;  注册码是否大于6 大与则跳//这个应该是错误的,请求正确的提示
0040EBCC      7E 13                jle short KeyGenMe.0040EBE1
0040EBCE  |.  BA 01000000          mov edx,1
0040EBD3  |>  8B4D F8              /mov ecx,dword ptr ss:[ebp-8]            ;  传送假码
0040EBD6 >|.  0FB64C11 FF          |movzx ecx,byte ptr ds:[ecx+edx-1]       ;  取假码
0040EBDB  |.  03F1                 |add esi,ecx
0040EBDD >|.  42                   |inc edx                                 ;  ebx +1
0040EBDE >|.  48                   |dec eax                                 ;  eax -1
0040EBDF  |.^ 75 F2                \jnz short KeyGenMe.0040EBD3             ;  循环
0040EBE1      81C3 00000920        add ebx,20090000
0040EBE7      B8 01070920          mov eax,20090701
0040EBEC  |.  2BC6                 sub eax,esi
0040EBEE      3BD8                 cmp ebx,eax                              ;  比较是否为0 或相等则不跳
0040EBF0  |.  75 1C                jnz short KeyGenMe.0040EC0E              ;  NO掉 就爆破了
0040EBF2  |.  68 4CEC4000          push KeyGenMe.0040EC4C                   ;  注册成功
0040EBF7  |.  FF75 FC              push dword ptr ss:[ebp-4]
0040EBFA  |.  68 5CEC4000          push KeyGenMe.0040EC5C                   ;   registered!
0040EBFF  |.  8B45 F4              mov eax,dword ptr ss:[ebp-C]
0040EC02  |.  BA 03000000          mov edx,3
0040EC07  |.  E8 2045FFFF          call KeyGenMe.0040312C
0040EC0C  |.  EB 0D                jmp short KeyGenMe.0040EC1B
0040EC0E  |>  8B45 F4              mov eax,dword ptr ss:[ebp-C]
0040EC11  |.  BA 74EC4000          mov edx,KeyGenMe.0040EC74                ;  注册错误
0040EC16  |.  E8 4543FFFF          call KeyGenMe.00402F60

用户名 270+20090000=20090270 EBX
假码 135+20090701=200905CC   EAX

算不出注册码,太笨了。. 只能爆破。.~

0040EBE1      81C3 00000920        add ebx,20090000
0040EBE7      B8 01070920          mov eax,20090701      //  这两个分别与用户名和假码相加。传送,如何令到他们为0或者相等呢?  真弄不明白。作者出来解释一下。~
2009-8-25 14:43
0
雪    币: 85
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
明白了!~  真是感谢前面发布的人
2009-8-25 15:16
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
35
这就是让你来搞定的呀!呵呵。。。
2009-9-4 23:35
0
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
爆破成功
上传的附件:
2009-9-5 11:42
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
给分吧!!!!!!!!!!

ddddddddd

ddddddcaa

凑出来的!!
上传的附件:
2009-9-10 22:03
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
38
呵呵,已经在UpK散完分了呀,下次给你补上吧~
2009-9-12 18:00
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
weky
ZZZZZZZZZZZZZZU

#include <stdio.h>
#include <iostream.h>
#include <windows.h>
void main(){
char inin[20];
memset(inin,0,20);
scanf("%s",&inin);
int s=0;
for(int i=0;i<20;i++){
        s=s+inin[i];
        if(inin[i]==0){
                break;
        }
}
printf("%x\n",s);
s=s+0x20090000;
int t=0x20090701;
int zhucema;
//t-注册码的总数值....t-s=zhucema
zhucema=t-s;
printf("%x\n",zhucema);
char zc[20];
memset(zc,0,20);
        int n=zhucema/0x5a;
        int l=zhucema%0x5a;
for(int q=0;q<n;q++){
        zc[q]=0x5a;
}
zc[n]=l;
printf("%s",zc);
}
2009-9-15 00:26
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
40
楼上大侠这个机机的最后一个字符可能会出现不可视的情况吧?
2009-9-22 19:57
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
41
也不一定呀!比如楼上的楼上就没有用随机函数呀!是用字母Z来先拼凑的,最后一个才由剩余ASCII码转为其他字符的。
2009-9-23 12:57
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
42
给出一组
name:1  ASCII:31
code:mmmmmmmmmmmmmmmm        ASCII:6d0

6d0+31=701
2009-9-24 00:25
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
43
1、KeyGenMe特点
Delphi编
、明显息、明码比较、无无Anti、算法简单适合
2
、详细的分析过程
于OD无法识别Delphi语言数,所以助Dede工具导出map文件,然后再利用OD插件Godup Plugin入map文件就可以识数了。
先,OD入程,查找示字符
/*--------------------------------------------------------------------------------------------------------------------------*/
0040EB70  /$  55            push    ebp
0040EB71  |.  8BEC          mov     ebp, esp
0040EB73  |.  83C4 F4       add     esp, -0C
0040EB76  
|.  53            push    ebx
0040EB77  |.  56            push    esi
0040EB78  |.  894D F4       mov     dword ptr [ebp-C], ecx
0040EB7B  |.  8955 F8       mov     dword ptr [ebp-8], edx
0040EB7E  |.  8945 FC       mov     dword ptr [ebp-4], eax
0040EB81  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0040EB84  |.  E8 9746FFFF   call    00403220                         ;  没什么意义的call
0040EB89  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
0040EB8C  |.  E8 8F46FFFF   call    00403220
0040EB91  
|.  33C0          xor     eax, eax
0040EB93  |.  55            push    ebp
0040EB94  |.  68 36EC4000   push    0040EC36
0040EB99  
|.  64:FF30       push    dword ptr fs:[eax]
0040EB9C  |.  64:8920       mov     dword ptr fs:[eax], esp
0040EB9F  |.  33DB          xor     ebx, ebx
0040EBA1  |.  33F6          xor     esi, esi
0040EBA3  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
0040EBA6  |.  E8 C144FFFF   call    0040306C                         ;  检测name和code是否为空
0040EBAB  |.  85C0          test    eax, eax
0040EBAD  |.  7E 13         jle     short 0040EBC2
0040EBAF  
|.  BA 01000000   mov     edx, 1
0040EBB4  
|>  8B4D FC       /mov     ecx, dword ptr [ebp-4]
0040EBB7  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]
0040EBBC  |.  03D9          |add     ebx, ecx
0040EBBE  |.  42            |inc     edx
0040EBBF  |.  48            |dec     eax
0040EBC0  |.^ 75 F2         \jnz     short 0040EBB4                  ;  累加注册码ebx
0040EBC2  |>  8B45 F8       mov     eax, dword ptr [ebp-8]
0040EBC5  |.  E8 A244FFFF   call    0040306C
0040EBCA  
|.  85C0          test    eax, eax
0040EBCC  |.  7E 13         jle     short 0040EBE1
0040EBCE  
|.  BA 01000000   mov     edx, 1
0040EBD3  
|>  8B4D F8       /mov     ecx, dword ptr [ebp-8]
0040EBD6  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]
0040EBDB  |.  03F1          |add     esi, ecx
0040EBDD  |.  42            |inc     edx
0040EBDE  |.  48            |dec     eaxi
0040EBE1  |>  81C3 00000920 add     ebx, 20090000                    ;  加20090000
0040EBE7  |.  B8 01070920   mov     eax, -esi20090701                ;20090701
0040EBEC  |.  2BC6          sub     eax, esi                        
0040EBEE  |.  3BD8          cmp     ebx, eax
0040EBDF  |.^ 75 F2         \jnz     short 0040EBD3                  ;  累加密码es
0040EBF0  |.  75 1C         jnz     short 0040EC0E                   ;  关键跳,爆破
0040EBF2  |.  68 4CEC4000   push    0040EC4C                         ;  ASCII "Cool~ "
0040EBF7  |.  FF75 FC       push    dword ptr [ebp-4]
0040EBFA  |.  68 5CEC4000   push    0040EC5C                         ;  ASCII " Registered!"
0040EBFF  |.  8B45 F4       mov     eax, dword ptr [ebp-C]
0040EC02  |.  BA 03000000   mov     edx, 3
0040EC07  
|.  E8 2045FFFF   call    0040312C
0040EC0C  
|.  EB 0D         jmp     short 0040EC1B
0040EC0E  
|>  8B45 F4       mov     eax, dword ptr [ebp-C]
0040EC11  |.  BA 74EC4000   mov     edx, 0040EC74                    ;  ASCII "No,Unregistered!Try Again!"
0040EC16  |.  E8 4543FFFF   call    00402F60
0040EC1B  
|>  33C0          xor     eax, eax
0040EC1D  |.  5A            pop     edx
0040EC1E  |.  59            pop     ecx
0040EC1F  |.  59            pop     ecx
0040EC20  |.  64:8910       mov     dword ptr fs:[eax], edx
0040EC23  |.  68 3DEC4000   push    0040EC3D
0040EC28  
|>  8D45 F8       lea     eax, dword ptr [ebp-8]
0040EC2B  |.  BA 02000000   mov     edx, 2
0040EC30  
|.  E8 FB42FFFF   call    00402F30
0040EC35  
\.  C3            retn

里就是算法计算的核心部分,OD显示本地调用来0040ECCB(在这下断找到获取name和code)

/*--------------------------------------------------------------------------------------------------------------------------*/
0040EC9E  |.  55            push    ebp                              ;  获取用户名
0040EC9F  |.  68 14ED4000   push    0040ED14
0040ECA4  
|.  64:FF30       push    dword ptr fs:[eax]
0040ECA7  |.  64:8920       mov     dword ptr fs:[eax], esp
0040ECAA  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
0040ECAD  |.  8B43 68       mov     eax, dword ptr [ebx+68]
0040ECB0  |.  E8 AB8AFFFF   call    00407760
0040ECB5  
|.  8B45 F8       mov     eax, dword ptr [ebp-8]           ;  ebp-8保存code
0040ECB8  |.  50            push    eax
0040ECB9  |.  8D55 F4       lea     edx, dword ptr [ebp-C]
0040ECBC  |.  8B43 60       mov     eax, dword ptr [ebx+60]
0040ECBF  |.  E8 9C8AFFFF   call    00407760                         ;  取得name和code的call
0040ECC4  |.  8B45 F4       mov     eax, dword ptr [ebp-C]           ;  ebp-4保存name
0040ECC7  |.  8D4D FC       lea     ecx, dword ptr [ebp-4]
0040ECCA  |.  5A            pop     edx
0040ECCB  |.  E8 A0FEFFFF   call    0040EB70                         ;  算法核心call---》0040EB70地址
我们看下到底是如何获取name和 code 的,F7
0040ECBF  |.  E8 9C8AFFFF   call    00407760                         ;  取得name和code的call
/*--------------------------------------------------------------------------------------------------------------------------*/
00407760  /$  53            push    ebx
00407761  |.  57            push    edi
00407762  |.  93            xchg    eax, ebx
00407763  |.  89D7          mov     edi, edx
00407765  |.  807B 46 00    cmp     byte ptr [ebx+46], 0
00407769  
|.  75 26         jnz     short 00407791
0040776B  
|.  8B4B 28       mov     ecx, dword ptr [ebx+28]
0040776E  |.  E3 21         jecxz   short 00407791
00407770  
|.  51            push    ecx                              ; /hWnd
00407771  |.  E8 AECAFFFF   call    <jmp.&user32.GetWindowTextLength>; \GetWindowTextLengthA
00407776  |.  50            push    eax
00407777  |.  92            xchg    eax, edx
00407778  |.  89F8          mov     eax, edi
0040777A  |.  E8 F5BAFFFF   call    00403274
0040777F  
|.  59            pop     ecx
00407780  |.  E3 1B         jecxz   short 0040779D
00407782  
|.  41            inc     ecx
00407783  |.  51            push    ecx                              ; /Count
00407784  |.  FF37          push    dword ptr [edi]                  ; |Buffer
00407786  |.  FF73 28       push    dword ptr [ebx+28]               ; |hWnd
00407789  |.  E8 8ECAFFFF   call    <jmp.&user32.GetWindowTextA>     ; \GetWindowTextA
0040778E  |.  5F            pop     edi
0040778F  |.  5B            pop     ebx
00407790  |.  C3            retn
00407791  |>  8B93 89050000 mov     edx, dword ptr [ebx+589]
00407797  |.  97            xchg    eax, edi
00407798  |.  E8 87B8FFFF   call    00403024
0040779D  
|>  5F            pop     edi
0040779E  |.  5B            pop     ebx
0040779F  \.  C3            retn
见是调的 GetWindowTextA 数,但是也以下断 bpx GetWindowTextA
/*--------------------------------------------------------------------------------------------------------------------------*/
3、算法
算法:
name的ASCII码+ 0x20090000 == 0x20090701 - code的ASCII
一个name对应多个code,没价值,注册机就省了。

/*--------------------------------------------------------------------------------------------------------------------------*/
4、总结
Delphi程
序OD无法识别函数,以结合DeDe分析。
当无法找到
时可接下断 bpx GetWindowTextA来寻找突破
该KeyGenMe
在设计缺陷,对户名度没限制,算法糙,适合入门。

2009-9-24 00:26
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
44
晕 为什么在notexpad2排版好好的 复制到这就不整齐了
2009-9-24 00:29
0
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
45
呵呵,楼上写的真详细!辛苦了呀!
2009-9-26 22:04
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
谢谢楼主,以后多发些。
上传的附件:
2009-9-29 16:26
0
游客
登录 | 注册 方可回帖
返回
//