Здравствуйте!
Как пишут трояны на С++ с использованием полиморфизма, typeid?
Если не выключить RTTI в настройках компилятора, имя каждого полиморфного класса будет палится в строках билда.
В бинарнике будут сохраняться строки по типу таких: .P6A?AV?$shared_ptr@VKeyloggerStructure@d@@@std@@G@Z
Без RTTI нельзя будет использовать dynamic_cast или typeid для родительского полиморфного класса, но да кому это нужно? Отключил.
Но. В С++ есть много крутых фич, например, std::function, который я достаточно часто использую.
Но, как оказалось, std::function использует typeid для сохранения типа функции и проверки его в методе target, и делает это статически, при создании объекта, что значит что отключение RTTI (run-time type identification) не запретит использование typeid, так как выполняется компилятором статически, а значит имена типов аргументов функции попадут в строки бинарника файла. Например:
В этом случае в бинарнике можно будет найти закодированный(name mangling) тип функции и саму строку MalwareKeyloggerStructure.
Как это можно отключить?
Полностью отключать typeid конечно не хотелось бы, но я бы хотел отключить именно генерирование имен типов. И это возможно.
Так как для сравнения типов достаточно хэша типа, который тоже есть в структуре std:: type_info.
В идеале, я хочу отключить именно генерацию имен типов и сохранение их в бинарнике, оставляя генерацию хэшей типов и возможность использовать typeid статически, а может и в рантайме (RTTI).
Если так сделать не выйдет - то, хотя бы, какие нибудь костыльные, но рабочие прособы решения проблемы.
Знатоки С++, надеюсь на вашу помощь!
Заранее спасибо!
Как пишут трояны на С++ с использованием полиморфизма, typeid?
Если не выключить RTTI в настройках компилятора, имя каждого полиморфного класса будет палится в строках билда.
В бинарнике будут сохраняться строки по типу таких: .P6A?AV?$shared_ptr@VKeyloggerStructure@d@@@std@@G@Z
Без RTTI нельзя будет использовать dynamic_cast или typeid для родительского полиморфного класса, но да кому это нужно? Отключил.
Но. В С++ есть много крутых фич, например, std::function, который я достаточно часто использую.
Но, как оказалось, std::function использует typeid для сохранения типа функции и проверки его в методе target, и делает это статически, при создании объекта, что значит что отключение RTTI (run-time type identification) не запретит использование typeid, так как выполняется компилятором статически, а значит имена типов аргументов функции попадут в строки бинарника файла. Например:
C++:
struct MalwareKeyloggerStructure {
// ...
};
std::function<void(MalwareKeyloggerStructure*)> f;
Как это можно отключить?
Полностью отключать typeid конечно не хотелось бы, но я бы хотел отключить именно генерирование имен типов. И это возможно.
Так как для сравнения типов достаточно хэша типа, который тоже есть в структуре std:: type_info.
В идеале, я хочу отключить именно генерацию имен типов и сохранение их в бинарнике, оставляя генерацию хэшей типов и возможность использовать typeid статически, а может и в рантайме (RTTI).
Если так сделать не выйдет - то, хотя бы, какие нибудь костыльные, но рабочие прособы решения проблемы.
Знатоки С++, надеюсь на вашу помощь!
Заранее спасибо!