Pull to refresh

Доступ к private извне или как взломать класс

Доброго времени суток. Сегодня подниму тему доступа к private-member класса. Все мы знаем, что нельзя изменить член класса содержащийся в секции private извне. Возможно данный метод, многим из вас, уже известен.

Создадим класс с двумя мемберами и методом для их возврата.

class A{
    public:
        A(int a, int b);

        void SetData (int numb){ m_iA = numb; }
        int  GetDataA()        { return m_iA; }
        int  GetDataB()        { return m_iB; }
    private:
        int m_iA;
        int m_iB;
}

и конечно же конструктор:

A::A(int a, int b) : m_iA(a), m_iB(b){
   std::cout << "adress: " << this << " A()" << std::endl;
}


Единственный нюанс, мы должны знать точное кол-во members в классе и их тип.



1) Получаем адрес класса:

A obj_a(5,3);
A* ptrA = &obj_a;

2) Делаем самую нахальную вещь в С++:

int* ptr_iA = reinterpret_cast<int*>(obj_a);
int* ptr_iB = ptr_iA + 1;

3) Выводим данные:

cout << "\nm_iA = " << *ptr_iA << "m_iB = " << ptr_iB << endl;

И последний трюк:

ptr_iA += 5;
cout << "\n" << obj_a.GetDataA() << endl;

У данного способа есть уйма недостатков, но я постараюсь их доработать и опубликовать что-то новое по этой теме.

До новых встреч.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.