plugin support
This commit is contained in:
parent
aa3efb449f
commit
3fe8266501
8 changed files with 164 additions and 9 deletions
|
@ -18,13 +18,16 @@ set(CHECKBRUTE_SOURCES
|
||||||
src/mainthread.cpp
|
src/mainthread.cpp
|
||||||
src/brutethread.cpp
|
src/brutethread.cpp
|
||||||
src/checksum.cpp
|
src/checksum.cpp
|
||||||
|
src/checksum_lib.cpp
|
||||||
src/checksum_qt.cpp
|
src/checksum_qt.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(CHECKBRUTE_HEADERS
|
set(CHECKBRUTE_HEADERS
|
||||||
src/mainthread.h
|
src/mainthread.h
|
||||||
src/brutethread.h
|
src/brutethread.h
|
||||||
|
src/checkbrute.h
|
||||||
src/checksum.h
|
src/checksum.h
|
||||||
|
src/checksum_lib.h
|
||||||
src/checksum_qt.h
|
src/checksum_qt.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -33,6 +36,7 @@ add_executable(checkbrute
|
||||||
${CHECKBRUTE_SOURCES}
|
${CHECKBRUTE_SOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(checkbrute PRIVATE "CHECKBRUTE_PLUGINS=\"${CMAKE_INSTALL_PREFIX}/share/checkbrute/plugins\"")
|
||||||
target_link_libraries(checkbrute PRIVATE Qt5::Core)
|
target_link_libraries(checkbrute PRIVATE Qt5::Core)
|
||||||
|
|
||||||
install(TARGETS checkbrute DESTINATION bin)
|
install(TARGETS checkbrute DESTINATION bin)
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* responsible for anything with use of the software, you are self responsible.
|
* responsible for anything with use of the software, you are self responsible.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include "brutethread.h"
|
#include "brutethread.h"
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ void brutethread::run()
|
||||||
for (quint64 seek = 0; seek + length < size; seek++) {
|
for (quint64 seek = 0; seek + length < size; seek++) {
|
||||||
for (checksum *generator : checksum_vector) {
|
for (checksum *generator : checksum_vector) {
|
||||||
const QByteArray content = fileContent.mid(seek, length);
|
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) {
|
for (const QByteArray &hash : checksums) {
|
||||||
if (!strictMatch && generatedHash.left(hash.length()) == hash) {
|
if (!strictMatch && generatedHash.left(hash.length()) == hash) {
|
||||||
QTextStream(stdout) << "MATCH: " << generator->formatName() << " Checksum " << hash << " Start " << seek << " End " << seek+length << Qt::endl;
|
QTextStream(stdout) << "MATCH: " << generator->formatName() << " Checksum " << hash << " Start " << seek << " End " << seek+length << Qt::endl;
|
||||||
|
|
26
src/checkbrute.h
Normal file
26
src/checkbrute.h
Normal file
|
@ -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
|
48
src/checksum_lib.cpp
Normal file
48
src/checksum_lib.cpp
Normal file
|
@ -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 <iostream>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
44
src/checksum_lib.h
Normal file
44
src/checksum_lib.h
Normal file
|
@ -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
|
|
@ -23,7 +23,7 @@ checksum_qt::checksum_qt(QCryptographicHash::Algorithm algorithm, const QString
|
||||||
|
|
||||||
QByteArray checksum_qt::generateChecksum(const QByteArray &data)
|
QByteArray checksum_qt::generateChecksum(const QByteArray &data)
|
||||||
{
|
{
|
||||||
return QCryptographicHash::hash(data, algorithm);
|
return QCryptographicHash::hash(data, algorithm).toHex();
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString checksum_qt::formatName()
|
const QString checksum_qt::formatName()
|
||||||
|
|
|
@ -36,4 +36,4 @@ private:
|
||||||
QString name;
|
QString name;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CHECKSUM_MD5_H
|
#endif // CHECKSUM_QT5_H
|
||||||
|
|
44
src/main.cpp
44
src/main.cpp
|
@ -22,17 +22,21 @@
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
#include <QLibrary>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
// checkbrute includes
|
// checkbrute includes
|
||||||
#include "mainthread.h"
|
#include "mainthread.h"
|
||||||
|
#include "checkbrute.h"
|
||||||
#include "checksum_qt.h"
|
#include "checksum_qt.h"
|
||||||
|
#include "checksum_lib.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QCoreApplication a(argc, argv);
|
QCoreApplication a(argc, argv);
|
||||||
a.setApplicationName("checkbrute");
|
a.setApplicationName("checkbrute");
|
||||||
a.setApplicationVersion("0.1.1");
|
a.setApplicationVersion("0.2");
|
||||||
|
|
||||||
QCommandLineParser commandLineParser;
|
QCommandLineParser commandLineParser;
|
||||||
commandLineParser.addHelpOption();
|
commandLineParser.addHelpOption();
|
||||||
|
@ -85,11 +89,11 @@ int main(int argc, char *argv[])
|
||||||
std::map<std::string,checksum*> checksum_map;
|
std::map<std::string,checksum*> checksum_map;
|
||||||
checksum_map["MD4"] = new checksum_qt(QCryptographicHash::Md4, "MD4");
|
checksum_map["MD4"] = new checksum_qt(QCryptographicHash::Md4, "MD4");
|
||||||
checksum_map["MD5"] = new checksum_qt(QCryptographicHash::Md5, "MD5");
|
checksum_map["MD5"] = new checksum_qt(QCryptographicHash::Md5, "MD5");
|
||||||
checksum_map["SHA1"] = new checksum_qt(QCryptographicHash::Sha1, "SHA1");
|
checksum_map["SHA-1"] = new checksum_qt(QCryptographicHash::Sha1, "SHA-1");
|
||||||
checksum_map["SHA2-224"] = new checksum_qt(QCryptographicHash::Sha224, "SHA2-224");
|
checksum_map["SHA-224"] = new checksum_qt(QCryptographicHash::Sha224, "SHA-224");
|
||||||
checksum_map["SHA2-256"] = new checksum_qt(QCryptographicHash::Sha256, "SHA2-256");
|
checksum_map["SHA-256"] = new checksum_qt(QCryptographicHash::Sha256, "SHA-256");
|
||||||
checksum_map["SHA2-384"] = new checksum_qt(QCryptographicHash::Sha384, "SHA2-384");
|
checksum_map["SHA-384"] = new checksum_qt(QCryptographicHash::Sha384, "SHA-384");
|
||||||
checksum_map["SHA2-512"] = new checksum_qt(QCryptographicHash::Sha512, "SHA2-512");
|
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-224"] = new checksum_qt(QCryptographicHash::Sha3_224, "SHA3-224");
|
||||||
checksum_map["SHA3-256"] = new checksum_qt(QCryptographicHash::Sha3_256, "SHA3-256");
|
checksum_map["SHA3-256"] = new checksum_qt(QCryptographicHash::Sha3_256, "SHA3-256");
|
||||||
checksum_map["SHA3-384"] = new checksum_qt(QCryptographicHash::Sha3_384, "SHA3-384");
|
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");
|
checksum_map["Keccak-512"] = new checksum_qt(QCryptographicHash::Keccak_512, "Keccak-512");
|
||||||
#endif
|
#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);
|
mainthread instance(bruteforceFile, checksumsFile, algorithms, start, stop, lengths, threads, strictHash, checksum_map);
|
||||||
QObject::connect(&instance, &mainthread::finished, &a, &QCoreApplication::quit);
|
QObject::connect(&instance, &mainthread::finished, &a, &QCoreApplication::quit);
|
||||||
if (!instance.isInitialised())
|
if (!instance.isInitialised())
|
||||||
|
|
Loading…
Reference in a new issue