summaryrefslogtreecommitdiffhomepage
path: root/tools/src/make_zxd.cc
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-10-21 20:23:36 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-10-21 20:23:36 +0200
commitd48cbe75ef29a9c67c9d176bf58e56ea6448fb9e (patch)
tree89cbd6b7e23802f92bf3158868f4dc33c088e516 /tools/src/make_zxd.cc
parent21b3da78f806d6765f9dffa6a84c21346f171cee (diff)
IMP: Major refactor of header and source files extensions.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'tools/src/make_zxd.cc')
-rw-r--r--tools/src/make_zxd.cc72
1 files changed, 72 insertions, 0 deletions
diff --git a/tools/src/make_zxd.cc b/tools/src/make_zxd.cc
new file mode 100644
index 00000000..535b51db
--- /dev/null
+++ b/tools/src/make_zxd.cc
@@ -0,0 +1,72 @@
+/*
+ * Created on Thu Aug 22 09:29:13 CEST 2024
+ *
+ * Copyright (c) 2024 ZKA Web Services Co
+ */
+
+#include <zxd.h>
+
+/// @brief This program converts a PE32+ driver, into a custom format, the ZXD.
+/// @note ZXD is a format for ZKA signed drivers.
+int main(int argc, char* argv[])
+{
+ for (size_t i = 1ul; i < argc; ++i)
+ {
+ if (strcmp(argv[i], "/?") == 0)
+ {
+ std::cout << "make_zxd: ZXD Tool.\n";
+ std::cout << "make_zxd: © ZKA Web Services Co, all rights reserved.\n";
+
+ return 0;
+ }
+ }
+
+ if (!std::filesystem::exists(argv[1]) ||
+ !std::string(argv[1]).ends_with(kDriverExt))
+ return -1;
+
+ ZXD::ZXD_HEADER zxd_hdr{0};
+
+ zxd_hdr.d_binary_version = 1;
+
+ memcpy(zxd_hdr.d_binary_magic, kSignedDriverMagic, strlen(kSignedDriverMagic));
+ memcpy(zxd_hdr.d_binary_name, argv[1], strlen(argv[1]));
+
+ zxd_hdr.d_binary_size = std::filesystem::file_size(argv[1]);
+
+ memset(zxd_hdr.d_binary_padding, 0x00, 512);
+
+ zxd_hdr.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 (!ZXD::zxd_check_for_mz(ss.str()))
+ {
+ std::filesystem::remove(signed_path);
+ std::cout << "zxdmake: Couldn't sign current driver, Input driver isn't a valid executable.\n";
+
+ return 1;
+ }
+
+ for (auto ch : ss.str())
+ {
+ zxd_hdr.d_binary_checksum |= ch;
+ }
+
+ zxd_hdr.d_binary_checksum ^= zxd_hdr.d_binary_size;
+
+ of_drv.write((char*)&zxd_hdr, sizeof(ZXD::ZXD_HEADER));
+ of_drv.write(ss.str().c_str(), ss.str().size());
+
+ std::cout << "zxdmake: Signing is done, quiting, Checksum: " << zxd_hdr.d_binary_checksum << ".\n";
+
+ return 0;
+}