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

Статья Используем С++17 при написании вредоносных программ

PlebsoVata

RAID-массив
Пользователь
Регистрация
05.10.2019
Сообщения
87
Реакции
34
В студии давно появился флаг "/std:c++17" и недавно "/std:c++20", о котором я расскажу в следующей статье, каждый из этих стандартов привнес много новшеств в язык и стандартную библиотеку, которыми не все пользуются, особенно при создании малвари, потому что они тянут исключения, CRT.
Однако есть полезные и удобные фичи, которые позволяют быстрее и удобнее писать многие вещи и они не тянут исключения и CRT.

Оглавление:
  • constexpr
  • string_view
  • Structure binding
  • Deduction guides
  • Fold Expressions

1. constexpr
Constexpr был добавлен еще в C++11 и все его знают благодаря xorstr и другим библиотекам, которые позволяют в compile-time хоть как-то обфусцировать строки, однако теперь можно писать if constexpr (expression) чтобы использовать условные операторы в compile-time.

if constexpr можно использовать в compile-time алгоритмах, а также при проверках типов, например так:
C++:
template <typename T>
constexpr auto GetPointer(const T& t) {
    if constexpr (std::is_pointer_v<T>) // std::is_pointer_v<T> - compile-time функция и не тянет CRT, находится в <type_traits>
        return t;
    else
        return &t;
}

В этой статье я привел примеры compile-time crc32, вычисления чисел фибоначчи и как можно работать со string_view.

Была добавлена возможность использовать constexpr лямбда-функции, если они удовлетворяют требованиям constexpr функций.
C++:
int main(int argc, char* argv[])
{
    constexpr auto Kylobytes = [](int n) -> int {
        return n * 1024;
    };
    constexpr auto kb_1024 = Kylobytes(1024);
    return kb_1024;
}

2. string_view
Данный контейнер является constexpr и не тянет за собой CRT, но может, если хотите перестраховаться, то нужно брать чужую реализацию, либо писать свою на основе чужой, благо исходного кода STL предостаточно.
Данный контейнер не владеет строкой, а принимает char-образные данные, обычно хранит только указатель на начало строки и размер.
Плюсом является доступ к таким функциям-членам как: operator[](), at(), front(), back(), data(), size(), empty(), swap(), substr(), compare(), find(), rfind(), все из которых constexpr.
C++:
int main(int argc, char* argv[])
{
    using namespace std::literals;
    auto temp_str_view = "some data yopta"sv; // литерал 'sv' находящийся в std::literals позволяет писать так, иначе всегда будет необходимо явно указывать тип переменной как std::string_view
    if (!temp_str_view.empty())
        return temp_str_view[7];
    return -1;
}

3. Structure binding
Очень простая и удобная фича, которая позволяет писать более читаемый код:
C++:
typedef struct {
    std::string_view name;
    int age;
    float balance_rub;
    float balance_btc;
    void* optional;
    size_t szOptional;
} UserInfo;

UserInfo GetUserDataFromAnywhere(size_t uid = 1)
{
    // searching user...
    return {"Kojima", 45, 0.f, 152.25f, nullptr, 0};
}

int main(int argc, char* argv[])
{
    auto [name, age, nRub, nBtc, opt, szOpt] = GetUserDataFromAnywhere(); // structure binding
    // Теперь мы можем использовать имена name, age и другие
    // Важно использовать все поля структуры, иначе будет ошибка компиляции
    return age;
}

4. Deduction guides
В большинстве случаев они генерируются неявно и позволяют писать следующий код:
C++:
template <typename T1, typename T2>
struct MyPair {
    T1 first;
    T2 second;
    MyPair(const T1& t1, const T2& t2) {
        first = t1;
        second = t2;
    }
    ~MyPair() = default;
};

int main(int argc, char* argv[])
{
    auto p1 = MyPair(543.5f, "string"sv); // C++17, в С++14 пришлось бы написать MyPair<float, const char*>(...)
}

Однако можно писать и собственные deduction guides для создания объектов, например:
C++:
template <typename T1>
MyPair(T1, const char*) -> MyPair<T1, std::string_view>;

template <typename T2>
MyPair(const char*, T2) -> MyPair<std::string_view, T2>;
Данный код делает так, чтобы MyPair(543.5f, "string") хранилась как MyPair<float, std::string_view>(543.5f, "string"), а не как MyPair<float, const char*>(543.5f, "string").

5. Fold Expressions
Позволяет использовать следующие операции с паками параметров: + - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*
C++:
template<typename... Args>
constexpr int sum(Args&&... args) {
    return (args + ... );
}

template<typename... Args>
constexpr bool isEverythingGood(Args&&... args) {
    return (... && args);
}


int main(int argc, char* argv[])
{
    constexpr int summa = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    constexpr bool isGood = isEverythingGood(true, true, false, true, true, true);

    return isGood;
}

Это лишь малая часть нововведений в С++17, однако именно их можно использовать при написании софта, если вам требуется отключить SDL, exceptions, CRT и прочий мусор.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Спасибо, ТС. А в Си ничего особо полезного не завезли, увы. Одна фигня https://habr.com/ru/company/badoo/blog/503140/
синтаксический сахар. Ну разве что инклуд файла в сорцы может где-то пригодится, и то..
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В С++20 должны были полноценные модули завести наконец-то, а то Плюсы (вместе с Сишечкой) чуть ли не единственный оставшийся в живых язык, который оставался без модулей, а с ужасной системой инклудов, из-за которой было много проблем, в том числе и со временем компиляции больших проектов на Плюсах.
 
Спасибо, ТС. А в Си ничего особо полезного не завезли, увы. Одна фигня https://habr.com/ru/company/badoo/blog/503140/
синтаксический сахар. Ну разве что инклуд файла в сорцы может где-то пригодится, и то..
Я почти не программирую на чистом Си, но в голову ничего не лезет, что можно было бы в него добавить, хотя тот же structure binding и в Си можно добавить в том или ином виде.
 
В С++20 должны были полноценные модули завести наконец-то, а то Плюсы (вместе с Сишечкой) чуть ли не единственный оставшийся в живых язык, который оставался без модулей, а с ужасной системой инклудов, из-за которой было много проблем, в том числе и со временем компиляции больших проектов на Плюсах.
Модули это заебись, но опять же не уверен что это будет слишком полезно для написания вредоносов, только если делать какой-то модульный софт с апишкой в виде модулей. Интересно что модули за собой тянут и в каком количестве, для того же модуля строки ей придется подтянуть модуль исключений и возможно что-то еще.

В 20 плюсах много интересного, корутины, utf8 из коробки, работа с датами и временем, std::format (аналог printf), шаблонные лямбды, новый оператор + операторы равенства и неравенства любых объектов генерируются по дефолту, концепты, ranges и много другого, но использовать большинство фич из STL, если они не constexpr, к сожалению нельзя при написании вредоносов или программ без sdl, exceptions, crt.

Насчет скорости компиляции, если повырубать все sdl, exceptions, crt и включить многопоточную компиляцию (/MP флаг вроде в студии) + настроить предкомпилированные заголовки, то большие проекты, где написаны собственные контейнеры vector, string, алгоритмы к ним, все из которых на шаблонах, то компилируется очень быстро, не знаю помогут ли модули именно в такого типа проектах или усугубят положении. Также в новой студии есть кланг, который по ощущениям компилирует немного быстрее + в нем есть встроенный статический анализатор кода, но это надо проверять
 
В С++20 должны были полноценные модули завести наконец-то, а то Плюсы (вместе с Сишечкой) чуть ли не единственный оставшийся в живых язык, который оставался без модулей, а с ужасной системой инклудов, из-за которой было много проблем, в том числе и со временем компиляции больших проектов на Плюсах.
В целом про новые стандарты, плюсов больше чем минусов, но иногда из-за неточности формулировок возникают очень странные ошибки, например в этом коде:
C++:
struct A {
    int a{};
};

int main() {
    auto [a] = A{};
    auto fun = [=] {
        a + 1;
    };
}

Он компилируется gcc, но не clang или msvc, потому что structure binding добавляет новые имена в скоуп, но не сказано, что эти имена - переменные, а лямбда захватывает только переменные, поэтому приходится писать так:
auto fun = [a=a] { a + 1; };

Думаю в С++20, особенно с модулями, которые до сих экспериментальные в реализациях msvc и частично реализованы в clang и gcc, будет немало проблем и неточностей.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну синтаксис лямбд вообще в плюсах мне очень не нравится, я конечно понимаю, что им надо было большинство юзкейсов покрыть, но то, что у них получилось, в коде очень уродливо смотрится имхо.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
что можно было бы в него добавить
мне не хватает чего нибудь , чтоб ксорить те же строки на этапе компиляции. Препроцессор у Си ужасный, взять тот же Фасм - там мощнее в разы, ну или плюсовые вот фишки , что ты упоминал.
 
мне не хватает чего нибудь , чтоб ксорить те же строки на этапе компиляции. Препроцессор у Си ужасный, взять тот же Фасм - там мощнее в разы, ну или плюсовые вот фишки , что ты упоминал.
Ты можешь переключиться на плюсы, написать себе кода для обфускации, а все остальное оставить на си как есть))
Я помню видел где-то xor строк или что-то подобное на макросах, выглядело мягко говоря не очень, но работало на чистом Си.

Вот тут есть aes на макросах, но к сожалению с помощью 2 питоновских файликов: https://github.com/bormand/pp_aes

Вот кстати нашел библиотеку метапрограммирования на С: https://github.com/Hirrolot/metalang99
А тут небольшая серия статей про metalang99: https://habr.com/ru/post/523688/
Тут еще есть STL-подобные контейнеры на чистом С: https://github.com/P-p-H-d/mlib

Но код смотреть и писать на этом все как-то страшно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я помню видел где-то xor строк или что-то подобное на макросах, выглядело мягко говоря не очень, но работало на чистом Си.
Врядли сие возможно, разве что какие-то кастомные расширения GCC. Макросы Си очень убогие, и пошифровать что либо ими анриал.
з.ы. а так сделать можно много чего, но хотелось бы на чистом Си. Но, видимо, придется юзать плюсы, хотя бы частично ).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ты можешь переключиться на плюсы, написать себе кода для обфускации, а все остальное оставить на си как есть))
О, братан, я его пытаюсь уговорить на Плюсы перейти уже года три, но он никак не поддаётся))
 


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