首页
社区
课程
招聘
[旧帖] [原创]source insight 3.5.x 算号器源代码 0.00雪花
2013-5-21 18:28 3365

[旧帖] [原创]source insight 3.5.x 算号器源代码 0.00雪花

2013-5-21 18:28
3365
先前看了 @einsnabuck 写的source insight 3.5的破解,文章分析得很准确,但是感觉最后的结论不正确,而且也没提供计算序列号的算法
所以我就按照@einsnabuck分析出来的位置sub_448F37,用IDA看了一下程序。

source insight的序列号大概是SI3US-XXXXXX-YYYYY,就是说第一部分是SI3US,第二部分是一个6位数,并且不能是2222222,333333之类的6位都相同的数,同时也要一并排除123456之类的常用的瞎试的数(SI本身就是这么校验的!),最关键的是:第三部分的5位数完全是由XXXXXX部分计算出来的。 所以这个算法就很简单了。

下面是我写的source insight 3.5.x序列号算号器:

首先,去除已安装source insight序列号:
1. 打开注册表:开始->运行->输入"regedit",确定,然后就打开了注册表管理器。
2. 在位置:HKEY_LOCAL_MACHINE\SOFTWARE\Source Dynamics\Source Insight\3.0\Install\
   下面有个SerialNumber表项,其值就是你的已经注册了的序列号。
   双击SerialNumber表项,清空数值数据。保存关闭注册表即可

效果图:

可执行程序链接:SI-Keygen

源代码:
/*
* By Apneng.Net @2013.05.21
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>

unsigned int digit(unsigned int v, unsigned int i)
{
    v = v%(int)pow(10, i);
    return v/(int)pow(10, i-1);
}
/*big random number*/
long lrand()
{
    if (RAND_MAX == 0x7FFF)
        return (long)((rand() << 16)| rand());
    else
        return rand();
}

int main()
{
    const unsigned int mask[32] = {
        0X3039, 0X1E240, 0X5464E, 0X6F855, 0X8AA52, 0XA5BF5, 0X980D0,
        0XBADD0, 0X980D0, 0X30448, 0X30379, 0X8AF93, 0X30379, 0X7B9,
        0XF2F90, 0X9FF66, 0X8AA52, 0XF3A0, 0X30379, 0X8AA52, 0X62AF,
        0X2AD, 0X71FDC, 0X5A124, 0XFFB2, 0XB96D8, 0X2B18E, 0X4CDE4,
        0X71FDC, 0X1068C, 0X765C3A63, 0X745C3533
    };
    const int i_dat[10] = {0x96, 0x95, 0x10, 0x23, 7, 0x15, 8, 3, 16, 17};
    srand((unsigned int)time(NULL));

    while (1) {
        unsigned int d = 0;
        unsigned int mid_number = 0;
        char resp[128];
        int i = 0;
        while(1) {
            d = lrand()%1000000;
            if (d < 100000 || d%111111 == 0)
                continue;
            for (i = 0; i < 32; ++i) {
                if (mask[i] == d)
                    break;
            }
            if (i==32)
                break;
        } 
        mid_number = d;

        for (i=0; i<6; ++i) {
            d = (i_dat[i]^(digit(mid_number, 6-i)+48)) + 4*d;
        }
        d = d%100000;
        if (d < 10000)
            continue;

        printf("Serial number: SI3US-%d-%d\n", mid_number, d);

        // try again
        printf("Do you want to have a try, again(y|n)? ");

        memset(resp, 0, 128);
        scanf("%s", resp);
        fflush(stdin);
        if (resp[0]=='y' || resp[0]=='Y') {
            continue;
        } else {
            printf("Good Bye!\n");
            break;
        }
    }

    return 0;
}



备注:
1. 上面的程序进行了尽可能多的尝试,如果各位发现生成了不正确的序列号请告之。
2. 上面的源代码同步发表在个人的博客上了。

[培训]《安卓高级研修班(网课)》月薪三万计划

收藏
点赞2
打赏
分享
最新回复 (5)
雪    币: 26435
活跃值: (18467)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2013-5-21 22:22
2
0
己发邀请码,请收短信。
由于没分析过程,先设优秀。
雪    币: 87
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
ingvar 2013-5-21 23:02
3
0
非常感谢坛主关心
我抽空把分析过程补上
雪    币: 708
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MiSHE 2013-5-22 00:09
4
0
以前keygen过,前半串有个黑名单

        "000000",
        "111111",
        "222222",
        "333333",
        "444444",
        "555555",
        "666666",
        "777777",
        "888888",
        "999999",
        "012345",
        "123456",
        "234567",
        "345678",
        "456789",
        "567890",
        "678901",
        "622800",
        "765392",
        "197704",
        "197497",
        "569235",
        "001977",
        "995216",
        "655206",
        "062368",
        "025263",
        "000685",
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sereno 2013-5-22 08:20
5
0
俺也来关注这个程序,感谢分享。
雪    币: 87
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
ingvar 2013-5-22 10:59
6
0
是的,有个黑名单,类似于123456之类的瞎猜的数。

在我的程序中这些数都保存在mask数组中了。

多谢关心
游客
登录 | 注册 方可回帖
返回