• XSS.stack #1 – первый литературный журнал от юзеров форума

Как использовать задержку в коде чтобы ее не скипал АНТИВИРУС? [C++]

Russian_Coder

(L2) cache
Забанен
Регистрация
31.01.2024
Сообщения
424
Реакции
189
Пожалуйста, обратите внимание, что пользователь заблокирован
Как я знаю что обычный слип аверы могут скипать как лучше сделать проверку или реализацию этого что если как то скипалось то программа крашила либо закрывала себя.
 

Delaying execution​

Delaying execution may evade sandbox analysis by exceeding the time limit for the sample execution. However it’s not as easy as Sleep(1000000). Sandboxes may fast-forward our “naps”.

What we can do is to check system uptime before and after Sleeping. We can also use lower-level userland API for sleeping (there is a slightly less chance that it is hooked by AV). This requires obtaining function address dynamically - it will be broader used during API calls obfuscation described in one of the next articles. Also, NtDelayExecution function requires the sleep time parameter in a different format than Sleep:

C++:
ULONGLONG uptimeBeforeSleep = GetTickCount64();
typedef NTSTATUS(WINAPI *PNtDelayExecution)(IN BOOLEAN, IN PLARGE_INTEGER);
PNtDelayExecution pNtDelayExecution = (PNtDelayExecution)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtDelayExecution");
LARGE_INTEGER delay;
delay.QuadPart = -10000 * 100000; // 100 seconds
pNtDelayExecution(FALSE, &delay);
ULONGLONG uptimeAfterSleep = GetTickCount64();
if ((uptimeAfterSleep - uptimeBeforeSleep) < 100000) return false;
 
NativeAPI/API хучатся можно сделать задержку хоть на портах ввода/вывода (RS232/socket/FS и т.д.). Можно делать задержки с использование прямой работы с процессором, например используя rdtsc/rdtscp.
Как вариант использовать сложные псевдо вычисления с использованием MMX, SSE, AVX и т.д. с последующим как бы использованием результатов, полученных при расчетах в самом дальнейшем коде.
 
может кому пригодится

C++:
#include <iostream>
#include "windows.h"

#define MS_PER_SECOND 10000000

unsigned long long __get_timestamp()
{
    const size_t UNIX_TIME_START = 0x019DB1DED53E8000;
    const size_t TICKS_PER_SECOND = 10000000;
    LARGE_INTEGER time;
    time.LowPart = *(DWORD*)(0x7FFE0000 + 0x14);
    time.HighPart = *(long*)(0x7FFE0000 + 0x1c);
    return (unsigned long long)((time.QuadPart - UNIX_TIME_START) / TICKS_PER_SECOND);
}

void __alt_sleep_seconds(size_t seconds)
{
    volatile size_t x = rand();
    const unsigned long long end = __get_timestamp() + seconds;
    while (__get_timestamp() < end) { x += 1; }
    if (__get_timestamp() - end > 2000) return;

}

int main()
{
    const size_t SECONDS = 15;
    std::cout << "__get_timestamp()\n";
    std::cout << __get_timestamp() << "\n";
    __alt_sleep_seconds(SECONDS);
    std::cout << __get_timestamp() << "\n";
    return 0;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх