#include <iostream>
#include <chrono>
#include <thread>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
#include <future>
#include "Obfuscation.h"
using namespace std;
using namespace std::chrono;
static const string base64_chars =
xor_s("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefihgjklmnopqrstuvwxyz0123456789+/");
// Функция для Base64-кодирования строки с измененными символами
string base64_encode(const string& in) {
string out;
int val = 0, valb = -6;
for (unsigned char c : in) {
val = (val << 8) + c;
valb += 8;
while (valb >= 0) {
out.push_back(base64_chars[(val >> valb) & 0x3F]);
valb -= 6;
}
}
if (valb > -6) out.push_back(base64_chars[((val << 8) >> (valb + 8)) & 0x3F]);
while (out.size() % 4) out.push_back('=');
return out;
}
// Функция для побайтового сравнения строк с XOR
bool complexPasswordCheck(const string& inputPassword, const string& generatedPassword) {
if (inputPassword.size() != generatedPassword.size()) {
return false;
}
bool result = true;
for (size_t i = 0; i < inputPassword.size(); ++i) {
char xored = inputPassword[i] ^ generatedPassword[i];
result &= (xored == 0);
}
if (result) {
int fakeCheck = (inputPassword[0] ^ 0x5A) & (generatedPassword[1] ^ 0xA5);
if (fakeCheck == 0) {
return false;
}
}
else {
int fakeCheck = (inputPassword[1] ^ 0x33) & (generatedPassword[0] ^ 0xCC);
if (fakeCheck != 0) {
return true;
}
}
return result;
}
// Генерация случайного слова на основе времени
string generateRandomWord(time_point<high_resolution_clock> timePoint) {
auto duration = duration_cast<microseconds>(timePoint.time_since_epoch()).count();
stringstream ss;
ss << xor_s("Rnd") << (duration % 10000);
return ss.str();
}
// Генерация пароля на основе времени, логина и случайного слова
string generatePassword(time_point<high_resolution_clock> startTime, time_point<high_resolution_clock> loginTime, const string& login) {
auto duration = duration_cast<microseconds>(loginTime - startTime).count();
int complexity = (duration * 31 + 7) % 100003;
string randomWord = generateRandomWord(startTime);
stringstream ss;
ss << login << complexity << randomWord;
return base64_encode(ss.str());
}
// Функция для проверки пароля в отдельном потоке
void checkPassword(const string& inputPassword, const string& generatedPassword, promise<bool>& resultPromise) {
if (inputPassword.empty() || generatedPassword.empty()) {
resultPromise.set_value(false);
return;
}
bool isPasswordCorrect = complexPasswordCheck(inputPassword, generatedPassword);
resultPromise.set_value(isPasswordCorrect);
}
// Функция для сложной проверки результата
bool finalCheck(bool accessGranted) {
int randomValue = rand() % 100;
int complexCheck = (randomValue * 2 + 7) % 10;
return (accessGranted && (complexCheck % 2 == 0));
}
// Функция для скрытой проверки
void hiddenResultCheck(future<bool> resultFuture) {
bool accessGranted = resultFuture.get();
// Дополнительные уровни абстракции
bool finalResult = finalCheck(accessGranted);
// Логика проверки
if (finalResult) {
cout << xor_s("Access granted!") << endl;
}
else {
cout << xor_s("Access denied!") << endl;
}
}
int main() {
srand(static_cast<unsigned int>(time(nullptr)));
auto startTime = high_resolution_clock::now();
this_thread::sleep_for(milliseconds(100));
auto loginTime = high_resolution_clock::now();
string generatedPassword = generatePassword(startTime, loginTime, xor_s("CrackMe"));
// cout << "generatedPassword: " << generatedPassword.c_str() << endl;
string inputPassword;
cout << xor_s("Enter password: ");
cin >> inputPassword;
promise<bool> resultPromise;
future<bool> resultFuture = resultPromise.get_future();
thread passwordThread(checkPassword, inputPassword, generatedPassword, ref(resultPromise));
thread hiddenCheckThread(hiddenResultCheck, move(resultFuture));
passwordThread.join();
hiddenCheckThread.join();
system(xor_s("pause"));
return 0;
}