From 8316384e8ce5c79ded405d690046fa801d93ebd2 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 28 Aug 2024 16:36:45 +0200 Subject: [IMP] Add driver signer, for ZKA drivers. Signed-off-by: Amlal El Mahrouss --- tools/compile_flags.txt | 1 + tools/drvsign | Bin 0 -> 80424 bytes tools/drvsign.cxx | 106 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/drvsign.json | 6 +++ 4 files changed, 113 insertions(+) create mode 100644 tools/compile_flags.txt create mode 100755 tools/drvsign create mode 100644 tools/drvsign.cxx create mode 100644 tools/drvsign.json (limited to 'tools') diff --git a/tools/compile_flags.txt b/tools/compile_flags.txt new file mode 100644 index 00000000..e23b2aef --- /dev/null +++ b/tools/compile_flags.txt @@ -0,0 +1 @@ +-std=c++20 diff --git a/tools/drvsign b/tools/drvsign new file mode 100755 index 00000000..093b4bc4 Binary files /dev/null and b/tools/drvsign differ diff --git a/tools/drvsign.cxx b/tools/drvsign.cxx new file mode 100644 index 00000000..28001208 --- /dev/null +++ b/tools/drvsign.cxx @@ -0,0 +1,106 @@ +/* + * Created on Thu Aug 22 09:29:13 CEST 2024 + * + * Copyright (c) 2024 ZKA Technologies + */ + +#include +#include +#include +#include +#include +#include + +#define kDriverSignedExt ".sigg" +#define kDriverExt ".sys" +#define kSignedDriverMagic "SIGG" + +namespace details +{ + struct SIGNED_DRIVER_HEADER final + { + // doesn't change. + char d_binary_magic[5]; + int d_binary_version; + // can change. + char d_binary_name[4096]; + std::uint64_t d_binary_checksum; + std::uint64_t d_binary_size; + char d_binary_padding[512]; + }; + + /***********************************************************************************/ + /* This handles the detection of a MZ header. */ + /***********************************************************************************/ + + bool drvsign_check_for_mz(std::string mz_blob) noexcept + { + return mz_blob[0] == 'M' && + mz_blob[1] == 'Z'; + } +} // namespace details + +/// @brief This program converts a PE32+ driver, into a custom format, the SIGG. +/// @note SIGG is used to tell that we're dealing with a ZKA driver. +int main(int argc, char* argv[]) +{ + for (size_t i = 1ul; i < argc; ++i) + { + if (strcmp(argv[i], "/?") == 0) + { + std::cout << "drvsign: ZKA Driver Signing Tool.\n"; + std::cout << "drvsign: © ZKA Technologies, all rights reserved.\n"; + + return 0; + } + } + + if (!std::filesystem::exists(argv[1]) || + !std::string(argv[1]).ends_with(kDriverExt)) + return -1; + + details::SIGNED_DRIVER_HEADER sig{0}; + + sig.d_binary_version = 1; + + memcpy(sig.d_binary_magic, kSignedDriverMagic, strlen(kSignedDriverMagic)); + memcpy(sig.d_binary_name, argv[1], strlen(argv[1])); + + sig.d_binary_size = std::filesystem::file_size(argv[1]); + + memset(sig.d_binary_padding, 0x00, 512); + + sig.d_binary_checksum = 0; + + std::string signed_path = argv[1]; + signed_path.erase(signed_path.find(kDriverExt), strlen(kDriverExt)); + signed_path += kDriverSignedExt; + + std::ofstream of_drv(signed_path, std::ios::binary); + std::ifstream if_drv(argv[1], std::ios::binary); + + std::stringstream ss; + ss << if_drv.rdbuf(); + + if (!details::drvsign_check_for_mz(ss.str())) + { + std::filesystem::remove(signed_path); + std::cout << "drvsign: Couldn't sign current driver, Input driver isn't a valid executable.\n"; + + return 1; + } + + for (auto ch : ss.str()) + { + sig.d_binary_checksum |= ch; + } + + sig.d_binary_checksum ^= sig.d_binary_size; + + of_drv.write((char*)&sig, sizeof(details::SIGNED_DRIVER_HEADER)); + of_drv.write(ss.str().c_str(), ss.str().size()); + + std::cout << "drvsign: Signing is done, quiting, here is the key: " << sig.d_binary_checksum << ".\n"; + + return 0; +} diff --git a/tools/drvsign.json b/tools/drvsign.json new file mode 100644 index 00000000..33bd4ea8 --- /dev/null +++ b/tools/drvsign.json @@ -0,0 +1,6 @@ +{ + "compiler_path": "g++", + "compiler_std": "c++20", + "sources_path": ["drvsign.cxx"], + "output_name": "drvsign" +} -- cgit v1.2.3