Гайд Как сделать VMT Hook (И почему лучше не использовать VMT для хука)

FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
Установка и обнаружение VMT Хука (Виртуальная таблица методов класса)

В примере видно как легко детектится такой хук. Как обойти такую простую проверку!?
1. Для хука заходить во внутрь функции и установить хук в самой функции а не в vmt.
2. Записать код хука в пустом месте адресного пространства программы места там хватает чтоб записать хотябы редирект
тем самым адресс хука в vmt будет находится в адресном пространстве программы и условный античит пропустить такой код


1. Для теста создаем консольный проект на C++ и пропишем простой класс с VMT
Код:
class TestVMT//Простой класс с использованием VMT
{
public:

    virtual void Func1();
    virtual void Func2();
    virtual void Func3();
    virtual void Func4();
    virtual void Func5();

    DWORD64 ad = 0;

};

void TestVMT::Func1()
{
    MessageBoxA(0, "Func1", 0, 0);
}

void TestVMT::Func2()
{
    MessageBoxA(0, "Func2", 0, 0);
}

void TestVMT::Func3()
{
    MessageBoxA(0, "Func3", 0, 0);
}

void TestVMT::Func4()
{
    MessageBoxA(0, "Func4", 0, 0);
}

void TestVMT::Func5()
{
    MessageBoxA(0, "Func5", 0, 0);
}
2. Напишем функцию которая будет в роле хука
Код:
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции
MessageBoxS box = (MessageBoxS)0x7FFFB8B88120;// Адресс взят напрямую чтоб не заморачиваться


void hookfunc()//функция которая будет выполняться вместо оригинала
{   
    box(0, 0, 0, 0);
}
3. Напишем функцию которая будет устанавливать хук
Код:
LPVOID Hook(LPVOID pClass, LPVOID pHookFunc, int dwOffset)// Функция которая устанавливает хук в виртуальной таблице методов (VMT)
{
    LPVOID pVTable = *(LPVOID*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению
    LPVOID pAdressInTable = (LPVOID)((DWORD64)pVTable + dwOffset * 8);//Вычисляем адресс функции в таблице по ее порядковому номеру


    DWORD dwOldProtection;
    VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), PAGE_READWRITE, &dwOldProtection);// меняем параметры страницы установка флага чтение запись

    memcpy(pAdressInTable, pHookFunc, 8);//Записываем наш адресс хука

    VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), dwOldProtection, &dwOldProtection);// Восстановили параметры страницы

    return (LPVOID)pAdressInTable;// Вернули адресс из таблицы где установили хук
}
4. Пишем функцию для детекта хука
Код:
bool DetectVMT(LPVOID pClass, int MaxCount)// Простая функция для детекта хука. Проверяет таблицу VMT на изменения адрессов функций
{
    DWORD64 pVMT = *(DWORD64*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению

    MODULEINFO mInfo;// Структура которая будет получать информацию о модуле (конкретно наша программа)

    GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(0), &mInfo, sizeof(mInfo));// Можете в гугл заглянуть что делает эта функция
    printf("Base adress %llp\n", mInfo.lpBaseOfDll);

    DWORD64 EndFile = (DWORD64)mInfo.lpBaseOfDll + mInfo.SizeOfImage;// Вычисляем конец нашей программы базовый адресс + размер. Нужен для сравнения адрессов. Так как в основном адресса которые в таблице VMT не могут быть за пределами пространства программы

    for (int i = 0; i < MaxCount; i++)// Перебор таблицы методов
    {
        printf("VMT check %llp\n", *(DWORD64*)pVMT);
        if(*(DWORD64*)pVMT > EndFile)return 1;// Если адресс функции в таблице больше адресного пространства нашей программы то детект(То есть адресс ссылается на внешний код за пределами проги)
        if (*(DWORD64*)pVMT < (DWORD64)mInfo.lpBaseOfDll)return 1;// Если адресс функции в таблице меньше (для тех кто выделил память ниже нашей проги)

        pVMT += 8;//К первому адрессу в таблице прибавляем 8 байт это размер адрессов в х64 системе. Тем самым переходим на след функцию в таблице
    }


    return 0;// 0 если все адресса находятся в рамках пространства программы
}
5. Точка входа программы и использование функций
Код:
int main()
{
    TestVMT* pTestVMT = new TestVMT;

    printf("class adr %llp\n", pTestVMT);

    pTestVMT->Func4();// Проверка функции до хука

    if(DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");//Проверка таблицы перед хуком
    else
    {
        printf("VMT UNDetect hook\n");
    }

    system("pause");

    LPVOID vAdress = VirtualAlloc(0, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память для хука (Имитируем что мы заинжектили чит)
    memcpy(vAdress, (LPVOID)hookfunc, 100);// Запись кода hookfunc
    printf("vAdress %llp\n", vAdress);

    system("pause");

    LPVOID adresshook = Hook(pTestVMT, &vAdress, 3);// Установка хука в VMT (1 класс 2 адресс хука 3 номер функции в таблице)
    printf("adresshook %llp\n", adresshook);
    system("pause");

    pTestVMT->Func4();// Повторно вызывает функцию после хука для проверки

    if (DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");// Повторно проверяем наше таблицу VMT класса
    else
    {
        printf("VMT UNDetect hook\n");
    }

    system("pause");

    return 1;
}
Дополнение:
- Как наглядно выглядит таблица (VMT) по нулевому смещению в классе
Пожалуйста, авторизуйтесь для просмотра ссылки.

- После установки хука но номеру функции
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Номер функции это порядковый номер
Пожалуйста, авторизуйтесь для просмотра ссылки.


Код:
#include <windows.h>
#include <stdio.h>
#include <Psapi.h>
 
class TestVMT//Простой класс с использованием VMT
{
public:
 
virtual void Func1();
virtual void Func2();
virtual void Func3();
virtual void Func4();
virtual void Func5();
 
DWORD64 ad = 0;
 
};
 
void TestVMT::Func1()
{
MessageBoxA(0, "Func1", 0, 0);
}
 
void TestVMT::Func2()
{
MessageBoxA(0, "Func2", 0, 0);
}
 
void TestVMT::Func3()
{
MessageBoxA(0, "Func3", 0, 0);
}
 
void TestVMT::Func4()
{
MessageBoxA(0, "Func4", 0, 0);
}
 
void TestVMT::Func5()
{
MessageBoxA(0, "Func5", 0, 0);
}
 
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции
MessageBoxS box = (MessageBoxS)0x7FFFB8B88120;// Адресс взят напрямую чтоб не заморачиваться
 
 
void hookfunc()//функция которая будет выполняться вместо  оригинала
{
box(0, 0, 0, 0);
}
 
LPVOID Hook(LPVOID pClass, LPVOID pHookFunc, int dwOffset)// Функция которая устанавливает хук в виртуальной таблице методов (VMT)
{
LPVOID pVTable = *(LPVOID*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению
LPVOID pAdressInTable = (LPVOID)((DWORD64)pVTable + dwOffset * 8);//Вычисляем адресс функции в таблице по ее порядковому номеру
 
 
DWORD dwOldProtection;
VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), PAGE_READWRITE, &dwOldProtection);// меняем параметры страницы установка флага чтение запись
 
memcpy(pAdressInTable, pHookFunc, 8);//Записываем наш адресс хука
 
VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), dwOldProtection, &dwOldProtection);// Восстановили параметры страницы
 
return (LPVOID)pAdressInTable;// Вернули адресс из таблицы где установили хук
}
 
