Esempio n. 1
0
/// Decode
///
/// @param archive Archive
///
bool CPaz::Decode(CArcFile* archive)
{
	if (archive->GetArcExten() != _T(".paz"))
		return false;

	// Initialize decryption key
	InitDecodeKey(archive);

	// Initialize Table
	InitTable();

	// Decrypt table
	DecodeTable1();
	DecodeTable2();

	// Create output file
	const SFileInfo* file_info = archive->GetOpenFileInfo();

	if (lstrcmpi(PathFindExtension(file_info->name), _T(".sc")) == 0)
	{
		archive->OpenScriptFile();
	}
	else
	{
		archive->OpenFile();
	}

	// Output

	if (file_info->format == _T("zlib"))
	{
		// ZLIB
		std::vector<u8> src(file_info->sizeCmp);
		std::vector<u8> dst(file_info->sizeOrg);

		// Decrypt
		archive->Read(src.data(), src.size());
		Decrypt(src.data(), src.size());
		DecodeData(src.data(), src.size());
		Decrypt2(src.data(), src.size());

		// Decompress
		CZlib zlib;
		zlib.Decompress(dst.data(), dst.size(), src.data(), src.size());

		// Output
		archive->WriteFile(dst.data(), dst.size());
	}
	else
	{
		if (archive->GetArcName() == _T("mov.paz"))
		{
			// Movie
			size_t buffer_size = GetMovieBufSize(archive);
			std::vector<u8> buffer(buffer_size);

			for (size_t total_written = 0; total_written != file_info->sizeOrg; total_written += buffer_size)
			{
				// Get buffer size
				archive->SetBufSize(&buffer_size, total_written, file_info->dwSizeOrg2);

				// Read
				archive->Read(buffer.data(), buffer_size);

				// Decrypt
				Decrypt(buffer.data(), buffer_size);
				DecodeMovieData(buffer.data(), buffer_size);
				Decrypt2(buffer.data(), buffer_size);

				// Adjust buffer size
				archive->SetBufSize(&buffer_size, total_written, file_info->sizeOrg);

				// Write
				archive->WriteFile(buffer.data(), buffer_size);
			}
		}
		else
		{
			// Other data
			size_t buffer_size = archive->GetBufSize();
			std::vector<u8> buffer(buffer_size);

			for (size_t total_written = 0; total_written != file_info->sizeOrg; total_written += buffer_size)
			{
				// Adjust buffer size
				archive->SetBufSize(&buffer_size, total_written, file_info->dwSizeOrg2);

				// Read
				archive->Read(buffer.data(), buffer_size);

				// Decrypt
				Decrypt(buffer.data(), buffer_size);
				DecodeData(buffer.data(), buffer_size);
				Decrypt2(buffer.data(), buffer_size);

				// Adjust buffer size
				archive->SetBufSize(&buffer_size, total_written, file_info->sizeOrg);

				// Write
				archive->WriteFile(buffer.data(), buffer_size);
			}
		}
	}

	return true;
}
Esempio n. 2
0
/// Decode
///
/// @param pclArc Archive
///
BOOL CPaz::Decode(CArcFile* pclArc)
{
    if (pclArc->GetArcExten() != _T(".paz"))
        return FALSE;

    // Initialize decryption key
    InitDecodeKey(pclArc);

    // Initialize Table
    InitTable();

    // Decrypt table
    DecodeTable1();
    DecodeTable2();

    // Create output file
    SFileInfo* pstFileInfo = pclArc->GetOpenFileInfo();

    if (lstrcmpi(PathFindExtension(pstFileInfo->name), _T(".sc")) == 0)
    {
        pclArc->OpenScriptFile();
    }
    else
    {
        pclArc->OpenFile();
    }

    // Output

    if (pstFileInfo->format == _T("zlib"))
    {
        // ZLIB

        DWORD dwSrcSize = pstFileInfo->sizeCmp;
        DWORD dwDstSize = pstFileInfo->sizeOrg;

        YCMemory<BYTE> clmbtSrc(dwSrcSize);
        YCMemory<BYTE> clmbtDst(dwDstSize);

        // Decrypt
        pclArc->Read(&clmbtSrc[0], dwSrcSize);
        Decrypt(&clmbtSrc[0], dwSrcSize);
        DecodeData(&clmbtSrc[0], dwSrcSize);
        Decrypt2(&clmbtSrc[0], dwSrcSize);

        // Decompress
        CZlib clZlib;
        clZlib.Decompress(&clmbtDst[0], dwDstSize, &clmbtSrc[0], dwSrcSize);

        // Output
        pclArc->WriteFile(&clmbtDst[0], dwDstSize);
    }
    else
    {
        if (pclArc->GetArcName() == _T("mov.paz"))
        {
            // Movie
            DWORD dwBufferSize = GetMovieBufSize(pclArc);
            YCMemory<BYTE> clmbtBuffer(dwBufferSize);

            for (DWORD dwWriteTotal = 0; dwWriteTotal != pstFileInfo->sizeOrg; dwWriteTotal += dwBufferSize)
            {
                // Get buffer size
                pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->dwSizeOrg2);

                // Read
                pclArc->Read(&clmbtBuffer[0], dwBufferSize);

                // Decrypt
                Decrypt(&clmbtBuffer[0], dwBufferSize);
                DecodeMovieData(&clmbtBuffer[0], dwBufferSize);
                Decrypt2(&clmbtBuffer[0], dwBufferSize);

                // Adjust buffer size
                pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->sizeOrg);

                // Write
                pclArc->WriteFile(&clmbtBuffer[0], dwBufferSize);
            }
        }
        else
        {
            // Other data

            DWORD dwBufferSize = pclArc->GetBufSize();

            YCMemory<BYTE> clmbtBuffer(dwBufferSize);

            for (DWORD dwWriteTotal = 0; dwWriteTotal != pstFileInfo->sizeOrg; dwWriteTotal += dwBufferSize)
            {
                // Adjust buffer size
                pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->dwSizeOrg2);

                // Read
                pclArc->Read(&clmbtBuffer[0], dwBufferSize);

                // Decrypt
                Decrypt(&clmbtBuffer[0], dwBufferSize);
                DecodeData(&clmbtBuffer[0], dwBufferSize);
                Decrypt2(&clmbtBuffer[0], dwBufferSize);

                // Adjust buffer size
                pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->sizeOrg);

                // Write
                pclArc->WriteFile(&clmbtBuffer[0], dwBufferSize);
            }
        }
    }

    return TRUE;
}