Привет всем , сегодня я расскажу как можно сделать неочевидным исполняемый код , без отладки ( в случае если у вас имеется хорошая защита от дебагга , то этот метод будет для вас эффективным )
допустим есть у нас класс , который мы хотим запутать и будет он вида :
В случае если вы , захотите ее вызвать ее , то в исполняемом коде она будет вида
call Адрес_функции
Наша задача не дать найти адрес функции . Для этого я предлагаю создать абстрактный класс за место того что есть .
пример
необходимо добавить наследование в наш исходный класс
для тех кто в танке =)
!Важно : добавлять функции в абстрактный класс нужно строго в той последовательности в какой они у вас записаны в исходном классе .
Итого : при вызове функции в исполняемом коде будет исполнены примерно такие команды
mov регистр , Адрес_абстрактного_класса
call [регистр+смещение_функции]
то есть фактически адрес обфусицированной функции мы не даем , но а если уж дебажить то при вызове этой функции мы вызываем конструктор , где мы присваиваем абстрактному классу ссылку на искомый ) выполняем исходную функцию вызываем деконструктор ( где удаляем ссылку) а потом возвращаемся в первый уровень кода
Минусы : громоздкость , возможность найти конструктор класса , при более детальном просмотре кода , но как вариант можно запихать присвоение ссылки на класс в мутекс , который будет находится в какой-то жопе .
Плюсы : можно усложнить жизнь неопытным взломщикам =)
допустим есть у нас класс , который мы хотим запутать и будет он вида :
C++:
class cProtect
{
public:
void AntiDbg( )
{ }
void EraseHeaders( )
{ }
}Protect;
call Адрес_функции
Наша задача не дать найти адрес функции . Для этого я предлагаю создать абстрактный класс за место того что есть .
пример
C++:
class Dummy_Protect
{
public:
virtual void AntiDbg( )=0;
virtual void EraseHeaders( )=0;
}* vProtect;
Dummy_Protect::Dummy_Protect()
{vProtect=&Protect; };
Dummy_Protect::~Dummy_Protect()
{ delete vProtect; };
для тех кто в танке =)
C++:
class cProtect:public Dummy_Protect
{
public:
void AntiOllyDbg( )
{ }
void EraseHeaders( )
{ }
}Protect;
Итого : при вызове функции в исполняемом коде будет исполнены примерно такие команды
mov регистр , Адрес_абстрактного_класса
call [регистр+смещение_функции]
то есть фактически адрес обфусицированной функции мы не даем , но а если уж дебажить то при вызове этой функции мы вызываем конструктор , где мы присваиваем абстрактному классу ссылку на искомый ) выполняем исходную функцию вызываем деконструктор ( где удаляем ссылку) а потом возвращаемся в первый уровень кода
Минусы : громоздкость , возможность найти конструктор класса , при более детальном просмотре кода , но как вариант можно запихать присвоение ссылки на класс в мутекс , который будет находится в какой-то жопе .
Плюсы : можно усложнить жизнь неопытным взломщикам =)