XORでジャミング済みのPNGファイルを読み込む
XORでbitshiftさせたPNGをcocos2d-x側で読み込む際にデコードする。
PNGの処理については割愛
# cocos/platform/CCImage.h # # XOR_SEED と XOR_SEED_CNT は任意の値 # const char* XOR_SEED = "ABCDE12345"; const int XOR_SEED_CNT = 10; # cocos/platform/CCImage.cpp line 515 # # 画像データを扱うImage関数 (cocos2d-x 3.13) # # bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen) { bool ret = false; do { CC_BREAK_IF(! data || dataLen <= 0); unsigned char* unpackedData = nullptr; ssize_t unpackedLen = 0; //detect and unzip the compress file if (ZipUtils::isCCZBuffer(data, dataLen)) { unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData); } else if (ZipUtils::isGZipBuffer(data, dataLen)) { unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData); } else { unpackedData = const_cast<unsigned char*>(data); unpackedLen = dataLen; } _fileType = detectFormat(unpackedData, unpackedLen); switch (_fileType) { case Format::PNG: ret = initWithPngData(unpackedData, unpackedLen); break; case Format::JPG: ret = initWithJpgData(unpackedData, unpackedLen); break; case Format::TIFF: ret = initWithTiffData(unpackedData, unpackedLen); break; case Format::WEBP: ret = initWithWebpData(unpackedData, unpackedLen); break; case Format::PVR: ret = initWithPVRData(unpackedData, unpackedLen); break; case Format::ETC: ret = initWithETCData(unpackedData, unpackedLen); break; case Format::S3TC: ret = initWithS3TCData(unpackedData, unpackedLen); break; case Format::ATITC: ret = initWithATITCData(unpackedData, unpackedLen); break; default: { // ここから ------------------------------------------- // XOR/PNG int ci = XOR_SEED_CNT; unpackedData = const_cast<unsigned char*>(data); for (int i = 0; i < unpackedLen; i++) { int idx = i % ci; int key = XOR_SEED[idx] % 256; unpackedData[i] = unpackedData[i] ^ key; } _fileType = detectFormat(unpackedData, unpackedLen); // if (_fileType == Format::PNG) { ret = initWithPngData(unpackedData, unpackedLen); break; } // ここまで --------------------------------------------- // load and detect image format tImageTGA* tgaData = tgaLoadBuffer(unpackedData, unpackedLen); if (tgaData != nullptr && tgaData->status == TGA_OK) { ret = initWithTGAData(tgaData); } else { CCLOG("cocos2d: unsupported image format!"); } free(tgaData); break; } } if(unpackedData != data) { free(unpackedData); } } while (0); return ret; }