From 3fe82665013a719e68b966759abc4c5e23f06a76 Mon Sep 17 00:00:00 2001 From: Syping Date: Sun, 25 Oct 2020 02:54:22 +0200 Subject: [PATCH] plugin support --- CMakeLists.txt | 4 ++++ src/brutethread.cpp | 3 ++- src/checkbrute.h | 26 ++++++++++++++++++++++++ src/checksum_lib.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++ src/checksum_lib.h | 44 ++++++++++++++++++++++++++++++++++++++++ src/checksum_qt.cpp | 2 +- src/checksum_qt.h | 2 +- src/main.cpp | 44 ++++++++++++++++++++++++++++++++++------ 8 files changed, 164 insertions(+), 9 deletions(-) create mode 100644 src/checkbrute.h create mode 100644 src/checksum_lib.cpp create mode 100644 src/checksum_lib.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 08ce949..dd7be16 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,13 +18,16 @@ set(CHECKBRUTE_SOURCES src/mainthread.cpp src/brutethread.cpp src/checksum.cpp + src/checksum_lib.cpp src/checksum_qt.cpp ) set(CHECKBRUTE_HEADERS src/mainthread.h src/brutethread.h + src/checkbrute.h src/checksum.h + src/checksum_lib.h src/checksum_qt.h ) @@ -33,6 +36,7 @@ add_executable(checkbrute ${CHECKBRUTE_SOURCES} ) +target_compile_definitions(checkbrute PRIVATE "CHECKBRUTE_PLUGINS=\"${CMAKE_INSTALL_PREFIX}/share/checkbrute/plugins\"") target_link_libraries(checkbrute PRIVATE Qt5::Core) install(TARGETS checkbrute DESTINATION bin) diff --git a/src/brutethread.cpp b/src/brutethread.cpp index a821d2e..13e0beb 100644 --- a/src/brutethread.cpp +++ b/src/brutethread.cpp @@ -16,6 +16,7 @@ * responsible for anything with use of the software, you are self responsible. *****************************************************************************/ +#include #include #include "brutethread.h" @@ -27,7 +28,7 @@ void brutethread::run() for (quint64 seek = 0; seek + length < size; seek++) { for (checksum *generator : checksum_vector) { const QByteArray content = fileContent.mid(seek, length); - const QByteArray generatedHash = generator->generateChecksum(content).toHex(); + const QByteArray generatedHash = generator->generateChecksum(content); for (const QByteArray &hash : checksums) { if (!strictMatch && generatedHash.left(hash.length()) == hash) { QTextStream(stdout) << "MATCH: " << generator->formatName() << " Checksum " << hash << " Start " << seek << " End " << seek+length << Qt::endl; diff --git a/src/checkbrute.h b/src/checkbrute.h new file mode 100644 index 0000000..dbfb3bb --- /dev/null +++ b/src/checkbrute.h @@ -0,0 +1,26 @@ +/***************************************************************************** +* checkbrute Checksum Bruteforcing Tool +* Copyright (C) 2020 Syping +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* This software is provided as-is, no warranties are given to you, we are not +* responsible for anything with use of the software, you are self responsible. +*****************************************************************************/ + +#ifndef CHECKBRUTE_H +#define CHECKBRUTE_H + +#ifndef CHECKBRUTE_PLUGINS +#define CHECKBRUTE_PLUGINS "/usr/local/share/checkbrute/plugins" +#endif + +#endif // CHECKBRUTE_H diff --git a/src/checksum_lib.cpp b/src/checksum_lib.cpp new file mode 100644 index 0000000..c929fe5 --- /dev/null +++ b/src/checksum_lib.cpp @@ -0,0 +1,48 @@ +/***************************************************************************** +* checkbrute Checksum Bruteforcing Tool +* Copyright (C) 2020 Syping +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* This software is provided as-is, no warranties are given to you, we are not +* responsible for anything with use of the software, you are self responsible. +*****************************************************************************/ + +#include "checksum_lib.h" +#include +#include +#include + +checksum_lib::checksum_lib(PluginFormatFunction formatFunc, PluginHash64Function hash64Func, PluginHashSzFunction hashSzFunc) : hash64Func(hash64Func) +{ + p_formatName = QString::fromUtf8(formatFunc()); + p_checksumSize = hashSzFunc(); +} + +QByteArray checksum_lib::generateChecksum(const QByteArray &data) +{ + const size_t size = data.size(); + unsigned char *udata = new unsigned char[size]; + std::memcpy(udata, data.constData(), size); + const u_int64_t hash = hash64Func(udata, size); + free(udata); + return QByteArray::number((quint64)hash, 16); +} + +const QString checksum_lib::formatName() +{ + return p_formatName; +} + +int checksum_lib::checksumSize() +{ + return p_checksumSize; +} diff --git a/src/checksum_lib.h b/src/checksum_lib.h new file mode 100644 index 0000000..ea6bd22 --- /dev/null +++ b/src/checksum_lib.h @@ -0,0 +1,44 @@ +/***************************************************************************** +* checkbrute Checksum Bruteforcing Tool +* Copyright (C) 2020 Syping +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* This software is provided as-is, no warranties are given to you, we are not +* responsible for anything with use of the software, you are self responsible. +*****************************************************************************/ + +#ifndef CHECKSUM_LIB_H +#define CHECKSUM_LIB_H + +#include "checksum.h" + +typedef int (*PluginHashSzFunction)(); +typedef const char* (*PluginFormatFunction)(); +typedef const char* (*PluginVersionFunction)(); +typedef u_int64_t (*PluginHash64Function)(unsigned char*, size_t); + +class checksum_lib : public checksum +{ + Q_OBJECT +public: + explicit checksum_lib(PluginFormatFunction formatFunc, PluginHash64Function hash64Func, PluginHashSzFunction hashSzFunc); + QByteArray generateChecksum(const QByteArray &data); + const QString formatName(); + int checksumSize(); + +private: + PluginHash64Function hash64Func; + QString p_formatName; + int p_checksumSize; +}; + +#endif // CHECKSUM_LIB_H diff --git a/src/checksum_qt.cpp b/src/checksum_qt.cpp index 7c69284..fdcd560 100644 --- a/src/checksum_qt.cpp +++ b/src/checksum_qt.cpp @@ -23,7 +23,7 @@ checksum_qt::checksum_qt(QCryptographicHash::Algorithm algorithm, const QString QByteArray checksum_qt::generateChecksum(const QByteArray &data) { - return QCryptographicHash::hash(data, algorithm); + return QCryptographicHash::hash(data, algorithm).toHex(); } const QString checksum_qt::formatName() diff --git a/src/checksum_qt.h b/src/checksum_qt.h index 95a58f0..3fdd03c 100644 --- a/src/checksum_qt.h +++ b/src/checksum_qt.h @@ -36,4 +36,4 @@ private: QString name; }; -#endif // CHECKSUM_MD5_H +#endif // CHECKSUM_QT5_H diff --git a/src/main.cpp b/src/main.cpp index a85a050..5eb42ac 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,17 +22,21 @@ #include #include #include +#include #include +#include // checkbrute includes #include "mainthread.h" +#include "checkbrute.h" #include "checksum_qt.h" +#include "checksum_lib.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); a.setApplicationName("checkbrute"); - a.setApplicationVersion("0.1.1"); + a.setApplicationVersion("0.2"); QCommandLineParser commandLineParser; commandLineParser.addHelpOption(); @@ -85,11 +89,11 @@ int main(int argc, char *argv[]) std::map checksum_map; checksum_map["MD4"] = new checksum_qt(QCryptographicHash::Md4, "MD4"); checksum_map["MD5"] = new checksum_qt(QCryptographicHash::Md5, "MD5"); - checksum_map["SHA1"] = new checksum_qt(QCryptographicHash::Sha1, "SHA1"); - checksum_map["SHA2-224"] = new checksum_qt(QCryptographicHash::Sha224, "SHA2-224"); - checksum_map["SHA2-256"] = new checksum_qt(QCryptographicHash::Sha256, "SHA2-256"); - checksum_map["SHA2-384"] = new checksum_qt(QCryptographicHash::Sha384, "SHA2-384"); - checksum_map["SHA2-512"] = new checksum_qt(QCryptographicHash::Sha512, "SHA2-512"); + checksum_map["SHA-1"] = new checksum_qt(QCryptographicHash::Sha1, "SHA-1"); + checksum_map["SHA-224"] = new checksum_qt(QCryptographicHash::Sha224, "SHA-224"); + checksum_map["SHA-256"] = new checksum_qt(QCryptographicHash::Sha256, "SHA-256"); + checksum_map["SHA-384"] = new checksum_qt(QCryptographicHash::Sha384, "SHA-384"); + checksum_map["SHA-512"] = new checksum_qt(QCryptographicHash::Sha512, "SHA-512"); checksum_map["SHA3-224"] = new checksum_qt(QCryptographicHash::Sha3_224, "SHA3-224"); checksum_map["SHA3-256"] = new checksum_qt(QCryptographicHash::Sha3_256, "SHA3-256"); checksum_map["SHA3-384"] = new checksum_qt(QCryptographicHash::Sha3_384, "SHA3-384"); @@ -101,6 +105,34 @@ int main(int argc, char *argv[]) checksum_map["Keccak-512"] = new checksum_qt(QCryptographicHash::Keccak_512, "Keccak-512"); #endif + for (const QString &fileName : QDir(CHECKBRUTE_PLUGINS).entryList(QDir::Files, QDir::Name)) { + const QString filePath = QString("%1/%2").arg(CHECKBRUTE_PLUGINS, fileName); + if (QLibrary::isLibrary(filePath)) { + QTextStream(stderr) << "INFO: Load plugin " << fileName << "..." << Qt::endl; + QLibrary plugin(filePath); + if (plugin.load()) { + PluginHash64Function hash64Func = (PluginHash64Function)plugin.resolve("checkbrute_hash64"); + PluginHashSzFunction hashSzFunc = (PluginHashSzFunction)plugin.resolve("checkbrute_hashsz"); + PluginFormatFunction formatFunc = (PluginFormatFunction)plugin.resolve("checkbrute_format"); + PluginVersionFunction versionFunc = (PluginVersionFunction)plugin.resolve("checkbrute_version"); + if (formatFunc && hash64Func && hashSzFunc) { + QString version = "undefined"; + const char *format = formatFunc(); + if (versionFunc) + version = QString::fromUtf8(versionFunc()); + checksum_map[format] = new checksum_lib(formatFunc, hash64Func, hashSzFunc); + QTextStream(stderr) << "INFO: " << format << " Plugin " << fileName << " loaded" << Qt::endl; + } + else { + QTextStream(stderr) << "WARNING: Failed loading plugin " << fileName << "!" << Qt::endl; + } + } + else { + QTextStream(stderr) << "WARNING: Failed loading plugin " << fileName << "!" << Qt::endl; + } + } + } + mainthread instance(bruteforceFile, checksumsFile, algorithms, start, stop, lengths, threads, strictHash, checksum_map); QObject::connect(&instance, &mainthread::finished, &a, &QCoreApplication::quit); if (!instance.isInitialised())