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

Статья Как правильно изучать malware-кодинг под Windows

Пожалуйста, обратите внимание, что пользователь заблокирован
Ну в С++ есть две вещи, которые не особо применимы в малваре. Ну про RTTI, наверное, говорить не стоит, и так все понятно. Но вот эксепшены очень часто имеет смысл нахер убирать из проекта. Во-первых, далеко не все умеют готовить эксепшены правильно, а ведь в них много неочевидных корнер кейсов (как, например, выброс эксепшена из деструктора - это андефайнд бехейвиор). Во-вторых, у кода с эксепшенов есть цена по производительности (в частности поэтому разработчики игр, браузеров и тд от них избавляются). Проблема в том, что STL использует эксепшены, мало что из STL можно использовать без эксепшенов.

Но на самом деле я не вижу ничего страшного в написании своих абстракций, которые тебе могут понадобится, это не так много. И на это не нужно годы тратить.
 
Я не курильщик. Я оценил время, необходимое для создания собственного STL, потому что это то, что делают авторы вредоносных программ C. Они не доверяют внешним библиотекам, но, тем не менее, даже если вы используете библиотеки, время будет больше, чем время разработки C ++.

Это параллельно с индустрией видеоигр. Они выпускают собственный STL, например EA Games, но у них есть веские причины, в отличие от нас.

Мой друг потратил 3 года на модификацию Zeus. Zeus утверждает, что написан на C ++, но он не использует возможности C ++, а скорее C. Zeus прожил бы гораздо дольше, если бы использовал шаблоны C ++.

Даже эти вредоносные программы на C. написаны плохо. Единственная хорошая вредоносная программа на языке C, которая мне понравилась, была Gozi IFSB.
Как это относится к написанию банкбота? Зачем боту полный аналог СТЛ библиотеки?
Про 3 года тоже бред, я не могу представить обьем работ, который требуется произвести, чтобы убить 3 года при полной загруженности.
 
Ну в С++ есть две вещи, которые не особо применимы в малваре. Ну про RTTI, наверное, говорить не стоит, и так все понятно. Но вот эксепшены очень часто имеет смысл нахер убирать из проекта. Во-первых, далеко не все умеют готовить эксепшены правильно, а ведь в них много неочевидных корнер кейсов (как, например, выброс эксепшена из деструктора - это андефайнд бехейвиор). Во-вторых, у кода с эксепшенов есть цена по производительности (в частности поэтому разработчики игр, браузеров и тд от них избавляются). Проблема в том, что STL использует эксепшены, мало что из STL можно использовать без эксепшенов.

Но на самом деле я не вижу ничего страшного в написании своих абстракций, которые тебе могут понадобится, это не так много. И на это не нужно годы тратить.
В наши дни исключения C ++ рентабельны. Они не влияют на вашу производительность.

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

Во-вторых, антивирусные компании могут создавать подписи FLIRT для ваших абстракций, но они не могут создавать подписи FLIRT для STL, поскольку STL использует шаблоны, а шаблоны зависят от версий компилятора.


В-третьих, ваши собственные абстракции будут работать медленнее, чем STL.

Я гарантирую, что C ++ всегда превосходит C по производительности благодаря шаблонам и std::move.
 
Шаблоны в малвари?! o_O


А есть примеры ВПО на Плюсах? Очень интересен порог вхождения в этот код: много запросов доработать малварь за предыдущим разрабом. Многие ли готовы доработать плюсовый код - вот в чём вопрос! Речь, конечно, не о том, когда берут Плюсы и фигачат в стиле Си.
> Шаблоны в малвари?! o_O

Позвольте мне пояснить вам. Ко времени запуска Zeus в 2004 году уже существовали шаблоны на C ++, которые также позволяли вам программировать во время компиляции. Автор Zeus мог использовать это для того, чтобы сгенерированный код выглядел настолько сложным для анализа аналитиками вредоносных программ.

К моему удивлению, никаких вредоносных программ для C ++ публично не просочилось, даже в Github нет таких вредоносных программ. Но они существуют в частном порядке (у меня). idiomatic вредоносное ПО для C ++ не отличается от вредоносного ПО на языке C с точки зрения функциональности. Чтобы писать чистый современный код на C ++, вам нужно избавиться от запаха C. По сути, используйте все возможности C ++ и сделайте код привлекательным. Код должен быть привлекательным, это ключ к успеху, и он должен использовать шаблоны проектирования вместе с ООП.


> Одно из основных различий между ними заключается в том, что версия 5.0.1 написана на C ++ с использованием обширного объектно-ориентированного программирования, библиотеки Boost и реализации буферов протокола на C ++ - версия 4.1.3 была написана на C без каких-либо объектно-ориентированных методов и использовал реализацию буферов протокола на языке C. Версия 5.0.1 также использует SHA512, модифицированный (или сломанный) алгоритм AES и TEA вместо MD5 и RC4, как описано ниже. В целом, версия 5.0.1 была более крупной вредоносной программой, которую труднее было реконструировать.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
наши дни исключения C ++ рентабельны. Они не влияют на вашу производительность.
Зависит от реализации, SEH - ну ничего, DWARF - ну ничего, SjLj - так себе.


Проблема с написанием собственных абстракций заключается в том, что они не переносимы, как STL, и по мере роста вредоносного ПО ваши собственные абстракции растут экспоненциально.
Для большинства абстракций можно вполне использовать Posix, если ты так печешься о переносимости. Для всех контейнеров из STL достаточно malloc, realloc и free.


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


В-третьих, ваши собственные абстракции будут работать медленнее, чем STL.

Я гарантирую, что C ++ всегда превосходит C по производительности благодаря шаблонам и std::move.
Это тоже бред - писать медленный код можно на любом языке. В сишечке ты можешь вообще один выделенный буффер через всю программу передать без необходтмости всяких std::move и это будет быстрее.
 
Зависит от реализации, SEH - ну ничего, DWARF - ну ничего, SjLj - так себе.



Для большинства абстракций можно вполне использовать Posix, если ты так печешься о переносимости. Для всех контейнеров из STL достаточно malloc, realloc и free.



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



Это тоже бред - писать медленный код можно на любом языке. В сишечке ты можешь вообще один выделенный буффер через всю программу передать без необходтмости всяких std::move и это будет быстрее.
Опять же, это дешево, и вы можете посмотреть на базу кода Chrome, они используют большую часть STL, но не используют исключения, и я работал в высокочастотном магазине в Чикаго, и мы использовали исключения C ++.

> Это тоже чушь - можно писать медленный код на любом языке. В общем, вы можете передавать один выделенный буфер через всю программу без необходимости использования std :: move, и это будет быстрее.

Нет. Обычно написанный код современного C ++ всегда быстрее, чем код C. Семантику перемещения сложно добавить в C

Теоретически вы всегда можете превзойти C ++ в C, но было бы некрасиво иметь встроенную сборку во всем вашем коде.

посмотрите на такие крупные компании, как FireEye. У них есть вакансии для аналитиков C ++.


Зачем они нужны, если никому не нужно создавать подписи?

Они могут анализировать код и вводить новые функции в системы машинного обучения.

Например, Quake3 - новый ведущий банковский троян на рынке, его код запутан с помощью VMProtect.

FireEye успешно проанализировал код и обнаружил, что он использует обходной метод для обнаружения песочниц и тому подобное. Во время анализа мы обнаружили, что он использует настраиваемый пользовательский агент для отправки данных на внешний сервер, а время между каждым подключением является постоянным и составляет 2,5 минуты.


Я знаю опытных аналитиков C ++, но им не хватает образцов, поэтому они голодают. Думаю, вы понимаете, что я имел в виду.

Да, IDA может раскрыть сущность C ++, но не всегда. Людям всегда приходится проходить вручную.

Поскольку рынок полон вредоносных программ для C и аналитиков C, C ++ может легко проскользнуть.

Я пытаюсь сказать вам, что C ++ краток и более продуктивен, чем C. Независимо от того, отрицаете вы это или нет, Google использовал бы C для перехода на Chrome, но этого не произошло. Почему? Вы спрашиваете это сами. Будет диастр. Взгляните на кодовую базу OpenSSL. Это охренеть.

Итак, я объяснил Quake3, что он лгал о том, что C ++ трудно выучить, с ним трудно работать.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
на базу кода Chrome, они используют большую часть STL, но не используют исключения
Да и это потому, что исключения в контейнерах по сути только критические, там просто нечему фейлить особо (если у тебя зафейлил malloc - то скорее всего памяти твоему коду больше не достанется, и вполне можно просто завалить процесс, тк особо нечего больше делать). И они даже в своих рекомендациях по коду пишут, что мол окей, используйте контейнеры, но в своем коде исключения не выбрасывайте.

Обычно написанный код современного C ++ всегда быстрее, чем код C. Семантику перемещения сложно добавить в C
Ну приведи пример, где С++ код был бы быстрее аналогичного С кода. Если это так, то скорее всего С код просто плохо написан, и его можно зарефакторить до такой же скорости или быстрее.

Например, Quake3 - новый ведущий банковский троян на рынке, его код запутан с помощью VMProtect.

FireEye успешно проанализировал код и обнаружил, что он использует обходной метод для обнаружения песочниц и тому подобное. Во время анализа мы обнаружили, что он использует настраиваемый пользовательский агент для отправки данных на внешний сервер, а время между каждым подключением является постоянным и составляет 2,5 минуты.
Нихера не понял, чего? Причем тут это вообще?
 
Да и это потому, что исключения в контейнерах по сути только критические, там просто нечему фейлить особо (если у тебя зафейлил malloc - то скорее всего памяти твоему коду больше не достанется, и вполне можно просто завалить процесс, тк особо нечего больше делать). И они даже в своих рекомендациях по коду пишут, что мол окей, используйте контейнеры, но в своем коде исключения не выбрасывайте.


Ну приведи пример, где С++ код был бы быстрее аналогичного С кода. Если это так, то скорее всего С код просто плохо написан, и его можно зарефакторить до такой же скорости или быстрее.


Нихера не понял, чего? Причем тут это вообще?
Я не могу привести вам примеры, потому что вы знаете, что сложно привести конкретный пример, и это может быть похоже на войну. Я видел, как Java иногда превосходит C ++ во время выполнения. Теперь это тема различий, но опять же, это не высокочастотная торговля.

Мы говорим о вредоносных программах.

Эффективность - цель C ++.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я видел, как Java иногда превосходит C ++ во время выполнения.
Это может происходить засчет JIT-компиляции. JIT-компилятор генерирует код для текущего конкретного процессора, а не какого-то старого процессора, чтобы исполняемый файл запускался на большинстве систем. Для текущего современного процессора можно сгенерировать более оптимизированный код за счет использования инструкций, которых не было на старом процессоре, например. Так что это хоть и редкая ситуация, но ее можно объяснить. Кодогенерация Це и Плюсов очень похожи, код на Плюсах чаще медленее Сишного, за счет абстракций (которые не всегда zero cost), вызовы конструкторов в STL контейнерах тех же не бесплатны, а на Сишечке можно вообще не инициализировать указатель нулем и тем самым съэкономить наносекунду)).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В треде не хватает того самого ассемблерщика, зашибающего $30к в месяц. Он бы нам пояснил за такты!
Так пигнани его тут: c0der, если прям охото послушать его биения себя тапком в грудь.
 
Это может происходить засчет JIT-компиляции. JIT-компилятор генерирует код для текущего конкретного процессора, а не какого-то старого процессора, чтобы исполняемый файл запускался на большинстве систем. Для текущего современного процессора можно сгенерировать более оптимизированный код за счет использования инструкций, которых не было на старом процессоре, например. Так что это хоть и редкая ситуация, но ее можно объяснить. Кодогенерация Це и Плюсов очень похожи, код на Плюсах чаще медленее Сишного, за счет абстракций (которые не всегда zero cost), вызовы конструкторов в STL контейнерах тех же не бесплатны, а на Сишечке можно вообще не инициализировать указатель нулем и тем самым съэкономить наносекунду)).
В C ++ есть больше вещей, таких как copy-elision, которых нет в C.

Я твердо верю, что C ++ всегда превосходит C, в то время как последний может превзойти первый с помощью хакерского кода.

Вы знаете, что в наши дни даже компиляторы C пишутся на C ++))

Многие фирмы, занимающиеся высокочастотной торговлей, используют C ++, а не C, потому что первый красив, в то время как второй хакерский, и вы повторяете много кода во втором.

В C также отсутствует перегрузка оператора и перегрузка функций.

Код C ++ красив и содержит меньше строк, чем код C.

В треде не хватает того самого ассемблерщика, зашибающего $30к в месяц. Он бы нам пояснил за такты!
Это написано на ARM-ASM или на каком диалекте ASM?

Мой опыт в ARM ASM
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я твердо верю, что C ++ всегда превосходит C, в то время как последний может превзойти первый с помощью хакерского кода
Блажен тот, кто верует.
 
Блажен тот, кто верует.
Как атеист, я не ищу ни у кого благословения.

Чтобы привести пример,

Qsort C медленнее, чем std :: sort

Вот знаменитое репо, которое сравнивает производительность C ++ и C,


Кроме того, я хочу добавить, что производительность - не единственная причина, по которой я рекомендую людям C ++. Потому что это более высокий уровень, и с ним легче работать. Меньше линий и меньше стресса. Если хочешь покрасоваться, всегда можешь написать ASM и C. Мне все равно. Производительность не является проблемой для большинства вредоносных программ, кроме шкафчиков.

C ++ и C это как Япония и Россия)))
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Как атеист, я не ищу ни у кого благословения
Но твоя вера в плюсы крепка, хорошо, что именно ты их проповедуешь тут, а не кто-то другой, ибо он мог бы не пройти испытание соблазном использовать чистую православную сишечку для малвари.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Еще раз повторюсь - в статье писал не что Си круче С++ (хотя он реально круче), а что для начинающего лучше учиться с Си. Си проще, это чистый код. Учить кодинг с плюсов (или шарпа), это примерно как объяснить человеку, что лампочка горит потому что Бог так захотел. А потом объяснять про электроны. Человек хочет взять и писать малварь , а вы ему предлагаете зачем-то учить ООП инкапсуляцию и все такое. Он же не в офис пойдет на работу.
 
Еще раз повторюсь - в статье писал не что Си круче С++ (хотя он реально круче), а что для начинающего лучше учиться с Си. Си проще, это чистый код. Учить кодинг с плюсов (или шарпа), это примерно как объяснить человеку, что лампочка горит потому что Бог так захотел. А потом объяснять про электроны. Человек хочет взять и писать малварь , а вы ему предлагаете зачем-то учить ООП инкапсуляцию и все такое. Он же не в офис пойдет на работу.
Снимок экрана_2021-07-24_18-33-25.png

Ребят ну по чесноку, вы помните что к вам тип подваливал в треде по поводу "[Malware] Задай вопрос - получи ответ" того что у него чего то не получается, как выяснилось методом проб и ошибок у этого дауна проблема была в том что он подгружал x64 битную либу в x32 битный процесс. Тут проблема скорее в том, что слишком много пафоса от нубов нынче - они нихера не учат, а просто берут паблик исходы чита, собирают их, не могу нормально заинжектить, а потом ебут вам мозги говорят что они невъебенные кодеры. А мы им верим, предлогаем идеи почему не работает, ебемся и думаем много очень. А у них оказывается такая простая ошибка, что даже мы об этом и сами не подумали. Это как хроники пикируешего бомбардирока.... Он вас столько мозг выносит, а вы там предлогаете ему супер-решения, а оказывается он в банальщине ошибся. И так каждый раз. Вина лежит на тех кто слишком самоуверен, на тех кто не хочет учиться.
 
thatsmyname вайт просто :) Понятно, что там актуален такой код:
C++:
if ( !parse_t::get_instance()->for_each( [ & ]( _vlabel_meta *label_data ) -> bool {
         std::printf( "> checking label %s for invalid instructions... number of instructions = %d\n",
                      label_data->label_name.c_str(), label_data->vinstrs.size() );

         const auto result = std::find_if(
             label_data->vinstrs.begin(), label_data->vinstrs.end(),
             [ & ]( const _vinstr_meta &vinstr ) -> bool {
                 std::printf( "> vinstr name = %s, has imm = %d, imm = 0x%p\n", vinstr.name.c_str(),
                              vinstr.has_imm, vinstr.imm );

                 for ( auto &vm_handler : vmctx->vm_handlers )
                     if ( vm_handler.profile && vm_handler.profile->name == vinstr.name )
                         return false;

                 std::printf( "[!] this vm protected file does not have the vm handler for: %s...\n",
                              vinstr.name.c_str() );

                 return true;
             } );

         return result == label_data->vinstrs.end();
     } ) )
{
    std::printf( "[!] binary does not have the required vm handlers...\n" );
    exit( -1 );
}

На любителя, как по мне :D Не хотел бы такое наблюдать в ВПО.
 


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