Ставим хуки

В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В этом гайде я расскажу про использование библиотеки detour для сетапа хуков.
Поехали.
Создаём Win32 Dll.
Скачиваем
Пожалуйста, авторизуйтесь для просмотра ссылки.
(клик) с файлами.
После создания проекта добавляем файлы из архива в папку с проектом и в сам проект.
После в файле DllMain подключаем всё файлы
Код:
#include <Windows.h>
#include <iostream>
#include "detours.h"
#include "PatternScan.h"
Далее создаём объекты для работы

Код:
DWORD FuncAddr= 0;
PatternScan * Scanner = nullptr;
После описываем апиентри дллки
Код:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
//Здесь будет наш паттерн.
FuncAddr = Scanner->FindPattern(" ", " ", " ");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//сетап хука
DetourAttach(&(LPVOID&)FuncAddr, &OurHooked;
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//снятие хука
DetourDetach(&(LPVOID&)FuncAddr, &OurHooked);
DetourTransactionCommit();
delete Scanner;
}
return TRUE;
}
После этого мы начинаем искать что мы будем хукать.
Допустим у нас есть такое приложение
Код:
#include <Windows.h>
#include <iostream>
int FuncToHooked(int a, int b)
{
return a + b;
}

int main()
{
while (true)
{
std::cout << FuncToHooked(5,5) << std::endl;
Sleep(2000);
}
}
Теперь для иды нужно поставить
Пожалуйста, авторизуйтесь для просмотра ссылки.
плагин.
Кидаем в папку Plugins

заходим в IDA 6.8
и ищем нашу функцию.
Вот она:

Далее пкм по ней и Text View

Видим что-то типо этого

Это и есть наша функция.
Выделяем её от типа до retn.

Далее жмём Edit -> Plugins -> SigMaker
и выбираем второе
и жмём ОК.

В низу появится паттерн + маска

Выделаем и идём в студию.
Видим Это
Код:
FuncAddr = Scanner->FindPattern(" ", " ", " ");
В первый параметр передаём имя процесса, во второе паттерн, и в 3 маску.

В результате у вас получится примерно это
Код:
FuncAddr = Scanner->FindPattern("testprogram.exe", " \x55\x8B\xEC\x8B\x45\x08\x03\x45\x0C\x5D\xC3", "xxxxxxxxxxx");
Всё теперь осталось описать Хук-функцию. Идём вверх(над апиентри) и создаём тайпдеф нашей функции с параметрами(или без) - это мы увидим в IDA.

Хукаемая функция выглядит так:
int __cdecl FuncToHooked(int a, int b)

И наш тайпдеф будет таким
Код:
typedef int(*hFunc)(int a, int b);
Далее опишем саму функцию

Код:
int OurHooked(int a, int b)
{
a += 100;
b += 50;
hFunc original = (hFunc)FuncAddr;
return original(a,b);
}
Наша хукаемая функция возвращает сумму a , b;
Теперь при хуке будет не 5 + 5, а 105 + 55.

Ну в принципе всё. Для хука void функций делайте так:

Код:
typedef LPVOID(*hFunc)(int a, int b);
kek OurHooked(int a, int b)
{
a += 100;
hFunc original = (hFunc)FuncAddr;
return (hFunc)original(a,b);
}
Пробуйте)
 
Последнее редактирование:
push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Топово, делали бы побольше таких гайдусов
 
Легенда форума
Статус
Оффлайн
Регистрация
5 Июл 2014
Сообщения
1,722
Реакции[?]
957
Поинты[?]
6K
В этом гайде я расскажу про использование библиотеки detour для сетапа хуков.
Поехали.
Создаём Win32 Dll.
Скачиваем
Пожалуйста, авторизуйтесь для просмотра ссылки.
(клик) с файлами.
После создания проекта добавляем файлы из архива в папку с проектом и в сам проект.
После в файле DllMain подключаем всё файлы
Код:
#include <Windows.h>
#include <iostream>
#include "detours.h"
#include "PatternScan.h"
Далее создаём объекты для работы

