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

Вкат в С, С+

Народ, можно ли выкладывать свою малварь на гитхаб в открытый доступ?
Зачем? Слава малваре кодера - дурная слава, если у тебя есть выбор, то не делай этого.
 
Kumarin, давно не отписывался по обучению, дропнул или нет?
Я на выходных тоже скачал три тома и задачник, даже полистать получилось. Исключительно из-за интереса, не ради становления программистом.
Бро, здоров. Не дропнул и не дропну, задачи решаю по асс
 
Можно, а в профиле гитхаба укажи настоящие фио и фото. Упрощай работу аналитикам-вайтхетам.


Он офигел от к-тва постов в этой теме, и решил наверное, что ну его нафиг этот С++
Ну то что офигел, мягко говоря, это факт)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Бро, здоров. Не дропнул и не дропну, задачи решаю по асс
Я вчера дочитал до ознокомления с линуксом, повторял ли ты за книгой работу с командой строкой? И сильная ли математика требуется для понимания примеров и задач из его книг?
 
Я вчера дочитал до ознокомления с линуксом, повторял ли ты за книгой работу с командой строкой? И сильная ли математика требуется для понимания примеров и задач из его книг?
С линуксом знал уже как работать, повторял, математику там дадут немного в первом томе, пока не дошёл до места, где прям кровь из носа нужна была математика. А так можешь сразу повторять как переводить цифры из десятеричной системы в шестнадцатеричную , двоичную и тд. Про заемы, переполнения тоже
 
Пожалуйста, обратите внимание, что пользователь заблокирован
DildoFagins глянь, https://github.com/gmh5225/FakeEnclave
Помнится тебе нравилась тема с анклавами
Ну из ядра любой может, мне интересно было изъебнуться, чтобы из режима пользователя свой процесс защитить, но спасибо, если еще кто будет наталкиваться на такие темы, сбрасывайте, посмотрим. Можно еще varwar и atavism показать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Около года назад пробовал использовать стандартные виндовые API для онклавов из UM, после небольшого гемора с CreateEnclave написал проверку.

C:
BOOL IsEnclaveSupported(DWORD Type)
{
    BOOL retVal = FALSE;
    switch (Type) {

    case ENCLAVE_TYPE_SGX:
        retVal = IsEnclaveTypeSupported(ENCLAVE_TYPE_SGX);
        printf_s("ENCLAVE_TYPE_SGX supported & retVal = %d\n", retVal);
        break;
        
    case ENCLAVE_TYPE_SGX2:
        retVal = IsEnclaveTypeSupported(ENCLAVE_TYPE_SGX2);
        printf_s("ENCLAVE_TYPE_SGX2 supported & retVal = %d\n", retVal);
        break;

    case ENCLAVE_TYPE_VBS:
        retVal = IsEnclaveTypeSupported(ENCLAVE_TYPE_VBS);
        printf_s("ENCLAVE_TYPE_VBS supported & retVal = %d\n", retVal);
        break;

    case ENCLAVE_TYPE_VBS_BASIC:
        retVal = IsEnclaveTypeSupported(ENCLAVE_TYPE_VBS_BASIC);
        printf_s("ENCLAVE_TYPE_VBS_BASIC supported & retVal = %d\n", retVal);
        break;

    default:
        printf_s("Error! Unknown enclave type!\n");
    }
    return retVal;
}

В итоге оказалось, что мое железо поддерживает только VBS-онклавы и я забил болт. Хотя не совсем забил. Попробовал еще раз на VBS-онклаве как это понял из документации.


