Задать вопрос
@inq_1337

Как скрыть адрес вызываемой функции в C++?

Как в C++ можно скрыть адрес вызываемой функции?

Пробовал так:

Есть класс
class cProtect :public Protect
{
public:
    void Test()
    { 
        cout << "Test" << endl;
    }
}Protect;


Далее реализовал абстрактный класс

class  Protect
{
public:
    virtual void Test() = 0;
    ~Protect();
    Protect();
}*vProtect;

Protect::Protect()
{
    vProtect = Protect;
};

Protect::~Protect()
{
    delete vProtect;
};


в компиляторе вижу две ошибки:
1)=: невозможно преобразовать "cProtect *" в "Protect*"
2)Protect: не определен базовый класс

На всем хабаре нашел только одну тему и то 2017 года.
Если кто знает в чем проблема или как это реализовать по другому, то жду ваших ответов.
Заранее спасибо

Эта тема поднималась не только как практический вопрос, а еще с целью обсуждения обфускации кода c++. Единственный ли это вариант? Какие есть готовые решения? Есть ли вообще смысл в обфускации кода c++?
  • Вопрос задан
  • 268 просмотров
Подписаться 2 Средний 16 комментариев
Решения вопроса 1
@rPman
В коде, указанном в вопросе написана белиберда
В конструкторе предлагаешь сделать присваивание
vProtect = Protect;
глобальной переменной vProtect имя класса Protect (потому что у тебя Protect и класс и переменная типа cProtect, (то что компилятор тебе это позволил уже бардак), если переименовать cProtect мембер Protect в protect (как рекомендует большинство code styling - имена классов с большой буквы, имена переменных - с маленькой, чтобы не запутаться), а еще тип vProtect у тебя - указатель, а Protect - нет, если будут оба указатели то само собой все будет собираться, но все равно смысла это иметь не будет.
-----------------------

Теперь про твой вопрос в заголовке, почти ничего не имеющий общего с текстом вопроса:
Как скрыть адрес вызываемой функции в C++?
в контексте обфускации, подразумевается что по декомпилированному исходному коду должно быть не ясно, какой именно метод будет вызываться (т.е. для анализа требуется отладка, что сложнее/дороже), значит хранить адреса методов нужно в каких то переменных, например массивах, а выбор следующего вызываемого метода делать на основе каких то вычислений по коду.

В c++ для этого реализован класс std::function, пример использования для вызова именно метода класса (для простоты пример без аргументов но с аргументами все то же самое, надеюсь ты понимаешь, что у тебя должны быть одинаковые аргументы и типы во всех методах, или должны быть группы для разных типов, но чем больше групп тем проще анализ кода, иначе тупо по типам и количеству аргументов все можно будет понять)
// определяем класс
class MyClass
{
  public:
  void myFunA(){std::cout<<"A";};
  void myFunB(){std::cout<<"B";};
};

однократно где то инициализируешь массив адресов функций (никто не мешает по коду это перемешивать)
std::function<void(MyClass*)> functions[]={&MyClass::myFunA,&MyClass::myFunB};

вызов метода по номеру x
MyClass obj;
functions[x](&obj);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы