@@ -85,7 +85,6 @@ std::string generate_random_number();
8585std::string curl_escape (CURL* curl, const std::string& input);
8686auto check_section_integrity ( const char *section_name, bool fix ) -> bool;
8787void integrity_check ();
88- void integrity_watchdog ();
8988std::string extract_host (const std::string& url);
9089bool hosts_override_present (const std::string& host);
9190bool module_paths_ok ();
@@ -114,13 +113,11 @@ std::array<uint8_t, 16> pro_verify{};
114113std::array<uint8_t , 16 > pro_checkinit{};
115114std::array<uint8_t , 16 > pro_error{};
116115std::array<uint8_t , 16 > pro_integrity{};
117- std::array<uint8_t , 16 > pro_watchdog{};
118116std::array<uint8_t , 16 > pro_section{};
119117
120118void KeyAuth::api::init ()
121119{
122120 std::thread (runChecks).detach ();
123- std::thread (integrity_watchdog).detach ();
124121 snapshot_prologues ();
125122 seed = generate_random_number ();
126123 std::atexit ([]() { cleanUpSeedData (seed); });
@@ -2012,14 +2009,12 @@ void snapshot_prologues()
20122009 const auto check_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&checkInit));
20132010 const auto error_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&error));
20142011 const auto integ_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&integrity_check));
2015- const auto watch_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&integrity_watchdog));
20162012 const auto section_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&check_section_integrity));
20172013 std::memcpy (pro_req.data (), req_ptr, pro_req.size ());
20182014 std::memcpy (pro_verify.data (), verify_ptr, pro_verify.size ());
20192015 std::memcpy (pro_checkinit.data (), check_ptr, pro_checkinit.size ());
20202016 std::memcpy (pro_error.data (), error_ptr, pro_error.size ());
20212017 std::memcpy (pro_integrity.data (), integ_ptr, pro_integrity.size ());
2022- std::memcpy (pro_watchdog.data (), watch_ptr, pro_watchdog.size ());
20232018 std::memcpy (pro_section.data (), section_ptr, pro_section.size ());
20242019 prologues_ready.store (true );
20252020}
@@ -2033,14 +2028,12 @@ bool prologues_ok()
20332028 const auto check_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&checkInit));
20342029 const auto error_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&error));
20352030 const auto integ_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&integrity_check));
2036- const auto watch_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&integrity_watchdog));
20372031 const auto section_ptr = reinterpret_cast <const uint8_t *>(reinterpret_cast <uintptr_t >(&check_section_integrity));
20382032 return std::memcmp (pro_req.data (), req_ptr, pro_req.size ()) == 0 &&
20392033 std::memcmp (pro_verify.data (), verify_ptr, pro_verify.size ()) == 0 &&
20402034 std::memcmp (pro_checkinit.data (), check_ptr, pro_checkinit.size ()) == 0 &&
20412035 std::memcmp (pro_error.data (), error_ptr, pro_error.size ()) == 0 &&
20422036 std::memcmp (pro_integrity.data (), integ_ptr, pro_integrity.size ()) == 0 &&
2043- std::memcmp (pro_watchdog.data (), watch_ptr, pro_watchdog.size ()) == 0 &&
20442037 std::memcmp (pro_section.data (), section_ptr, pro_section.size ()) == 0 ;
20452038}
20462039
@@ -2457,7 +2450,6 @@ void checkInit() {
24572450 !func_region_ok (reinterpret_cast <const void *>(&checkInit)) ||
24582451 !func_region_ok (reinterpret_cast <const void *>(&error)) ||
24592452 !func_region_ok (reinterpret_cast <const void *>(&integrity_check)) ||
2460- !func_region_ok (reinterpret_cast <const void *>(&integrity_watchdog)) ||
24612453 !func_region_ok (reinterpret_cast <const void *>(&check_section_integrity))) {
24622454 error (XorStr (" function region check failed, possible hook detected." ));
24632455 }
@@ -2476,45 +2468,6 @@ void integrity_check() {
24762468 }
24772469}
24782470
2479- void integrity_watchdog () {
2480- std::random_device rd;
2481- std::mt19937 gen (rd ());
2482- std::uniform_int_distribution<int > sleep_seconds (20 , 50 );
2483- while (true ) {
2484- Sleep (static_cast <DWORD>(sleep_seconds (gen) * 1000 ));
2485- if (!initialized || !LoggedIn.load ())
2486- continue ;
2487- const auto now = std::chrono::duration_cast<std::chrono::seconds>(
2488- std::chrono::system_clock::now ().time_since_epoch ()).count ();
2489- const auto last_mod = last_module_check.load ();
2490- if (now - last_mod > 120 ) {
2491- last_module_check.store (now);
2492- if (!module_paths_ok () || duplicate_system_modules_present () || user_writable_module_present () || !core_modules_signed () || hypervisor_present ()) {
2493- error (XorStr (" module path check failed, possible side-load detected." ));
2494- }
2495- }
2496- if (!prologues_ok ()) {
2497- error (XorStr (" function prologue check failed, possible inline hook detected." ));
2498- }
2499- if (!func_region_ok (reinterpret_cast <const void *>(&KeyAuth::api::req)) ||
2500- !func_region_ok (reinterpret_cast <const void *>(&VerifyPayload)) ||
2501- !func_region_ok (reinterpret_cast <const void *>(&checkInit)) ||
2502- !func_region_ok (reinterpret_cast <const void *>(&error)) ||
2503- !func_region_ok (reinterpret_cast <const void *>(&integrity_check)) ||
2504- !func_region_ok (reinterpret_cast <const void *>(&integrity_watchdog)) ||
2505- !func_region_ok (reinterpret_cast <const void *>(&check_section_integrity))) {
2506- error (XorStr (" function region check failed, possible hook detected." ));
2507- }
2508- if (check_section_integrity (XorStr (" .text" ).c_str (), false )) {
2509- const int streak = integrity_fail_streak.fetch_add (1 ) + 1 ;
2510- if (streak >= 2 ) {
2511- error (XorStr (" check_section_integrity() failed, don't tamper with the program." ));
2512- }
2513- } else {
2514- integrity_fail_streak.store (0 );
2515- }
2516- }
2517- }
25182471// code submitted in pull request from https://github.com/BINM7MD
25192472BOOL bDataCompare (const BYTE* pData, const BYTE* bMask, const char * szMask)
25202473{
0 commit comments