C:
LPVOID CreateEnclaveWrapper(SIZE_T dwSize, DWORD EnclaveType)
{
    LPVOID Enclave;
    DWORD EnclaveError = 0;
    SIZE_T EnclaveInfoSize;
    ENCLAVE_CREATE_INFO_VBS EnclaveInfo = { 0 };
    EnclaveInfoSize = sizeof(EnclaveInfo); // asume 4096
    HANDLE Proc;
    ULONG err;
    LPVOID Mem;

    Proc = GetCurrentProcess();

    if (IsEnclaveSupported(EnclaveType)) {

        Enclave = CreateEnclave(Proc, 0, dwSize, 0, EnclaveType, &EnclaveInfo, EnclaveInfoSize, &EnclaveError);

        if (Enclave != NULL)
        {
            printf_s("Enclave addr: %p\n", Enclave);
            // We cant' dump enclave memory here, because it's not initialized
        }
        else
        {
            printf_s("ERROR\n");
        }

        Mem = VirtualAlloc(Enclave, dwSize, MEM_COMMIT, PAGE_READWRITE);

        if (Mem)
        {
            printf_s("Enclave allocation address = %p\n", Mem);
            HexDump(Mem, 0x100);
        }
        else
        {
            err = GetLastError(Mem);
            printf_s("Error = %d\n", err);
            //
        }
    }
}

И вот уже где-то тут я забил болт на SGX-онклавы.
 
Пожалуйста, обратите внимание, что пользователь заблокирован

Ого, человеческие ассемблерные вставки в 64. Правда непонятно зачем использовать асм для получения базы ядра в контексте ring 0, если для этого есть ZwQuerySystemInformation с классом SystemModuleInformation.

Код с использованием KeStackAttachProcess в данном случае может вызывать "мертвые замки" при получении vad. Мелкие не рекомендуют сложные вызовы вставлять между KeStackAttachProcess и KeUnstackDetachProcess, коим является MiObtainReferencedVadEx. Хотя что тут говорить, весь код это практически андок, инжект текущего потока в адресное пространство целевого процесса, манипуляции с недокументированными флагами VAD структуры. На 11 венде этот код уже не будет работать, потому что структура изменилась и поля Enclave, Graphics убрали или перекочевали куда-то еще.


Код:
lkd> dt nt!_MMVAD_SHORT u.VadFlags.
   +0x030 u           :
      +0x000 VadFlags    :
         +0x000 Lock        : Pos 0, 1 Bit
         +0x000 LockContended : Pos 1, 1 Bit
         +0x000 DeleteInProgress : Pos 2, 1 Bit
         +0x000 NoChange    : Pos 3, 1 Bit
         +0x000 VadType     : Pos 4, 3 Bits
         +0x000 Protection  : Pos 7, 5 Bits
         +0x000 PreferredNode : Pos 12, 7 Bits
         +0x000 PageSize    : Pos 19, 2 Bits
         +0x000 PrivateMemory : Pos 21, 1 Bit
 
Ого, человеческие ассемблерные вставки в 64.
Подробнее пожалуйста, чем они вам понравились?
Правда непонятно зачем использовать асм для получения базы ядра в контексте ring 0, если для этого есть ZwQuerySystemInformation с классом SystemModuleInformation.
Он просто привык так.
На 11 венде этот код уже не будет работать, потому что структура изменилась и поля Enclave, Graphics убрали или перекочевали куда-то еще.
Сам концепт все же жив и требует допила по 11ую? Или как?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
На мой взгляд, куда проще сделать что-то подобное:
Эти API есть в kernel mode? Мы же в контексте KM рассматриваем код.
Разве этот класс не получает информацию об абсолютно всех модулях, загруженных в системе?
В чем проблема получить информацию только о необходимом.
Подробнее пожалуйста, чем они вам понравились?
Они человеческие, как в D и как были в msvc для x86. Синтаксис в других компиляторах мне лично не нравится.
Сам концепт все же жив и требует допила по 11ую? Или как?
Скорее требует допила, но в инете подобного кода полно можно найти и лучше написанного.

Он просто привык так.
Дело не в привык не привык, а в том, что подобный код - это потенциальный генератор бсодов, почему не использовать легитимную функцию.


P.S. Кажется пора создавать в разделе обсуждение режима ядра и всего с этим связанного.
 
Последнее редактирование:
Чувак, почти вся крутая малварь начиная с бородатых годов и заканчивая примерно 2015 написана исключительно на Си+ASM, и только потом непонятно зачем начали прикручивать расты/чепушасты и прочие новые языки (это скорее погоня за волшебной кнопкой "сделать FUD", раз не получилось у меня на Си может на N-языке получится), причем асм использовался только там, где в этом реально была необходимость, потому что писать допустим целый RAT на чистом асме - ебля с бубном, ничем не оправданная, есть конечно экземпляры, но это скорее исключение из правил. В основном писалось все на Си, большая часть кода. И да, я заметил твое уточнение про "для современной". А теперь скажи мне, что поменялось с тех времен ? Приведи мне железный аргумент, почему я должен перестать использовать Си, потому что он якобы не подходит для современной малвары. Я более чем уверен, что ты не приведешь его мне.
Теперь пройдемся далее по твоему сообщению. Ты предлагаешь использовать VM, которая будет интерпретировать команды. Хорошо, даже если VM будет достаточно неплохая и будет уметь генерировать разный v-байткод для одинакового входного кода, знаешь что может случиться ? Наверное ты такого не ожидал, но будет детект на твою VM, на сам интерпретатор. Его надо морфить и постоянно видоизменять, что бы на него не навесили сигнатуру. А теперь спрашивается, нахрена долбиться с VM, если у тебя есть возможность морфить код, морфи и запутывай тогда исходный байткод малвари на уровне ассемблерных команд, будет тот же результат, ты уйдешь от сигнатурного детекта, и скантайм и в памяти.
Только не стоит забывать, что детект не ограничивается одними только сигнатурами, как в файле так и в памяти, от скантайма уйти проще пареной репы, есть еще такие штуки как эвристика и поведенческий анализ, эвристика вообще бабуйня, которая может дать и ложный детект, основывается на куче факторов в том числе и на поведении, обход эвристики это тема отдельная, так что сейчас не затрагиваем ее, а вот если рассмотреть твою идею с интерпретатором VM в контексте поведенческого анализа, то никакого профита это не дает даже в сравнении с обычным вредоносным кодом, который никак не скрыт от посторонних глаз.
Объясняю подробнее, взять обычный RunPE, в 99% случаев он палится по поведению, а именно по цепочке вызовов
1)CreateProcess(SUSPENDED)
2)GetThreadContext
3)NtUnmapWievOfSection
4)Read\WriteProcessMemory
5) SetThreadCOntext
6) ResumeThread
Большинство вызовов WinAPI, особенно опасных с точки зрения АВ, перехватывается, именно что бы следить за тем, что делает то или иное приложение в системе, и если твое приложение делает подозрительные вызовы, да еще в подозрительном порядке, да в добавок еще с подозрительными параметрами, то это неминуемо приводит к детекту, и твоя VM тут никак не поможет, потому что если код виртуализовать, он все равно будет вызывать все те же апишки какие вызывались в оригинале, в том же порядке и с теми же аргументами

Теперь объясню тебе как сейчас пишут UserMode FUD малварь, это было актуально раньше и будет актуально еще очень долго
Все пишется на чистом Си, в принципе можно и на любом другом удобном языке, который позволит проделать описанные далее действия, но путем проб и ошибок все сошлось к Си
Для начала тебе надо писать без использования прямых вызовов к WinAPI и даже NativeAPI, но как можно не использовать апишки спросишь ты ? Ведь нам банально может потребоваться динамично выделить память и у начинающих малварщиков руки сразу тянутся к VirtualAlloc\HeapAlloc
А этого делать категорически нельзя, особенно касается это WinAPI\NtApi на которые у АВ стойкая эрекция, и выход тут есть - имя ему syscall
Твой код должен динамично получать номера системных вызовов и делать вызовы напрямую в ядро, минуя ntdll который так же хукается в юзермоде
Вот ты написал сие чудо, у которого пустая таблица импорта и есть одна лишь голая секция кода, которая полностью без участия UserMode системных dll оберток может выполнять свой функционал взывая к силам ядра, и кажется что это произведение искусства может захватить мир ? Ан-нет. Возможно, если полученный код не имеет уже старых сигнатур по счастливой случайности, он проработает некоторое время, а потом на него навесят сигнатуры, на секцию кода. Вдобавок файл будет подозрителен по другому ряду причин - отсутствие таблицы импорта, ресурсов и других секций, которые должны быть в нормальном файле. Даже обойдя UserMode поведенческий анализ ты снова упираешься в банальный сигнатурный детект и общее представление файла. И как его избежать ? Правильно - морфить твой код. Делать это можно как на уровне исходников Си (обфускация), так и морфить уже компилированный байткод на уровне ассемблера, тут тоже два выхода, либо морфинг нативный - напрямую морфится байткод и бинарь пересобирается, либо выдирается дизасм написанного тобой на Си кода и морфится на уровне исходного кода на ассемблере, затем компилируется в FASM\MASM\HUYASM и тд. Ресурсы так же генерируются по ряду правил, с импортом та же история, он должен быть хоть какой-то, желательно, что бы там были функции и библиотеки которые используются в 80% легитимного софта. И только после этого можно уже говорить, что-то про современную малварь и эффективные способы ее написания. А идея с VM - шляпа, подойдет только для "защиты" софта от злых ручек крекеров, но в плане скрытия от АВ это вещица бесполезная, погляди на VMProtect и Themida, у них очень крутые виртуальные машины, но если залить файл на скан, то тебе придется надеть сварочную маску, что бы не ослепнуть от количества детектов
Пора блин начинать писать книгу "Для начинабщих малващиков и не только"
Где можно подробнее изучить syscalls ?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
можно подробнее изучить syscalls ?
А что их изучать? Вот почитай например https://xss.pro/threads/43097/


Если софт читает что-то из файла , сокета или еще откуда, оно происходит примерно так. Любая функция (fread , read, и так далее) сводится к вызову ReadFile из kernel32.dll. В свою очередь ReadFile обращается к NtReadFile из ntdll.dll, внутри которой будет код вида
Код:
mov eax,123
sysenter
ret
где в регистр ЕАХ заносится номер сискола, и командой sysenter (или syscall или через wow64 шлюз - зависит от версии ОС) команда передается в ядро. Аверы любят ставить здесь свои хуки, ибо ниже уже только ядро, так или иначе, повторюсь, все вызовы на чтение файла сведутся вот к этому участку кода. Поэтому, давным давно придумали такую технологию, как самостоятельно вызывать сискол. Т.е. софт откуда-то берет (с таблиц в секции дата или парсит экспорт нтдлл) номера, и вызывает сисколы сам, тем самым минуя путь kerne32.dll=>ntdll , и обходя какую-то часть аверских ловушек.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Чувак, почти вся крутая малварь начиная с бородатых годов и заканчивая примерно 2015 написана исключительно на Си+ASM, и только потом непонятно зачем начали прикручивать расты/чепушасты и прочие новые языки (это скорее погоня за волшебной кнопкой "сделать FUD", раз не получилось у меня на Си может на N-языке получится), причем асм использовался только там, где в этом реально была необходимость, потому что писать допустим целый RAT на чистом асме - ебля с бубном, ничем не оправданная, есть конечно экземпляры, но это скорее исключение из правил. В основном писалось все на Си, большая часть кода. И да, я заметил твое уточнение про "для современной". А теперь скажи мне, что поменялось с тех времен ? Приведи мне железный аргумент, почему я должен перестать использовать Си, потому что он якобы не подходит для современной малвары. Я более чем уверен, что ты не приведешь его мне.
Теперь пройдемся далее по твоему сообщению. Ты предлагаешь использовать VM, которая будет интерпретировать команды. Хорошо, даже если VM будет достаточно неплохая и будет уметь генерировать разный v-байткод для одинакового входного кода, знаешь что может случиться ? Наверное ты такого не ожидал, но будет детект на твою VM, на сам интерпретатор. Его надо морфить и постоянно видоизменять, что бы на него не навесили сигнатуру. А теперь спрашивается, нахрена долбиться с VM, если у тебя есть возможность морфить код, морфи и запутывай тогда исходный байткод малвари на уровне ассемблерных команд, будет тот же результат, ты уйдешь от сигнатурного детекта, и скантайм и в памяти.
Только не стоит забывать, что детект не ограничивается одними только сигнатурами, как в файле так и в памяти, от скантайма уйти проще пареной репы, есть еще такие штуки как эвристика и поведенческий анализ, эвристика вообще бабуйня, которая может дать и ложный детект, основывается на куче факторов в том числе и на поведении, обход эвристики это тема отдельная, так что сейчас не затрагиваем ее, а вот если рассмотреть твою идею с интерпретатором VM в контексте поведенческого анализа, то никакого профита это не дает даже в сравнении с обычным вредоносным кодом, который никак не скрыт от посторонних глаз.
Объясняю подробнее, взять обычный RunPE, в 99% случаев он палится по поведению, а именно по цепочке вызовов
1)CreateProcess(SUSPENDED)
2)GetThreadContext
3)NtUnmapWievOfSection
4)Read\WriteProcessMemory
5) SetThreadCOntext
6) ResumeThread
Большинство вызовов WinAPI, особенно опасных с точки зрения АВ, перехватывается, именно что бы следить за тем, что делает то или иное приложение в системе, и если твое приложение делает подозрительные вызовы, да еще в подозрительном порядке, да в добавок еще с подозрительными параметрами, то это неминуемо приводит к детекту, и твоя VM тут никак не поможет, потому что если код виртуализовать, он все равно будет вызывать все те же апишки какие вызывались в оригинале, в том же порядке и с теми же аргументами

Теперь объясню тебе как сейчас пишут UserMode FUD малварь, это было актуально раньше и будет актуально еще очень долго
Все пишется на чистом Си, в принципе можно и на любом другом удобном языке, который позволит проделать описанные далее действия, но путем проб и ошибок все сошлось к Си
Для начала тебе надо писать без использования прямых вызовов к WinAPI и даже NativeAPI, но как можно не использовать апишки спросишь ты ? Ведь нам банально может потребоваться динамично выделить память и у начинающих малварщиков руки сразу тянутся к VirtualAlloc\HeapAlloc
А этого делать категорически нельзя, особенно касается это WinAPI\NtApi на которые у АВ стойкая эрекция, и выход тут есть - имя ему syscall
Твой код должен динамично получать номера системных вызовов и делать вызовы напрямую в ядро, минуя ntdll который так же хукается в юзермоде
Вот ты написал сие чудо, у которого пустая таблица импорта и есть одна лишь голая секция кода, которая полностью без участия UserMode системных dll оберток может выполнять свой функционал взывая к силам ядра, и кажется что это произведение искусства может захватить мир ? Ан-нет. Возможно, если полученный код не имеет уже старых сигнатур по счастливой случайности, он проработает некоторое время, а потом на него навесят сигнатуры, на секцию кода. Вдобавок файл будет подозрителен по другому ряду причин - отсутствие таблицы импорта, ресурсов и других секций, которые должны быть в нормальном файле. Даже обойдя UserMode поведенческий анализ ты снова упираешься в банальный сигнатурный детект и общее представление файла. И как его избежать ? Правильно - морфить твой код. Делать это можно как на уровне исходников Си (обфускация), так и морфить уже компилированный байткод на уровне ассемблера, тут тоже два выхода, либо морфинг нативный - напрямую морфится байткод и бинарь пересобирается, либо выдирается дизасм написанного тобой на Си кода и морфится на уровне исходного кода на ассемблере, затем компилируется в FASM\MASM\HUYASM и тд. Ресурсы так же генерируются по ряду правил, с импортом та же история, он должен быть хоть какой-то, желательно, что бы там были функции и библиотеки которые используются в 80% легитимного софта. И только после этого можно уже говорить, что-то про современную малварь и эффективные способы ее написания. А идея с VM - шляпа, подойдет только для "защиты" софта от злых ручек крекеров, но в плане скрытия от АВ это вещица бесполезная, погляди на VMProtect и Themida, у них очень крутые виртуальные машины, но если залить файл на скан, то тебе придется надеть сварочную маску, что бы не ослепнуть от количества детектов
Пора блин начинать писать книгу "Для начинабщих малващиков и не только"
Может уже поздно на это отвечаю, но я уверен ключ к тому, что люди используют для малвари более современные языки программирования в их легкости. Ведь вода течет по пути наименьшего сопротивления. Проще написать стиллер на питон например, чем на С, пусть он и посредственного качества будет. Хотя качество таких людей я думаю мало волнует. В глазах обывателя «питон я уже знаю, а С то учить надо!! А нахера? Чтобы тот же самый стиллер написать. Да нафиг этот С, напишу на питоне»)

