fix: using vector as mutable array

This commit is contained in:
TaurusXin 2024-01-06 10:15:26 +08:00
parent 6c39a38af6
commit 13aa156214
1 changed files with 32 additions and 56 deletions

View File

@ -45,13 +45,13 @@ static void aesEcbDecrypt(const unsigned char *key, std::string& src, std::strin
} }
static void replace(std::string& str, const std::string& from, const std::string& to) { static void replace(std::string& str, const std::string& from, const std::string& to) {
if(from.empty()) if(from.empty())
return; return;
size_t start_pos = 0; size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) { while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to); str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
} }
} }
NeteaseMusicMetadata::~NeteaseMusicMetadata() { NeteaseMusicMetadata::~NeteaseMusicMetadata() {
@ -107,12 +107,12 @@ NeteaseMusicMetadata::NeteaseMusicMetadata(cJSON* raw) {
} }
bool NeteaseCrypt::openFile(std::filesystem::path const& path) { bool NeteaseCrypt::openFile(std::filesystem::path const& path) {
mFile.open(path, std::ios::in | std::ios::binary); mFile.open(path, std::ios::in | std::ios::binary);
if (!mFile.is_open()) { if (!mFile.is_open()) {
return false; return false;
} else { } else {
return true; return true;
} }
} }
bool NeteaseCrypt::isNcmFile() { bool NeteaseCrypt::isNcmFile() {
@ -137,7 +137,7 @@ int NeteaseCrypt::read(char *s, std::streamsize n) {
int gcount = mFile.gcount(); int gcount = mFile.gcount();
if (gcount <= 0) { if (gcount <= 0) {
throw std::invalid_argument(" can't read file"); throw std::invalid_argument("Can't read file");
} }
return gcount; return gcount;
@ -219,38 +219,16 @@ void NeteaseCrypt::FixMetadata() {
} }
void NeteaseCrypt::Dump() { void NeteaseCrypt::Dump() {
int n, i;
// mDumpFilepath.clear();
// mDumpFilepath.resize(1024);
// if (mMetaData) {
// mDumpFilepath = mMetaData->name();
// replace(mDumpFilepath, "\\", "");
// replace(mDumpFilepath, "/", "");
// replace(mDumpFilepath, "?", "");
// replace(mDumpFilepath, ":", "");
// replace(mDumpFilepath, "*", "");
// replace(mDumpFilepath, "\"", "");
// replace(mDumpFilepath, "<", "");
// replace(mDumpFilepath, ">", "");
// replace(mDumpFilepath, "|", "");
// } else {
mDumpFilepath = mFilepath; mDumpFilepath = mFilepath;
// }
n = 0x8000; std::vector<unsigned char> buffer(0x8000);
i = 0;
unsigned char buffer[n];
std::ofstream output; std::ofstream output;
while (!mFile.eof()) { while (!mFile.eof()) {
n = read((char*)buffer, n); int n = read((char*)buffer.data(), buffer.size());
for (i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
int j = (i + 1) & 0xff; int j = (i + 1) & 0xff;
buffer[i] ^= mKeyBox[(mKeyBox[j] + mKeyBox[(mKeyBox[j] + j) & 0xff]) & 0xff]; buffer[i] ^= mKeyBox[(mKeyBox[j] + mKeyBox[(mKeyBox[j] + j) & 0xff]) & 0xff];
} }
@ -262,14 +240,14 @@ void NeteaseCrypt::Dump() {
mDumpFilepath.replace_extension(".mp3"); mDumpFilepath.replace_extension(".mp3");
mFormat = NeteaseCrypt::MP3; mFormat = NeteaseCrypt::MP3;
} else { } else {
mDumpFilepath.replace_extension(".flac"); mDumpFilepath.replace_extension(".flac");
mFormat = NeteaseCrypt::FLAC; mFormat = NeteaseCrypt::FLAC;
} }
output.open(mDumpFilepath, output.out | output.binary); output.open(mDumpFilepath, output.out | output.binary);
} }
output.write((char*)buffer, n); output.write((char*)buffer.data(), n);
} }
output.flush(); output.flush();
@ -286,36 +264,34 @@ NeteaseCrypt::~NeteaseCrypt() {
NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) { NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) {
if (!openFile(path)) { if (!openFile(path)) {
throw std::invalid_argument(" can't open file"); throw std::invalid_argument("Can't open file");
} }
if (!isNcmFile()) { if (!isNcmFile()) {
throw std::invalid_argument(" not netease protected file"); throw std::invalid_argument("Not netease protected file");
} }
if (!mFile.seekg(2, mFile.cur)) { if (!mFile.seekg(2, mFile.cur)) {
throw std::invalid_argument(" can't seek file"); throw std::invalid_argument("Can't seek file");
} }
mFilepath = path; mFilepath = path;
int i;
unsigned int n; unsigned int n;
read(reinterpret_cast<char *>(&n), sizeof(n)); read(reinterpret_cast<char *>(&n), sizeof(n));
if (n <= 0) { if (n <= 0) {
throw std::invalid_argument("broken ncm file"); throw std::invalid_argument("Broken NCM file");
} }
char keydata[n]; std::vector<char> keydata(n);
read(keydata, n); read(keydata.data(), n);
for (i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
keydata[i] ^= 0x64; keydata[i] ^= 0x64;
} }
std::string rawKeyData(keydata, n); std::string rawKeyData(keydata.begin(), keydata.end());
std::string mKeyData; std::string mKeyData;
aesEcbDecrypt(sCoreKey, rawKeyData, mKeyData); aesEcbDecrypt(sCoreKey, rawKeyData, mKeyData);
@ -329,10 +305,10 @@ NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) {
mMetaData = NULL; mMetaData = NULL;
} else { } else {
char modifyData[n]; std::vector<char> modifyData(n);
read(modifyData, n); read(modifyData.data(), n);
for (i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
modifyData[i] ^= 0x63; modifyData[i] ^= 0x63;
} }
@ -340,7 +316,7 @@ NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) {
std::string modifyOutData; std::string modifyOutData;
std::string modifyDecryptData; std::string modifyDecryptData;
swapModifyData = std::string(modifyData + 22, n - 22); swapModifyData = std::string(modifyData.begin() + 22, modifyData.end());
// escape `163 key(Don't modify):` // escape `163 key(Don't modify):`
Base64::Decode(swapModifyData, modifyOutData); Base64::Decode(swapModifyData, modifyOutData);