BOOL CYkc::DecodeYKG(CArcFile* pclArc) { SFileInfo* pstfiWork = pclArc->GetOpenFileInfo(); if (pstfiWork->format != _T("YKG")) return FALSE; // Read the YKG file YCMemory<BYTE> clmbtSrc(pstfiWork->sizeCmp); pclArc->Read(&clmbtSrc[0], pstfiWork->sizeCmp); if (memcmp(&clmbtSrc[0], "YKG000", 6) == 0) { // YKG000 // Fix the PNG header memcpy(&clmbtSrc[0x41], "PNG", 3); // Output pclArc->OpenFile(_T(".png")); pclArc->WriteFile(&clmbtSrc[0x40], pstfiWork->sizeCmp - 0x40); } else { // Other pclArc->OpenFile(); pclArc->WriteFile(&clmbtSrc[0], pstfiWork->sizeCmp); } return TRUE; }
BOOL CKatakoi::DecodeIar(CArcFile* pclArc) { if (pclArc->GetArcExten() != _T(".iar")) return FALSE; if (memcmp(pclArc->GetHed(), "iar ", 4) != 0) return FALSE; SFileInfo* pstfiWork = pclArc->GetOpenFileInfo(); // Reading YCMemory<BYTE> clmbtSrc(pstfiWork->sizeCmp); pclArc->Read(&clmbtSrc[0], pstfiWork->sizeCmp); // Output buffer DWORD dwDstSize = *(LPDWORD)&clmbtSrc[8]; YCMemory<BYTE> clmbtDst(dwDstSize * 2); // Decompression DecompImage(&clmbtDst[0], dwDstSize, &clmbtSrc[64], *(LPDWORD)&clmbtSrc[16]); long lWidth = *(LPLONG)&clmbtSrc[32]; long lHeight = *(LPLONG)&clmbtSrc[36]; WORD wBpp; switch (*(LPBYTE)&clmbtSrc[0]) { case 0x02: wBpp = 8; break; case 0x1C: wBpp = 24; break; case 0x3C: wBpp = 32; break; default: return FALSE; } BOOL bDiff = (*(LPBYTE)&clmbtSrc[1] == 8); if (bDiff) { // Difference file DecodeCompose(pclArc, &clmbtDst[0], dwDstSize, lWidth, lHeight, wBpp); } else { CImage image; image.Init(pclArc, lWidth, lHeight, wBpp); image.WriteReverse(&clmbtDst[0], dwDstSize); } return TRUE; }
BOOL CKatakoi::DecodeWar(CArcFile* pclArc) { if (pclArc->GetArcExten() != _T(".war")) return FALSE; if (memcmp(pclArc->GetHed(), "war ", 4) != 0) return FALSE; SFileInfo* pstfiWork = pclArc->GetOpenFileInfo(); // Reading YCMemory<BYTE> clmbtSrc(pstfiWork->sizeCmp); pclArc->Read(&clmbtSrc[0], pstfiWork->sizeCmp); if (memcmp(&clmbtSrc[0], "OggS", 4) == 0) { // Ogg Vorbis COgg ogg; ogg.Decode(pclArc, &clmbtSrc[0]); } else { // WAV(Supposedly) DWORD dwDataSize = *(LPDWORD)&clmbtSrc[4]; DWORD dwFreq = *(LPDWORD)&clmbtSrc[12]; WORD wChannels = *(LPWORD)&clmbtSrc[10]; WORD wBits = *(LPWORD)&clmbtSrc[22]; CWav wav; wav.Init(pclArc, dwDataSize, dwFreq, wChannels, wBits); wav.Write(&clmbtSrc[24]); } return TRUE; }
BOOL CYkc::DecodeYKS(CArcFile* pclArc) { SFileInfo* pstfiWork = pclArc->GetOpenFileInfo(); if (pstfiWork->format != _T("YKS")) return FALSE; // Read the YKS file YCMemory<BYTE> clmbtSrc(pstfiWork->sizeCmp); pclArc->Read(&clmbtSrc[0], pstfiWork->sizeCmp); if (memcmp(&clmbtSrc[0], "YKS001", 6) == 0) { // YKS001 // Get the offset of the text portion DWORD dwTextOffset = *(LPDWORD)&clmbtSrc[0x20]; // Decode the text portion for (DWORD i = dwTextOffset; i < pstfiWork->sizeCmp; i++) { clmbtSrc[i] ^= 0xAA; } // Output pclArc->OpenScriptFile(); pclArc->WriteFile(&clmbtSrc[0], pstfiWork->sizeCmp); } else { // Other pclArc->OpenFile(); pclArc->WriteFile(&clmbtSrc[0], pstfiWork->sizeCmp); } return TRUE; }
/// 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; }