首页
社区
课程
招聘
[原创]一个非明码比较,无错误提示的crackME-小鸟学注册(2)
发表于: 2005-2-17 17:05 43604

[原创]一个非明码比较,无错误提示的crackME-小鸟学注册(2)

4nil 活跃值
13
2005-2-17 17:05
43604
收藏
免费 7
支持
分享
最新回复 (34)
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
手动脱壳,标志比较明显,不说了
研究了一上午,中午搞明白了其中的一些原因:
1、用户名、密码的限制:
1)UserName长度必须满足400<=107*(700 - 5 * (48 - 72 / len)) - 53100<=8960即3<=len<=9;
2)满足4559 % pszUserPass[0] == 23即pszUserPass[0]*x=4539,然后可以推算出第一位可能的字符,这里取了一个字符T,过了对Pass第一位的检查;
3)用于个人习惯,这里使用了pszUserPass代表序列号字符串

2、注册机代码如下,使用Vc6编写,XP SP3下通过测试:

int main(int argc, char* argv[])
{
        if (argc < 2)
        {
                printf("Usage: aa.exe UserName");
                return 0;
        }

        char *pszUserName = argv[1];
        DWORD dwLenOfUserName = lstrlenA(pszUserName);
        if (dwLenOfUserName< 3 || dwLenOfUserName > 9)
        {
                printf("Length of Name in 3 ~9 !\n");
                return 0;
        }

        DWORD v17 = 0;
        for (int i = 0; i < dwLenOfUserName; i++)
        {
                v17 += pszUserName[i];
        }

        char v15[27] = {0};
        memcpy(v15, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", sizeof(v15));

        char v16[256] = {0};
        for (int k = 0; k < dwLenOfUserName; k++)
        {
                v16[k] = (pszUserName[k] * (k + 3) * dwLenOfUserName
                        + (v15[4 * k - (k + 1)] ^ pszUserName[k])
                        + ~(k * v17 - v17)
                        + 333)
                        % 0xA
                        + 48;
        v16[k] = (k + 2) * (v16[k] ^ 0xADAC) % 10 + 48;

        }

        CHAR v12[256] = {0};
        wsprintfA(v12, "%c%s", 'T', v16);

        char pszUserPassCalculated[256] = {0};
    wsprintfA(pszUserPassCalculated, "%s-%d", v12, v17 * dwLenOfUserName % 100 + 48);

        char pszUserPassCalculated2[256] = {0};

        pszUserPassCalculated2[0] = pszUserPassCalculated[0];
        for (int j = 1; j < lstrlenA(pszUserPassCalculated); j++)
        {
                pszUserPassCalculated2[j] = (pszUserPassCalculated[j] ^ 0x20) % 10 + 48;
        }

        printf("Name: %s\nPass: %s\n", pszUserName, pszUserPassCalculated2);

        return 0;
}
输入用户名,直接给出了用户名、Password对,检测了几个帐号都能够成功注册。
程序里面好像有点问题,只比较了Password的前10个字符,后面的字符好像没有比较
2012-11-13 11:37
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
28
我也在看《crack2007》,弄了很久也做出注册机来了。其实也不太难,只是很麻烦罢了
2013-2-5 20:37
0
雪    币: 52
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
帖子老了,也不知道适不适合再回帖,但是本人刚开始学习,也就本着对自己负责的态度说说这其中的问题,好像也没人提出来。
就是
for(i=0;i<name_len;i++)
  {
    temp=(((((name[i]^table[i*3-1])+((total*i-total)^0xffffffff)+0x14d+(i+3)*name_len*name[i])%10+0x30)^0xadac)*(i+2))%10+0x30;
    midserial[i+1]=(char)temp;
  }
这段代码中table[i*3-1]的小问题,i从0开始,也就说此时是table[-1],但是此处的思想是对的,因为反汇编的确是这样操作的,我想是编写程序的人的一个失误,我想编写原程序的人应该想的是i从1开始,因为这样i才有可能等于9,这时才能访问"Z",不然"XYZ"就没意义。。。
并且反汇编的这个下标为-1的值总是为0x00;楼主反汇编后也是,但是自己写的注册机是0xCC,估计是此处的0x00是之前有变量赋值在此,于是只好判断i==0的时候让它等于0x00。。。
2013-8-1 10:40
1
雪    币: 92
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
注册几年了都没来过,现在还是菜鸟,又开始学了,这个题还算简单,连我等菜鸟都破出了了

666666
8892105358

注册机就没去看了,看得头疼,今天学习了下消息断点,消息断点还是蛮好用的,用消息断点段下来的,没用api
2014-4-6 23:23
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
这个注册码真麻烦.以后有可以的话再也不看算法,
shuguang
T07868844332
2014-7-22 19:37
0
雪    币: 62
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
这么难的算法真的适合菜鸟么 T_T
2014-8-3 15:57
0
雪    币: 193
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
学习!!!
2016-3-22 21:28
0
雪    币: 1567
活跃值: (905)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
2019年最后一天来学习了
2019-12-31 16:29
0
雪    币: 1979
活跃值: (107)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
请问连结失效了吗
2020-8-24 22:29
0
游客
登录 | 注册 方可回帖
返回
//