#include #include #include #include #include #include #include #include #pragma GCC diagnostic ignored "-Wattributes" #include #include using namespace std; namespace fs = std::filesystem; string get_uuid() { static random_device dev; static mt19937 rng(dev()); uniform_int_distribution dist(0, 15); const char *v = "0123456789abcdef"; const bool dash[] = { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0 }; string res; for (int i = 0; i < 16; i++) { if (dash[i]) res += "-"; res += v[dist(rng)]; res += v[dist(rng)]; } return res; } // DATA // DATA_LENGTHS // DATA_NAMES // DATA_COUNT // DATA_EXEC_AFTER // DATA_EXEC_AFTER_HASH #include "file.h" #define SHA256_SIZE 32 bool verify_hash() { return (!DATA_EXEC_AFTER || sha256::compute((const uint8_t*)DATA_EXEC_AFTER, strlen(DATA_EXEC_AFTER)) == DATA_EXEC_AFTER_HASH); } array data_hash_i(int index) { array output; auto pointer = DATA_HASHES + (index*SHA256_SIZE); static_assert(output.size() == SHA256_SIZE); memcpy(output.data(), pointer, SHA256_SIZE); return output; } bool verify_hash(int hash_i, const unsigned char* data, size_t len) { #ifdef DATA_HASHED return sha256::compute((const uint8_t*)data, len) == data_hash_i(hash_i); #else return true; #endif } string arg_vec_int(int i) { stringstream ss; ss << "%arg\\[" << i << "\\]"; return ss.str(); } string get_exec_str(vector args, string args_full, string loc) { string str(DATA_EXEC_AFTER); str = regex_replace(str, std::regex("%location"), loc); str = regex_replace(str, std::regex("%argc"), std::to_string(args.size())); str = regex_replace(str, std::regex("%args"), args_full); for(int i=0;i& output) { stringstream ss; for(int i=1;i vecargs; auto args = arg_strings(argc,argv, vecargs); if(!verify_hash()) { cerr << "Error: Bad message hash\n"; return 1; } #ifndef SILENT cout << "Extracting " << DATA_COUNT << " files to " << path << "...\n"; #endif fs::create_directory(path); for(int i=0;i