RDot: White Hat Security Community

RDot: White Hat Security Community (https://rdot.org/forum/index.php)
-   Криптография/Cryptography (https://rdot.org/forum/forumdisplay.php?f=42)
-   -   Нужен Де-крипт файла лицензии (https://rdot.org/forum/showthread.php?t=3033)

adastmin 09.02.2014 09:12

Нужен Де-крипт файла лицензии
 
И так дорогие. Бьюсь с этим уже пол года.

Есть файл в котором по моему предположению с заголовка файла берется ип + дата-время все завернуто в пару шифрований.

Что удалось сделать. Удалось вот это, но пока не пойму за что отвечают другие функции(это собирательный образ как воспринимает файл программа):

Код:

void lookup_thread(void * lpParameter) {
        SoloEntry * pthis = static_cast<SoloEntry *>(lpParameter);
       
        // Open File
        _iobuf * fp = Port_FileOpen(pthis->GetLicense(), "rb");
        if (! fp ) {
                CORE_TRACE("(lookup_thread)license file not found");
                CORE_TRACE(pthis->GetLicense());
                return;
        };
       
        // Get File Size
        _fseek(fp, 0, 2);
        unsigned int file_size = _ftell(fp);
        _fseek(fp, 0, 0);
       
        CRYPTO_INFO data;
        _memset(&data, 0, sizeof(data));
       
        // Get Internal/External flag
        bool is_internal = file_size == sizeof(data) - sizeof(data.time);
       
        if ( is_internal ) {
                if ( _fread(&data, 1, sizeof(data) - sizeof(data.time), fp) != sizeof(data) - sizeof(data.time) ) {
                        CORE_TRACE("(lookup_thread)internal license file error");
                        CORE_TRACE(pthis->GetLicense());
                        _fclose(fp);
                        return;
                };
        } else {
                if ( _fread(&data, sizeof(data), 1, fp) != 1 ) {
                        CORE_TRACE("(lookup_thread)license file error");
                        CORE_TRACE(pthis->GetLicense());
                        _fclose(fp);
                        return;
                };
        };
        _fclose(fp);
       
        unsigned int sock = pthis->GetOuterListenSock();
        char addr[32];
        // Try to get Outer Socket Name
        if (! Port_SocketGetSockName(sock, addr, sizeof(addr), &port) ) {
                CORE_TRACE("(lookup_thread)network error");
                CORE_TRACE(pthis->GetLicense());
                return;
        };
       
        // Compare Outer Addr
        if ( _strcmp(pthis->GetOuterAddr(), addr) ) {
                CORE_TRACE("(lookup_thread)network address error");
                CORE_TRACE(pthis->GetLicense());
                return;
        };
       
        // Check for Internal Outer Addr
        if ( is_internal && _strcmp(addr, "127.0.0.1") && _memcmp(addr, "192.168.", 8) ) {
                CORE_TRACE("(lookup_thread)not internal address");
                CORE_TRACE(pthis->GetLicense());
                return;
        };
       
        // Prepare Key
        char key[32];
        _memset(key, 0xCC, sizeof(key));
        key = {0x77, 0x56, 0xD3, 0x34, 0x2B, 0x8C, 0xE2, 0x2F, 0xED, 0xAC, 0xB8, 0x15, 0x45, 0x9E, 0x5E, 0xC4};
        CopyString(&key[16], 16, addr);
        md5 alg = new md5();
        alg.Update(key, sizeof(key));
        alg.Finalize();
        unsigned char * res_key = alg.Digest();
        if (! is_internal ) {
                des2key(res_key, 1);
                unsigned char * source = data.time;
                D2des(source, source);
               
                // Decrypt Time data
               
                unsigned int * pTemp;
                pTemp = static_cast<unsigned int *>(&key[8]);
                pTemp[0] = data.nStartTime;
                pTemp = static_cast<unsigned int *>(&key[12]);
                pTemp[0] = data.nEndTime;
               
                alg.Update(key, sizeof(key));
                alg.Finalize();
                res_key = alg.Digest();
                des2key(res_key, 1);
        } else {
                des2key(res_key, 1);
        };

        // Decode Data
        unsigned char * source = static_cast<unsigned char *>(&data);
        for ( unsigned int i = 0; i < 16; i++ ) {
                D2des(source, source);
                source += 16;
        };
       
        // Calculate CheckSum
        unsigned int check_sum = 0;
        for ( unsigned int k = 0; k < sizeof(data.data); k++ ) {
                check_sum += data.data[k];
        };
       
        // If CheckSum OK
        if ( check_sum == data.nCheckSum ) {
                if (! is_internal ) {
                        // Check Licensed Period
                        pthis->m_nLicStartTime = data.nStartTime;
                        pthis->m_nLicEndTime = data.nEndTime;
                        if ( time(0) < data.nStartTime ) { // ************** TODO: FIXME **************
                                CORE_TRACE("(lookup_thread)license too young!");
                                return;
                        };
                        if ( time(0) > data.nEndTime ) { // ************** TODO: FIXME **************
                                CORE_TRACE("(lookup_thread)license too old!");
                                return;
                        };
                };
                pthis->m_nLicenseData0 = data.nLicenseData[0];
                pthis->m_nLicenseData1 = data.nLicenseData[1];
                pthis->m_nLicenseData2 = data.nLicenseData[2];
                pthis->m_nLicenseData3 = data.nLicenseData[3];
                pthis->m_nLicenseData4 = data.nLicenseData[4];
                pthis->m_nLicenseData5 = data.nLicenseData[5];
                pthis->m_nLicenseData6 = data.nLicenseData[6];
                pthis->m_nLicenseData7 = data.nLicenseData[7];
        };
};


Вот файлы лицензии http://rghost.ru/52301463

Их две штуки с разной информацией.

У кого есть свободное время попробуйте, расшифровать. И если получится сделать криптор-декриптор.


Часовой пояс GMT +3, время: 16:50.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot