fix: incorrect str fmt
This commit is contained in:
@@ -112,6 +112,8 @@ std::string DBDCrypt::decType1(const std::string& data, const std::string& key,
|
||||
std::vector<uint8_t> body(decoded.begin() + 4, decoded.end());
|
||||
std::string decompressed = zlibDecompress(body);
|
||||
|
||||
if (decompressed.length() >= 2 && decompressed[1] == '\0') decompressed = utf16ToUtf8(decompressed);
|
||||
|
||||
if (decompressed.starts_with("DbdD")) return decrypt(decompressed, key, outType);
|
||||
return decompressed;
|
||||
}
|
||||
@@ -133,10 +135,11 @@ std::string DBDCrypt::decType2(const std::string& data, const std::string& key,
|
||||
for (char& c : decrypted)
|
||||
c = (char)((unsigned char)c + 1);
|
||||
|
||||
if (decrypted.length() >= 2 && decrypted[1] == '\0') decrypted = utf16ToUtf8(decrypted);
|
||||
|
||||
decrypted.erase(std::remove(decrypted.begin(), decrypted.end(), (char)0x01), decrypted.end());
|
||||
decrypted.erase(std::remove(decrypted.begin(), decrypted.end(), (char)0x00), decrypted.end());
|
||||
|
||||
|
||||
for (size_t offset : {0ULL, 4ULL})
|
||||
{
|
||||
if (offset + 1 < decrypted.size() && (unsigned char)decrypted[offset] == 0x78)
|
||||
@@ -175,6 +178,9 @@ std::string DBDCrypt::decType3(const std::string& data, const std::string& key,
|
||||
for (char& c : decrypted)
|
||||
c = (char)((unsigned char)c + 1);
|
||||
|
||||
if (decrypted.length() >= 2 && decrypted.at(1) == '\0')
|
||||
decrypted = utf16ToUtf8(decrypted);
|
||||
|
||||
decrypted.erase(std::remove(decrypted.begin(), decrypted.end(), (char)0x01), decrypted.end());
|
||||
decrypted.erase(std::remove(decrypted.begin(), decrypted.end(), (char)0x00), decrypted.end());
|
||||
|
||||
@@ -389,3 +395,28 @@ std::string DBDCrypt::shiftKeyID(const std::string& id, int shift)
|
||||
c = (char)((unsigned char)c + shift);
|
||||
return res;
|
||||
}
|
||||
|
||||
std::string DBDCrypt::utf16ToUtf8(const std::string& utf16)
|
||||
{
|
||||
if (utf16.empty()) return "";
|
||||
std::string utf8;
|
||||
for (size_t i = 0; i < utf16.length(); i += 2)
|
||||
{
|
||||
uint16_t cp = *(uint16_t*)(utf16.data() + i);
|
||||
if (cp == 0) break;
|
||||
if (cp < 0x80)
|
||||
utf8 += (char)cp;
|
||||
else if (cp < 0x800)
|
||||
{
|
||||
utf8 += (char)(0xC0 | (cp >> 6));
|
||||
utf8 += (char)(0x80 | (cp & 0x3F));
|
||||
}
|
||||
else
|
||||
{
|
||||
utf8 += (char)(0xE0 | (cp >> 12));
|
||||
utf8 += (char)(0x80 | ((cp >> 6) & 0x3F));
|
||||
utf8 += (char)(0x80 | (cp & 0x3F));
|
||||
}
|
||||
}
|
||||
return utf8;
|
||||
}
|
||||
|
||||
@@ -46,4 +46,6 @@ class DBDCrypt
|
||||
|
||||
static std::vector<uint8_t> transformCDNKey(const std::string& b64CDNKey);
|
||||
static std::string shiftKeyID(const std::string& id, int shift);
|
||||
static std::string utf16ToUtf8(const std::string& utf16);
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user