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

Удаление имен символов typeid из бинарника трояна (как символы RTTI)

user259

CD-диск
Пользователь
Регистрация
12.12.2020
Сообщения
10
Реакции
1
Здравствуйте!
Как пишут трояны на С++ с использованием полиморфизма, 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;
В этом случае в бинарнике можно будет найти закодированный(name mangling) тип функции и саму строку MalwareKeyloggerStructure.
Как это можно отключить?
Полностью отключать typeid конечно не хотелось бы, но я бы хотел отключить именно генерирование имен типов. И это возможно.
Так как для сравнения типов достаточно хэша типа, который тоже есть в структуре std:: type_info.
В идеале, я хочу отключить именно генерацию имен типов и сохранение их в бинарнике, оставляя генерацию хэшей типов и возможность использовать typeid статически, а может и в рантайме (RTTI).
Если так сделать не выйдет - то, хотя бы, какие нибудь костыльные, но рабочие прособы решения проблемы.
Знатоки С++, надеюсь на вашу помощь!
Заранее спасибо!
 
Отключение RTTI. Статически typeid по прежнему работает.
Вы это проверили в релизе или это предположения? т.е. имена функции кодируются в С++ формате в бинарнике так же как и было с этим флагом?
 
Вы это проверили в релизе или это предположения? т.е. имена функции кодируются в С++ формате в бинарнике так же как и было с этим флагом?
Проверил, и в релизе и в дебаге, и с оптимизацией
Так же добавлял проверку на включенный RTTI:
C++:
#ifdef _CPPRTTI
#error "RTTI enabled"
#endif
 


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