吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 25132|回复: 49
收起左侧

[其他] 来,放源码,大家一起玩

  [复制链接]
海风月影 发表于 2014-11-9 21:30
本帖最后由 海风月影 于 2014-11-9 21:42 编辑

保护手段:特殊版的编译器,clang.exe cm.c,生成出来的bin,就是比赛用的
编译方式:普通编译器也可以编译,注释掉一行编译选项:cl.exe cm.c即可

下面放的源码是跨平台的,其实也可以做个Android版本,不过为了降低难度,只做了Windows版本
把源码里面关于Windows平台代码注释去掉,编译出来,就是比赛放出去的版本

说明一下,你们自己的编译器如果报错,注释掉下面一行就行了
// 这行是特殊版编译器的选项,普通编译器编译,注释掉就行了
#pragma obfuscate on

源码如下:
//#include <windows.h>
#include <stdio.h>
#include <math.h>

#define PI 3.141592653589793238462643383279
#define EPLISON        0.00001

#define   R1   -0.1666665668e+0
#define   R2     0.8333025139e-2
#define   R3   -0.1980741872e-3
#define   R4     0.2601903036e-5

#define   INVSPI     0.31830988618379067153776752674508
#define   HALFPI     (PI / 2)

#define   C1     3.140625
#define   C2     9.67653589793e-4

#define                hashkey1        0xB4B2F8C2
#define                hashkey2        0x2FF54B62
#define                hashkey3        0x9639CE42
#define                hashkey4        0x58ECCC20

// 这行是特殊版编译器的选项,普通编译器编译,注释掉就行了
#pragma obfuscate on

char key[50] = {0};        //48位的key
char name[35] = "";

int vaild();

int main(int argc, char *argv[])
{
        //HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
        //SetConsoleTitle("52Pojie CrackMe Contest 2014");
        //SetConsoleTextAttribute(hd, 0xF);
        printf("                         52Pojie CrackMe Contest 2014\n");
        printf("                            [url]http://www.52pojie.cn[/url]\n\n");
        printf("                               Author: 海风月影\n\n");
        printf("Useage: \n  cm [name] [key]\n");
        printf("\n");
        if(argc < 2)
        {
                printf("Please Input Name (length = [3, 32]): ");
                scanf("%32s", name);
                printf("Please Input Key (length = 48): ");
                scanf("%48s", key);
                printf("\n\n\n");
        }
        else
        {
                strncpy(name, argv[1], 32);
                strncpy(key, argv[2], 48);
        }
        printf("Your name: %s\nYour key: %s\nChecking...", name, key);
        //SetConsoleTextAttribute(hd, 12);
        vaild();
        //SetConsoleTextAttribute(hd, 0xF);
        {
                char tmp[6] = {'D', 'o', 'n', 'e', '!', 0};
                printf("\n%s\n", tmp);
        }
        getchar();
        return 0;
}



int vaild()
{
        unsigned int namelen;
        unsigned int keylen;
        unsigned char *pk;
        unsigned int k;
        unsigned int hash1 = 0;
        unsigned int hash2 = 0;
        unsigned int hash3 = 0;
        unsigned int hash4 = 0;
        float y;
        float y1;
        float y2;
        float y3;
        double x0;
        float x1;
        float x2;
        float x4;
        float *x;
        unsigned int *xx;
        unsigned int crc32;
        unsigned char *lpData;
        unsigned int i, j;
        unsigned int n;
        unsigned int sign;

        unsigned int crcTable[256];
        float xn, f, g, rg, result;
        unsigned int rem;
        unsigned int root;
        unsigned int divisor;
        unsigned int a;

        unsigned short *d;
        int B, C;

        unsigned int ddd[6];
        char szGood[12];

          namelen = strlen(name);
          keylen = strlen(key);
        if (namelen < 3 || namelen > 32 || keylen != 48)
        {
                return 6;
        }

        szGood[5] = 'c';

        for(i = 0; i < namelen; i++)
        {
                hash1 += hash1 * name[i] * (name[i] << 1) + hashkey1;
                hash2 += hash2 * name[i] * (name[i] >> 2) + hashkey2;
                hash3 += hash3 * name[i] * (name[i] << 3) + hashkey3;
                hash4 += hash4 * name[i] * (name[i] << 5) + hashkey4;
        }
        hash1 = ((hash1 & 0x00FFFFFF) ^ (unsigned int)0x3E000000);
        hash2 = ((hash2 & 0x00FFFFFF) ^ (unsigned int)0x3F000000);
        hash3 = ((hash3 & 0x00FFFFFF) ^ (unsigned int)0x40000000);

        szGood[7] = '!';
        
        for(i = 0; i < keylen; i+= 8)
                sscanf((char*)&key[i], "%08X", &ddd[i / 8]);

        szGood[8] = '\x0';

    for( i = 0; i < 256; i ++ )
        {
        crc32 = i;
        for( j = 0; j < 8; j ++ )
                {
            if(crc32 & 1) 
                                crc32 = (crc32 >> 1) ^ 0xEDB88320UL;
            else 
                                crc32 >>= 1;
        }
        crcTable[i] = crc32;
    }


        szGood[4] = 'e';
        crc32 = ~hash4;
        lpData = &ddd;

        for(i = 0; i < 24; i ++)
        {
                crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ lpData[i]) & 0xFF ];
        }
                
        szGood[3] = 'r';

        crc32 = ~crc32;

        for(i = 0; i < 6; i ++)
        {
                ddd[i] ^= crc32;
        }
        
        szGood[6] = 't';

        xx = (unsigned int*)&y2;

        y1 = 0.0;
        x0 = 1.0;
        y2 = x0;
        x1 = *(float*)&ddd[0];
        x2 = *(float*)&ddd[1];
        x4 = x1;
        for(i = 1; i <= 100000; i++)
        {
                sign = (x4 < 0);
                x4 = sign?(-x4):x4;
                n = (int) ((x4 * INVSPI) + 0.5);
                xn = (double) n;

                sign ^= n % 2;
                
                f = (x4 - xn * C1) - xn * C2;
                g = f * f;
                rg = (((R4 * g + R3) * g + R2) * g + R1) * g; 
                result = f + f * rg;
                result = sign ? -result : result;

                y1 += result / i;
                x0 *= x2;
                y2 += x0;
                x4 += x1;
        }
        x = (float*)&hash1;

        if(fabs(*x - y1) > EPLISON || fabs(y2 - *(float*)&hash2) > EPLISON)
        {
                szGood[1] = '\x0';
                return 3;
        }

        szGood[0] = 'C';

        x0 = 1.0;
        y3 = 0.0;
        x1 = *(float*)&ddd[2];
        x4 = x1;
        for(i = 1; i < 8000; i++)
        {
                x4 = (x4 > 0)?(x4):(-x4);
                n = (int) (((x4 + HALFPI) * INVSPI) + 0.5);   
                xn = (double)n - 0.5;
                sign = n % 2;
                f = (x4 - xn * C1) - xn * C2;
                g = f * f;
                rg = (((R4 * g + R3) * g + R2) * g + R1) * g;
                result = f + f * rg;     
                result =  sign ? -result : result;
                y3 += x0 * result / (i * i);
                x0 = -x0;
                x4 += x1;
        }
        y3 = y3 * 4 + PI * PI / 3 * 2;

        x = (float*)&hash3;
        if(fabs(*x - y3) > EPLISON)
        {
                szGood[0] = '\x0';
                return 1;
        }

        k = 0;
        szGood[1] = 'o';
        d = (unsigned short*)&ddd[4];
        
        for(i = 0; i < 4; i++)
        {
                B = (int)d[i];

                if(B >= 0x8000)
                {
                        B = (B * 2) & 0xFFFF;
                        C = B + 1;
                }
                else
                        C = B + 2;

                rem = 0;
                root = 0;
                divisor = 0;
                a = C * C - B * B;
                for(j = 0; j < 16; j++)
                {
                        root <<= 1;
                        rem = ((rem << 2) + (a >> 30));
                        a <<= 2;
                        divisor = (root << 1) + 1;
                        if(divisor <= rem)
                        {
                                rem -= divisor;
                                root ++;
                        }
                }
                k = k | ((unsigned char)(root - 3)) << (i * 8);
        }

        if(k == hash4)
        {
                szGood[2] = 'r';
                ;;;
                printf("%s", szGood);
                ;
        }
        ;
        return 2;
}

免费评分

参与人数 4热心值 +4 收起 理由
codelive + 1 感谢分享!
Sp4ce + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
蚯蚓翔龙 + 1 多谢分享出来
caijunqill + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2014-11-9 21:39
@Kido 比赛源代码按规则应该发布了,正好放到之前帖子里把。
头像被屏蔽
a1253960209 发表于 2014-11-9 22:09
caijunqill 发表于 2014-11-9 22:25
开始以为是易语言的,进来一看晕了,膜拜大神,求大神带我开挂,带我飞{:1_931:}
kindbigbear0 发表于 2014-11-9 22:28
好前排啊~~~~~~~第一次离大神这么近距离!!!!!!!!!好激动~
鬼魅王子 发表于 2014-11-9 22:48
我也是啊 楼上的
半世浮华 发表于 2014-11-9 22:58
大神牛XXX  沾神力
sodiseng 发表于 2014-11-9 23:06
学习了,简直膜拜
macfee 发表于 2014-11-10 10:30
我来支持楼这的实际行动
阿萨德22 发表于 2014-11-10 11:18
不明觉厉啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 16:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表