From 25f5049ab92a69951e920fe04d9a069579de143c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Wed, 2 Mar 2022 20:38:31 +0100 Subject: [PATCH] PDF DRM removing : Try to parse all objects wether they're or not in xref table --- src/libgourou.cpp | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/libgourou.cpp b/src/libgourou.cpp index 88a9a87..f8d2ecd 100644 --- a/src/libgourou.cpp +++ b/src/libgourou.cpp @@ -1091,16 +1091,18 @@ namespace gourou uPDFParser::Integer* ebxVersion; std::vector objects = parser.objects(); - std::vector::reverse_iterator it; + std::vector::iterator it; + std::vector::reverse_iterator rIt; unsigned char decryptedKey[RSA_KEY_SIZE]; - - for(it = objects.rbegin(); it != objects.rend(); it++) + int ebxId; + + for(rIt = objects.rbegin(); rIt != objects.rend(); rIt++) { // Update EBX_HANDLER with rights - if ((*it)->hasKey("Filter") && (**it)["Filter"]->str() == "/EBX_HANDLER") + if ((*rIt)->hasKey("Filter") && (**rIt)["Filter"]->str() == "/EBX_HANDLER") { EBXHandlerFound = true; - uPDFParser::Object* ebx = *it; + uPDFParser::Object* ebx = *rIt; ebxVersion = (uPDFParser::Integer*)(*ebx)["V"]; if (ebxVersion->value() != 4) @@ -1114,8 +1116,13 @@ namespace gourou } uPDFParser::String* licenseObject = (uPDFParser::String*)(*ebx)["ADEPT_LICENSE"]; + + std::string value = licenseObject->value(); + ByteArray zippedData = ByteArray::fromBase64(value); - ByteArray zippedData = ByteArray::fromBase64(licenseObject->value()); + if (zippedData.size() == 0) + EXCEPTION(DRM_ERR_ENCRYPTION_KEY, "Invalid ADEPT_LICENSE"); + ByteArray rightsStr; client->inflate(zippedData, rightsStr); @@ -1125,6 +1132,8 @@ namespace gourou std::string encryptedKey = extractTextElem(rightsDoc, "/adept:rights/licenseToken/encryptedKey"); decryptADEPTKey(encryptedKey, decryptedKey); + ebxId = ebx->objectId(); + break; } } @@ -1134,24 +1143,18 @@ namespace gourou EXCEPTION(DRM_ERR_ENCRYPTION_KEY, "EBX_HANDLER not found"); } - std::vector xrefTable = parser.xrefTable(); - std::vector::iterator xrefIt; - - for(xrefIt = xrefTable.begin(); xrefIt != xrefTable.end(); xrefIt++) + for(it = objects.begin(); it != objects.end(); it++) { - GOUROU_LOG(DEBUG, "XREF obj " << (*xrefIt).objectId() << " used " << (*xrefIt).used()); - - if (!(*xrefIt).used()) + uPDFParser::Object* object = *it; + + if (object->objectId() == ebxId) continue; - uPDFParser::Object* object = (*xrefIt).object(); - - if (!object) - { - GOUROU_LOG(DEBUG, "No object"); + if (object->hasKey("Type") && (*object)["Type"]->str() == "/XRef") continue; - } + GOUROU_LOG(DEBUG, "Obj " << object->objectId()); + unsigned char tmpKey[16]; generatePDFObjectKey(ebxVersion->value(), @@ -1197,7 +1200,7 @@ namespace gourou dictionary.replace(dictIt->first, dictIt->second); std::vector::iterator datasIt; - std::vector& datas = (*xrefIt).object()->data(); + std::vector& datas = object->data(); uPDFParser::Stream* stream; for (datasIt = datas.begin(); datasIt != datas.end(); datasIt++)