Зачем? Слава малваре кодера - дурная слава, если у тебя есть выбор, то не делай этого.Народ, можно ли выкладывать свою малварь на гитхаб в открытый доступ?
Зачем? Слава малваре кодера - дурная слава, если у тебя есть выбор, то не делай этого.Народ, можно ли выкладывать свою малварь на гитхаб в открытый доступ?
Бро, здоров. Не дропнул и не дропну, задачи решаю по ассKumarin, давно не отписывался по обучению, дропнул или нет?
Я на выходных тоже скачал три тома и задачник, даже полистать получилось. Исключительно из-за интереса, не ради становления программистом.
Ну то что офигел, мягко говоря, это факт)Можно, а в профиле гитхаба укажи настоящие фио и фото. Упрощай работу аналитикам-вайтхетам.
Он офигел от к-тва постов в этой теме, и решил наверное, что ну его нафиг этот С++
Я вчера дочитал до ознокомления с линуксом, повторял ли ты за книгой работу с командой строкой? И сильная ли математика требуется для понимания примеров и задач из его книг?Бро, здоров. Не дропнул и не дропну, задачи решаю по асс
С линуксом знал уже как работать, повторял, математику там дадут немного в первом томе, пока не дошёл до места, где прям кровь из носа нужна была математика. А так можешь сразу повторять как переводить цифры из десятеричной системы в шестнадцатеричную , двоичную и тд. Про заемы, переполнения тожеЯ вчера дочитал до ознокомления с линуксом, повторял ли ты за книгой работу с командой строкой? И сильная ли математика требуется для понимания примеров и задач из его книг?
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;
}
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);
//
}
}
}
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ую? Или как?На 11 венде этот код уже не будет работать, потому что структура изменилась и поля Enclave, Graphics убрали или перекочевали куда-то еще.
Эти API есть в kernel mode? Мы же в контексте KM рассматриваем код.На мой взгляд, куда проще сделать что-то подобное:
В чем проблема получить информацию только о необходимом.Разве этот класс не получает информацию об абсолютно всех модулях, загруженных в системе?
Они человеческие, как в D и как были в msvc для x86. Синтаксис в других компиляторах мне лично не нравится.Подробнее пожалуйста, чем они вам понравились?
Скорее требует допила, но в инете подобного кода полно можно найти и лучше написанного.Сам концепт все же жив и требует допила по 11ую? Или как?
Дело не в привык не привык, а в том, что подобный код - это потенциальный генератор бсодов, почему не использовать легитимную функцию.Он просто привык так.
Привет. Хорошо у меня. Кодю на фасме и помимо этого изучаю иду с алгоритмами.Kumarin привет, ты там как? Получается? Что сейчас изучаешь?
"Грокаем алгоритмы" -- отличное чтиво для изучения вопроса.Привет. Хорошо у меня. Кодю на фасме и помимо этого изучаю иду с алгоритмами.
Где можно подробнее изучить syscalls ?Чувак, почти вся крутая малварь начиная с бородатых годов и заканчивая примерно 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, у них очень крутые виртуальные машины, но если залить файл на скан, то тебе придется надеть сварочную маску, что бы не ослепнуть от количества детектов
Пора блин начинать писать книгу "Для начинабщих малващиков и не только"
А что их изучать? Вот почитай например https://xss.pro/threads/43097/можно подробнее изучить syscalls ?
mov eax,123
sysenter
ret
Может уже поздно на это отвечаю, но я уверен ключ к тому, что люди используют для малвари более современные языки программирования в их легкости. Ведь вода течет по пути наименьшего сопротивления. Проще написать стиллер на питон например, чем на С, пусть он и посредственного качества будет. Хотя качество таких людей я думаю мало волнует. В глазах обывателя «питон я уже знаю, а С то учить надо!! А нахера? Чтобы тот же самый стиллер написать. Да нафиг этот С, напишу на питоне»)Чувак, почти вся крутая малварь начиная с бородатых годов и заканчивая примерно 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
Ну так и есть в общем случае. Вообще, вопрос ко всем, ради интереса хотелось бы увидеть исходники действительно качественно написанной на Цэ и актуальной сейчас малвари. Посмотреть, к чему там можно придраться. А то код элитных Цэшников, которые элитно пишут на Цэ без ошибок, это как единорог, вроде все хотят, чтобы он существовал, а вспомнить, где его видели, мало кто может. Только прям большой проект, а не выдержки из сотни строк. Посмотреть там, как там архитектура построена без абстракций, и тд. Есть чего поглядеть на досуге? Кидайте ссылки.что на питоне качество будет лучше, ведь нет утечек памяти и удобная работа со строками!
Именно актуальной сейчас? Зевс не подойдет? Там конечно плюсы, но плюсы такие, "си с классами". Carbanak еще норм, но опять же, там не Си. Если чисто сишный, то buhtrap.ради интереса хотелось бы увидеть исходники действительно качественно написанной на Цэ и актуальной сейчас малвари.
И к чему он пришел, без понимания основ? Я не призываю всех кодить на ассемблере, 64 битный асм довольно таки геморный, но понимание должно быть.даже не нужно разбираться, что там в этих ваших ассемблерах делается