bool DetectVMT(LPVOID pClass, int MaxCount)// Простая функция для детекта хука. Проверяет таблицу VMT на изменения адрессов функций
{
DWORD64 pVMT = *(DWORD64*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению
 
MODULEINFO mInfo;// Структура которая будет получать информацию о модуле (конкретно наша программа)
 
GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(0), &mInfo, sizeof(mInfo));// Можете в гугл заглянуть что делает эта функция
printf("Base adress %llp\n", mInfo.lpBaseOfDll);
 
DWORD64 EndFile = (DWORD64)mInfo.lpBaseOfDll + mInfo.SizeOfImage;// Вычисляем конец нашей программы базовый адресс + размер. Нужен для сравнения адрессов. Так как в основном адресса которые в таблице VMT не могут быть за пределами пространства программы
 
for (int i = 0; i < MaxCount; i++)// Перебор таблицы методов
{
printf("VMT check %llp\n", *(DWORD64*)pVMT);
if(*(DWORD64*)pVMT > EndFile)return 1;// Если адресс функции в таблице больше адресного пространства нашей программы то детект(Тоесть адресс ссылается на внешний код за пределами проги)
if (*(DWORD64*)pVMT < (DWORD64)mInfo.lpBaseOfDll)return 1;// Если адресс функции в таблице меньше (для тех кто выделил память ниже нашей проги)
 
pVMT += 8;//К первому адрессу в таблице прибавляем 8 байт это размер адрессов в х64 системе. Тем самым переходим на след функцию в таблице
}
 
 
return 0;// 0 если все адресса находятся в рамках пространства программы
}
 
 
int main()
{
TestVMT* pTestVMT = new TestVMT;
 
printf("class adr %llp\n", pTestVMT);
 
pTestVMT->Func4();// Проверка функции до хука
 
if(DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");//Проверка таблицы перед хуком
else
{
printf("VMT UNDetect hook\n");
}
 
system("pause");
 
LPVOID vAdress = VirtualAlloc(0, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память для хука (Имитируем что мы заинжектили чит)
memcpy(vAdress, (LPVOID)hookfunc, 100);// Запись кода hookfunc
printf("vAdress %llp\n", vAdress);
 
system("pause");
 
LPVOID adresshook = Hook(pTestVMT, &vAdress, 3);// Установка хука в VMT (1 класс 2 адресс хука 3 номер функции в таблице)
printf("adresshook %llp\n", adresshook);
system("pause");
 
pTestVMT->Func4();// Повторно вызывает функцию после хука для проверки
 
if (DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");// Повторно проверяем наше таблицу VMT класса
else
{
printf("VMT UNDetect hook\n");
}
 
system("pause");
 
return 1;
}
 
EFI_COMPROMISED_DATA
лучший в мире
Статус
Оффлайн
Регистрация
26 Янв 2018
Сообщения
920
Реакции[?]
1,632
Поинты[?]
85K
decltype придумали в 19XX, люди до:
вызов по дефолту импортируемых функций придумали в 19XX, люди до:
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции
MessageBoxS box = (MessageBoxS)0x7FFFB8B88120;// Адресс взят напрямую чтоб не заморачиваться
абсолютно бесполезная тема, вы бы хоть что-то новое выкладывали, ей богу.
 
Забаненный
Статус
Оффлайн
Регистрация
28 Фев 2022
Сообщения
24
Реакции[?]
5
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Установка и обнаружение VMT Хука (Виртуальная таблица методов класса)

В примере видно как легко детектится такой хук. Как обойти такую простую проверку!?
1. Для хука заходить во внутрь функции и установить хук в самой функции а не в vmt.
2. Записать код хука в пустом месте адресного пространства программы места там хватает чтоб записать хотябы редирект
тем самым адресс хука в vmt будет находится в адресном пространстве программы и условный античит пропустить такой код


1. Для теста создаем консольный проект на C++ и пропишем простой класс с VMT
Код:
class TestVMT//Простой класс с использованием VMT
{
public:

    virtual void Func1();
    virtual void Func2();
    virtual void Func3();
    virtual void Func4();
    virtual void Func5();

    DWORD64 ad = 0;

};

void TestVMT::Func1()
{
    MessageBoxA(0, "Func1", 0, 0);
}

void TestVMT::Func2()
{
    MessageBoxA(0, "Func2", 0, 0);
}

void TestVMT::Func3()
{
    MessageBoxA(0, "Func3", 0, 0);
}

void TestVMT::Func4()
{
    MessageBoxA(0, "Func4", 0, 0);
}

void TestVMT::Func5()
{
    MessageBoxA(0, "Func5", 0, 0);
}
2. Напишем функцию которая будет в роле хука
Код:
typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции
MessageBoxS box = (MessageBoxS)0x7FFFB8B88120;// Адресс взят напрямую чтоб не заморачиваться


void hookfunc()//функция которая будет выполняться вместо оригинала
{  
    box(0, 0, 0, 0);
}
3. Напишем функцию которая будет устанавливать хук
Код:
LPVOID Hook(LPVOID pClass, LPVOID pHookFunc, int dwOffset)// Функция которая устанавливает хук в виртуальной таблице методов (VMT)
{
    LPVOID pVTable = *(LPVOID*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению
    LPVOID pAdressInTable = (LPVOID)((DWORD64)pVTable + dwOffset * 8);//Вычисляем адресс функции в таблице по ее порядковому номеру


    DWORD dwOldProtection;
    VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), PAGE_READWRITE, &dwOldProtection);// меняем параметры страницы установка флага чтение запись

    memcpy(pAdressInTable, pHookFunc, 8);//Записываем наш адресс хука

    VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), dwOldProtection, &dwOldProtection);// Восстановили параметры страницы

    return (LPVOID)pAdressInTable;// Вернули адресс из таблицы где установили хук
}
4. Пишем функцию для детекта хука
Код:
bool DetectVMT(LPVOID pClass, int MaxCount)// Простая функция для детекта хука. Проверяет таблицу VMT на изменения адрессов функций
{
    DWORD64 pVMT = *(DWORD64*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению

    MODULEINFO mInfo;// Структура которая будет получать информацию о модуле (конкретно наша программа)

    GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(0), &mInfo, sizeof(mInfo));// Можете в гугл заглянуть что делает эта функция
    printf("Base adress %llp\n", mInfo.lpBaseOfDll);

    DWORD64 EndFile = (DWORD64)mInfo.lpBaseOfDll + mInfo.SizeOfImage;// Вычисляем конец нашей программы базовый адресс + размер. Нужен для сравнения адрессов. Так как в основном адресса которые в таблице VMT не могут быть за пределами пространства программы

    for (int i = 0; i < MaxCount; i++)// Перебор таблицы методов
    {
        printf("VMT check %llp\n", *(DWORD64*)pVMT);
        if(*(DWORD64*)pVMT > EndFile)return 1;// Если адресс функции в таблице больше адресного пространства нашей программы то детект(То есть адресс ссылается на внешний код за пределами проги)
        if (*(DWORD64*)pVMT < (DWORD64)mInfo.lpBaseOfDll)return 1;// Если адресс функции в таблице меньше (для тех кто выделил память ниже нашей проги)

        pVMT += 8;//К первому адрессу в таблице прибавляем 8 байт это размер адрессов в х64 системе. Тем самым переходим на след функцию в таблице
    }


    return 0;// 0 если все адресса находятся в рамках пространства программы
}
5. Точка входа программы и использование функций
Код:
int main()
{
    TestVMT* pTestVMT = new TestVMT;

    printf("class adr %llp\n", pTestVMT);

    pTestVMT->Func4();// Проверка функции до хука

    if(DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");//Проверка таблицы перед хуком
    else
    {
        printf("VMT UNDetect hook\n");
    }

    system("pause");

    LPVOID vAdress = VirtualAlloc(0, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память для хука (Имитируем что мы заинжектили чит)
    memcpy(vAdress, (LPVOID)hookfunc, 100);// Запись кода hookfunc
    printf("vAdress %llp\n", vAdress);

    system("pause");

    LPVOID adresshook = Hook(pTestVMT, &vAdress, 3);// Установка хука в VMT (1 класс 2 адресс хука 3 номер функции в таблице)
    printf("adresshook %llp\n", adresshook);
    system("pause");

    pTestVMT->Func4();// Повторно вызывает функцию после хука для проверки

    if (DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");// Повторно проверяем наше таблицу VMT класса
    else
    {
        printf("VMT UNDetect hook\n");
    }

    system("pause");

    return 1;
}
Дополнение:
- Как наглядно выглядит таблица (VMT) по нулевому смещению в классе
Пожалуйста, авторизуйтесь для просмотра ссылки.

- После установки хука но номеру функции
Пожалуйста, авторизуйтесь для просмотра ссылки.

- Номер функции это порядковый номер
Пожалуйста, авторизуйтесь для просмотра ссылки.


Код:
#include <windows.h>
#include <stdio.h>
#include <Psapi.h>

class TestVMT//Простой класс с использованием VMT
{
public:

virtual void Func1();
virtual void Func2();
virtual void Func3();
virtual void Func4();
virtual void Func5();

DWORD64 ad = 0;

};

void TestVMT::Func1()
{
MessageBoxA(0, "Func1", 0, 0);
}

void TestVMT::Func2()
{
MessageBoxA(0, "Func2", 0, 0);
}

void TestVMT::Func3()
{
MessageBoxA(0, "Func3", 0, 0);
}

void TestVMT::Func4()
{
MessageBoxA(0, "Func4", 0, 0);
}

void TestVMT::Func5()
{
MessageBoxA(0, "Func5", 0, 0);
}

typedef int (WINAPI* MessageBoxS)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);// Прототип функции
MessageBoxS box = (MessageBoxS)0x7FFFB8B88120;// Адресс взят напрямую чтоб не заморачиваться


void hookfunc()//функция которая будет выполняться вместо  оригинала
{
box(0, 0, 0, 0);
}

LPVOID Hook(LPVOID pClass, LPVOID pHookFunc, int dwOffset)// Функция которая устанавливает хук в виртуальной таблице методов (VMT)
{
LPVOID pVTable = *(LPVOID*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению
LPVOID pAdressInTable = (LPVOID)((DWORD64)pVTable + dwOffset * 8);//Вычисляем адресс функции в таблице по ее порядковому номеру


DWORD dwOldProtection;
VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), PAGE_READWRITE, &dwOldProtection);// меняем параметры страницы установка флага чтение запись

memcpy(pAdressInTable, pHookFunc, 8);//Записываем наш адресс хука

VirtualProtect((LPVOID)pAdressInTable, sizeof(pAdressInTable), dwOldProtection, &dwOldProtection);// Восстановили параметры страницы

return (LPVOID)pAdressInTable;// Вернули адресс из таблицы где установили хук
}

bool DetectVMT(LPVOID pClass, int MaxCount)// Простая функция для детекта хука. Проверяет таблицу VMT на изменения адрессов функций
{
DWORD64 pVMT = *(DWORD64*)pClass;//Получаем адресс vmt таблица всегда находится по нулевому смещению

MODULEINFO mInfo;// Структура которая будет получать информацию о модуле (конкретно наша программа)

GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(0), &mInfo, sizeof(mInfo));// Можете в гугл заглянуть что делает эта функция
printf("Base adress %llp\n", mInfo.lpBaseOfDll);

DWORD64 EndFile = (DWORD64)mInfo.lpBaseOfDll + mInfo.SizeOfImage;// Вычисляем конец нашей программы базовый адресс + размер. Нужен для сравнения адрессов. Так как в основном адресса которые в таблице VMT не могут быть за пределами пространства программы

for (int i = 0; i < MaxCount; i++)// Перебор таблицы методов
{
printf("VMT check %llp\n", *(DWORD64*)pVMT);
if(*(DWORD64*)pVMT > EndFile)return 1;// Если адресс функции в таблице больше адресного пространства нашей программы то детект(Тоесть адресс ссылается на внешний код за пределами проги)
if (*(DWORD64*)pVMT < (DWORD64)mInfo.lpBaseOfDll)return 1;// Если адресс функции в таблице меньше (для тех кто выделил память ниже нашей проги)

pVMT += 8;//К первому адрессу в таблице прибавляем 8 байт это размер адрессов в х64 системе. Тем самым переходим на след функцию в таблице
}


return 0;// 0 если все адресса находятся в рамках пространства программы
}


int main()
{
TestVMT* pTestVMT = new TestVMT;

printf("class adr %llp\n", pTestVMT);

pTestVMT->Func4();// Проверка функции до хука

if(DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");//Проверка таблицы перед хуком
else
{
printf("VMT UNDetect hook\n");
}

system("pause");

LPVOID vAdress = VirtualAlloc(0, 100, MEM_COMMIT, PAGE_EXECUTE_READWRITE);// Выделяем память для хука (Имитируем что мы заинжектили чит)
memcpy(vAdress, (LPVOID)hookfunc, 100);// Запись кода hookfunc
printf("vAdress %llp\n", vAdress);

system("pause");

LPVOID adresshook = Hook(pTestVMT, &vAdress, 3);// Установка хука в VMT (1 класс 2 адресс хука 3 номер функции в таблице)
printf("adresshook %llp\n", adresshook);
system("pause");

pTestVMT->Func4();// Повторно вызывает функцию после хука для проверки

if (DetectVMT(pTestVMT, 5))printf("VMT Detect hook\n");// Повторно проверяем наше таблицу VMT класса
else
{
printf("VMT UNDetect hook\n");
}

system("pause");

return 1;
}
upd:
смысл от этого "гайда" когда уже есть миллион тем на счет вмт хуков...
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
Оставлю комментарии по типу: "Зачем выкладывать то, что есть в гугле", за теми, кто уже написал подобное выше, все же, мб, кто-то случайно наткнется и узнает об этом.
Но вот так детектить наличие или отсутствие хука "if(*(DWORD64*)pVMT > EndFile)return 1;" - немного странновато, ибо что мешает "атакующему" например найти код кейв и записать туда свой шк? Конечно, такая возможность есть не всегда, но как бы есть и другие варианты для записи, + лучше же сделать проверку, которая будет учитывать такой момент.
 
Последнее редактирование:
FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
decltype придумали в 19XX, люди до:
вызов по дефолту импортируемых функций придумали в 19XX, люди до:


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

upd:
смысл от этого "гайда" когда уже есть миллион тем на счет вмт хуков...
Смысл не в том как поставить хук. Смысл в то что это детект на раз два. Большинство пастеров на вф это используют а потом ноют что их банит
Тем кому это не интересно не срите в тему. Найдутся люди кому это будет полезно. По форуму подробных гайдов не нашел. Спецом в поиске пробивал
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
EFI_COMPROMISED_DATA
лучший в мире
Статус
Оффлайн
Регистрация
26 Янв 2018
Сообщения
920
Реакции[?]
1,632
Поинты[?]
85K
Друг, ну ты тему переводишь, он же ничего не говорил про детуры и их степень обнаружения ;)
я про то, что и детур и вмт хуки детектят спокойно, тема бесполезная максимально
 
Забаненный
Статус
Оффлайн
Регистрация
19 Янв 2022
Сообщения
50
Реакции[?]
18
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
А как без перевода? Если VMT хук нельзя, то что можно?
2. Записать код хука в пустом месте адресного пространства программы места там хватает чтоб записать хотябы редирект
тем самым адресс хука в vmt будет находится в адресном пространстве программы и условный античит пропустить такой код
Можно так. В некоторых случаях помогает
 
Забаненный
Статус
Оффлайн
Регистрация
19 Янв 2022
Сообщения
50
Реакции[?]
18
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно так. В некоторых случаях помогает
Что за хуйня? Это бесполезно чуть меньше, чем полностью.
Тот хук что показан у тебя в коде равноценен патчу .text секции, и чел выше правильно сравнил его с диторами.
Зачем античиту проверять, что адрес находится в разрешенном модуле, когда он может проверить целостность read-only секции?
При этом твой детект требует знания семантики объекта, что правильнее использовать для обнаружения подмены виртуальной таблицы, а не ее патча.
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
13 Мар 2018
Сообщения
306
Реакции[?]
52
Поинты[?]
1K
мо
я про то, что и детур и вмт хуки детектят спокойно, тема бесполезная максимально
можешь подсказать альтернативы или сделать так чтобы не детектило детур :)
 
FanHack Team
Пользователь
Статус
Оффлайн
Регистрация
26 Сен 2017
Сообщения
72
Реакции[?]
51
Поинты[?]
0
мо

можешь подсказать альтернативы или сделать так чтобы не детектило детур :)

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.




Результат в скринах:
Оригинал класса
Пожалуйста, авторизуйтесь для просмотра ссылки.

Оригинал VMT
Пожалуйста, авторизуйтесь для просмотра ссылки.

После установки меняется адресс VMT на наш
Пожалуйста, авторизуйтесь для просмотра ссылки.

Хук установлен
Пожалуйста, авторизуйтесь для просмотра ссылки.

Ну а в оригинальном коде все как должно быть
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Забаненный
Статус
Оффлайн
Регистрация
22 Апр 2020
Сообщения
731
Реакции[?]
752
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Скрытое содержимое


Результат в скринах:
Оригинал класса
Пожалуйста, авторизуйтесь для просмотра ссылки.

Оригинал VMT
Пожалуйста, авторизуйтесь для просмотра ссылки.

После установки меняется адресс VMT на наш
Пожалуйста, авторизуйтесь для просмотра ссылки.

Хук установлен
Пожалуйста, авторизуйтесь для просмотра ссылки.

Ну а в оригинальном коде все как должно быть
Пожалуйста, авторизуйтесь для просмотра ссылки.
Щас бы использовать VirtualProtect для хука
 
Сверху Снизу