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

STL в малвари

Jeffs

(L1) cache
Забанен
Регистрация
28.12.2018
Сообщения
611
Реакции
358
Пожалуйста, обратите внимание, что пользователь заблокирован
Что думаете о использовании STL конкретно в малвари? К примеру, вместо CreateThread WINAPI юзать std::thread и тд.
Какие минусы?
 
Если речь про винду, то
std:: thread это обертка над CreateThread\NtCreateThread(Ex) в которой очень много проверок в стиле STL, наверняка есть еще эксепшены, так что ты за собой потянешь огромную таблицу crt импорта, у некоторых машин может не быть нужных для работы dll, так что чтобы подстраховаться придется статически все залинковать, что приведет к огромному экзешнику, порой может и до 500кб, а то и выше доходить размеры, особенно если огромная функциональность у приложения(всякие стринги, динамические массивы, туплы и в принципе вест ассортимент STL)

Если юзать что-то современное из последних плюсов, то только то, что работает без CRT или в компайл-тайме,
<string_view> вроде как не тянет за собой crt и позволяет в компайл-тайме работать со строчками.
Structure binding, template deduction guide(для своих собственных шаблонных классов), fold-expressions, вариадик паки не нуждаются в crt и могут быть полезны.
Вроде как некоторые алгоритмы из <algorithm> и <array> могут работать как constexpr, значит в некоторых случаях могут не тянуть crt, так что можешь сам тестить то, что тебе нужно.

ИМХО CreateThread гораздо удобнее.
Если нужно работать с огромным кол-вом потоков, общаться между тредами, то так и так придется делать какую-никакую оберточку для этого, поэтому лучше самому написать обертку сразу над CreateThread, заодно не будешь лишних зависимостей брать, чтобы ликвидировать гонку состояний, то можно использовать например критические секции для тех тредов что внутри одного процесса, если много тредов и в разных процессах, то мутексы.

Если будешь в std:: thread пытаться запихнуть функции из класса или множества переменных или структуру этих переменных, придется написать лямбду, в CreateThread можно просто адрес передать нужного объекта\структуры, но если лямбду практически какую угодно можно написать, то у функции, адрес которой передаешь в CreateThread может быть только одна сигнатура вида:
DWORD WINAPI Func(LPVOID lParam)
Вот тебе просто пример с кодом
C++:
#include <Windows.h>
#include <thread>
struct SomeClass
{
    int SomeFunc()
    {
        int a = 5;
        int b = 7;
        puts("In thread");
        return a + b;
    }
};

DWORD WINAPI ThreadedFunc(LPVOID lParam)
{
    SomeClass* someobj = (SomeClass*)lParam;
    someobj->SomeFunc();
    return 1;
}

int main()
{
    SomeClass obj;
    std::thread thread([&obj] { obj.SomeFunc(); });

    DWORD thrId = 0;
    CreateThread(NULL, 0, ThreadedFunc, &obj, 0, &thrId);
    return 0;
}
Что из этого плюсы, а что минусы сам решай.
 


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