Представьте: перед вами исполняемый файл без исходного кода, документации или символов отладки. Ваша задача - понять его логику, найти уязвимости или восстановить алгоритм. Это и есть обратная разработка (reverse engineering) - искусство деконструирования программ. Когда речь заходит о C++, сложность возрастает экспоненциально: "Реверс C++ напоминает археологию: вы копаете через слои оптимизаций, чтобы найти следы высокоуровневой логики." mov rax, [rdi] ; Загрузка vtable из объекта (this) call [rax+0x10] ; Вызов виртуальной функции по смещению 0x10 Каждая инстанциация шаблона (std::vector<int>, std::vector<MyClass>) генерирует уникальные функции. В дизассемблере это выглядит как множество однотипных символов с манглированными именами: _ZNKSt6vectorIiSaIiEE4sizeEv ; std::vector<int>::size() const Pro Tip: Используйте demangler (например, c++filt) для преобразования имен функций: _Z3addii → add(int, int) // Декомпилированный фрагмент в Ghidra class Employee { char nam
Обратная разработка (Reverse Engineering) C++ программ: Особенности и инструменты
15 июня15 июн
12
3 мин