Я думаю так: чем ниже по уровню язык тем лучше писать малварь, в ниже С уже непонятно что можно придумать разве что ассемблер наверное.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ниже С уже непонятно что можно придумать разве что ассемблер наверное
Да, ассемблер. Те же сисколы, на Си или тем более на питонах не реализовать.

Проще написать стиллер на питон например, чем на С, пусть он и посредственного качества будет.
Сейчас в тему придут люди и скажут тебе, что на питоне качество будет лучше, ведь нет утечек памяти и удобная работа со строками!
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Те же сисколы, на Си или тем более на питонах не реализовать.
Так-так, я бы попросил:
Код:
import ctypes

libc = ctypes.CDLL(None)
syscall = libc.syscall
syscall(39) # 39 = getpid
Но если серьезно (это был код для Линуксов, если кто не понял), сейчас уже сложно найти язык, на котором нельзя было бы выделить исполняемый буффер, залить туда шелл и выполнить его. Условному blackteam007 даже не нужно разбираться, что там в этих ваших ассемблерах делается, скопипастил шелл для вызова сисколла с интернетов как массив байт, осталось только этот шелл разместить в памяти, да вызвать его правильно с нужным тебе номером сисколла: https://github.com/zeroSteiner/mayh...f7e087277a/mayhem/exploit/windows.py#L46-L195

что на питоне качество будет лучше, ведь нет утечек памяти и удобная работа со строками!
Ну так и есть в общем случае. Вообще, вопрос ко всем, ради интереса хотелось бы увидеть исходники действительно качественно написанной на Цэ и актуальной сейчас малвари. Посмотреть, к чему там можно придраться. А то код элитных Цэшников, которые элитно пишут на Цэ без ошибок, это как единорог, вроде все хотят, чтобы он существовал, а вспомнить, где его видели, мало кто может. Только прям большой проект, а не выдержки из сотни строк. Посмотреть там, как там архитектура построена без абстракций, и тд. Есть чего поглядеть на досуге? Кидайте ссылки.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
ради интереса хотелось бы увидеть исходники действительно качественно написанной на Цэ и актуальной сейчас малвари.
Именно актуальной сейчас? Зевс не подойдет? Там конечно плюсы, но плюсы такие, "си с классами". Carbanak еще норм, но опять же, там не Си. Если чисто сишный, то buhtrap.
Абсолютное большинство выложенной в паблик малвари на плюсах, но какие там плюсы - от плюсов взяты одни неймспейсы, изредка элементы ООП (1-2 класса), а так Си.

даже не нужно разбираться, что там в этих ваших ассемблерах делается
И к чему он пришел, без понимания основ? Я не призываю всех кодить на ассемблере, 64 битный асм довольно таки геморный, но понимание должно быть.
 


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