feat: book decryption

All credits go to gawgua for his work, tysm.
This commit is contained in:
2025-02-07 01:38:54 +07:00
parent 075a73145b
commit e61de79d31
15 changed files with 353 additions and 13 deletions

34
decypherer/.gitignore vendored Normal file
View File

@ -0,0 +1,34 @@
### C++ template
cmake-*/
.idea/
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app

View File

@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.30)
project(decypherer)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS -m32)
add_executable(decypherer main.cpp)

79
decypherer/main.cpp Normal file
View File

@ -0,0 +1,79 @@
// Again, this is ported C++ code from gawgua's original Python code.
// All credits go to him, I just used DeepSeek to convert it to C++.
#include <iostream>
#include <format>
#include <Windows.h>
#include <libloaderapi.h>
// MuPDF structure definition
struct pdf_write_options {
int do_incremental;
int do_pretty;
int do_ascii;
int do_compress;
int do_compress_images;
int do_compress_fonts;
int do_decompress;
int do_garbage;
int do_linear;
int do_clean;
int do_sanitize;
int do_appearance;
int do_encrypt;
int dont_regenerate_id;
int permissions;
char opwd_utf8[128];
char upwd_utf8[128];
int do_snapshot;
int do_preserve_metadata;
int do_use_objstms;
int compression_effort;
};
int main(const int argc, char* argv[])
{
if (argc < 3) {
std::cout << "usage: decypherer.exe <window id> <path> <output>" << std::endl;
return 0;
}
// Arg 1
auto window_id = argv[1];
// Arg 2
auto path = argv[2];
// Arg 3
const auto output = argv[3];
const HMODULE mupdf = LoadLibraryA("mupdf-exp-dll-x86.dll");
if (mupdf == nullptr) {
std::cout << "error: failed to load MuPDF library" << std::endl;
return 1;
}
// Define function pointers
const auto fz_new_context_imp = reinterpret_cast<void* (*)(void *, void *, unsigned int, const char *)>(GetProcAddress(mupdf, "fz_new_context_imp"));
const auto fz_register_document_handlers = reinterpret_cast<void* (*)(void *)>(GetProcAddress(mupdf, "fz_register_document_handlers"));
const auto fz_open_document_w = reinterpret_cast<void* (*)(void *, const wchar_t *)>(GetProcAddress(mupdf, "fz_open_document_w"));
const auto pdf_save_document = reinterpret_cast<void(*)(void *, void *, const char *, pdf_write_options *)>(GetProcAddress(mupdf, "pdf_save_document"));
// Build argument path
auto arg_path_str = std::format("#OCB#{}#{}", window_id, path);
const std::wstring arg_path(arg_path_str.begin(), arg_path_str.end());
// Create context
void* ctx = fz_new_context_imp(nullptr, nullptr, 268435456, "1.16.1");
fz_register_document_handlers(ctx);
// Open document
void* doc = fz_open_document_w(ctx, arg_path.c_str());
// Set save options
pdf_write_options opts = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, ~0,
{}, {}, 0, 0, 0, 0
};
// Save document
pdf_save_document(ctx, doc, output, &opts);
FreeLibraryAndExitThread(mupdf, 0);
}