Код:
DWORD FuncAddr= 0;
PatternScan * Scanner = nullptr;
После описываем апиентри дллки
Код:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
//Здесь будет наш паттерн.
FuncAddr = Scanner->FindPattern(" ", " ", " ");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//сетап хука
DetourAttach(&(LPVOID&)FuncAddr, &OurHooked;
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//снятие хука
DetourDetach(&(LPVOID&)FuncAddr, &OurHooked);
DetourTransactionCommit();
delete Scanner;
}
return TRUE;
}
После этого мы начинаем искать что мы будем хукать.
Допустим у нас есть такое приложение
Код:
#include <Windows.h>
#include <iostream>
int FuncToHooked(int a, int b)
{
return a + b;
}

int main()
{
while (true)
{
std::cout << FuncToHooked(5,5) << std::endl;
Sleep(2000);
}
}
Теперь для иды нужно поставить
Пожалуйста, авторизуйтесь для просмотра ссылки.
плагин.
Кидаем в папку Plugins

заходим в IDA 6.8
и ищем нашу функцию.
Вот она:

Далее пкм по ней и Text View

Видим что-то типо этого

Это и есть наша функция.
Выделяем её от типа до retn.

Далее жмём Edit -> Plugins -> SigMaker
и выбираем второе
и жмём ОК.

В низу появится паттерн + маска

Выделаем и идём в студию.
Видим Это
Код:
FuncAddr = Scanner->FindPattern(" ", " ", " ");
В первый параметр передаём имя процесса, во второе паттерн, и в 3 маску.

В результате у вас получится примерно это
Код:
FuncAddr = Scanner->FindPattern("testprogram.exe", " \x55\x8B\xEC\x8B\x45\x08\x03\x45\x0C\x5D\xC3", "xxxxxxxxxxx");
Всё теперь осталось описать Хук-функцию. Идём вверх(над апиентри) и создаём тайпдеф нашей функции с параметрами(или без) - это мы увидим в IDA.

Хукаемая функция выглядит так:
int __cdecl FuncToHooked(int a, int b)

И наш тайпдеф будет таким
Код:
typedef int(*hFunc)(int a, int b);
Далее опишем саму функцию

Код:
int OurHooked(int a, int b)
{
a += 100;
b += 50;
hFunc original = (hFunc)FuncAddr;
return original(a,b);
}
Наша хукаемая функция возвращает сумму a , b;
Теперь при хуке будет не 5 + 5, а 105 + 55.

Ну в принципе всё. Для хука void функций делайте так:

Код:
typedef LPVOID(*hFunc)(int a, int b);
kek OurHooked(int a, int b)
{
a += 100;
hFunc original = (hFunc)FuncAddr;
return (hFunc)original(a,b);
}
Пробуйте)
Если писал сам, то несомненно огромный +
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
2 Сен 2017
Сообщения
249
Реакции[?]
70
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Есть у кого IDA 6.8?
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не. Её во фри доступе нету (но это не точно).

Короче вместо паттернсканера можно просто задать адрес функции. В читенджине найди и задай значение переменной DWORD FuncAddr = 0x000000;
где 000000 адрес функции
 
Забаненный
Статус
Оффлайн
Регистрация
2 Сен 2017
Сообщения
249
Реакции[?]
70
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не. Её во фри доступе нету (но это не точно).

Короче вместо паттернсканера можно просто задать адрес функции. В читенджине найди и задай значение переменной DWORD FuncAddr = 0x000000;
где 000000 адрес функции
Блять, я не понял нихуя.
Для просмотра содержимого вам необходимо авторизоваться.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
2 Сен 2017
Сообщения
249
Реакции[?]
70
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
null
Участник
Статус
Оффлайн
Регистрация
3 Окт 2014
Сообщения
700
Реакции[?]
498
Поинты[?]
0
Не. Её во фри доступе нету (но это не точно).

Короче вместо паттернсканера можно просто задать адрес функции. В читенджине найди и задай значение переменной DWORD FuncAddr = 0x000000;
где 000000 адрес функции
С 2к15 везде валяется
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Не. Её во фри доступе нету (но это не точно).
Пожалуйста, авторизуйтесь для просмотра ссылки.

"Сломаем систему" вместе.......
В архиве IdaPro6.8+HexRay, правленые базы под нее, исправленные модули и пару "полезностей" для понимающих
 
Пользователь
Статус
Оффлайн
Регистрация
7 Мар 2017
Сообщения
306
Реакции[?]
78
Поинты[?]
0
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу