Сейчас на форуме: tyns777, bezumchik (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Помощь по хукам . MinHook или другие.
Посл.ответ Сообщение

Ранг: 1.5 (гость)
Активность: 0.01=0.01
Статус: Участник

Создано: 14 августа 2019 22:16
· Личное сообщение · #1

Грубо говоря есть код . Набросал .
Как используя библиотеку MinHook хукнуть что то от туда ? Можно через Easyhook.


Кто может создать пример для разбора , а то я вообще не понимаю .



Code:
  1. // Создаем окно при помощи шаблона
  2. // Visual Studio C++ WinApi
  3.  
  4. // Подключаем библиотеки Windows для Win32
  5. #include <windows.h>
  6.  
  7. // Объявляем прототип CALLBACK функции
  8. LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  9.  
  10. // Функция WinAPI для точки входа в программу
  11. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  12. {
  13.          // Регистрация класса окна
  14.          // Объявляем переменную типа WNDCLASSEX
  15.  
  16.          WNDCLASSEX wClass;
  17.          ZeroMemory(&wClass, sizeof(WNDCLASSEX)); // Обнуляем память
  18.  
  19.          // Заполняем структуру WNDCLASSEX
  20.          wClass.cbSize = sizeof(WNDCLASSEX); // Размер равен размеру структуры
  21.          wClass.hbrBackground = (HBRUSH)COLOR_WINDOW; // Определяем фон окна
  22.          wClass.hInstance = hInstance; // hInstance window
  23.          wClass.lpfnWndProc = (WNDPROC)WndProc; // Процедура обработки окна
  24.          wClass.lpszClassName = "My Window Class"; // Имя класса
  25.  
  26.  
  27.          // Если произошла ошибка, то выводим сообщение
  28.          if (!RegisterClassEx(&wClass))
  29.          {
  30.                  int nResult = GetLastError();
  31.                  MessageBox(NULL, "Класс окна не был создан!", "Ошибка", MB_ICONERROR);
  32.          }
  33.  
  34.          // Создаем окно при помощи функции WinApi CreateWindowEx
  35.          HWND hWindow = CreateWindowEx(NULL,
  36.                  "My Window Class", // Имя класса, который мы определили ранее
  37.                  "Мое первое окно с WinApi", // Заголовок окна
  38.                  WS_OVERLAPPEDWINDOW,
  39.                  300, // x координата по горизонтали
  40.                  200, // y координата по вертикали
  41.                  640, // ширина создаваемого окна
  42.                  480, // высота создаваемого окна
  43.                  NULL,
  44.                  NULL,
  45.                  hInstance, // переменная экземпляра приложения
  46.                  NULL);
  47.  
  48.          // Если окно не было создано, то выдаем сообщение
  49.          if (!hWindow)
  50.          {
  51.                  int nResult = GetLastError();
  52.                  MessageBox(NULL, "Окно не было создано!", "Ошибка", MB_ICONERROR);
  53.          }
  54.  
  55.          // Показываем окно
  56.          ShowWindow(hWindow, nShowCmd);
  57.  
  58.          // Объявляем переменную для сообщений типа MSG
  59.          MSG msg;
  60.          // Обнуляем память по размеру структуры MSG
  61.          ZeroMemory(&msg, sizeof(MSG));
  62.  
  63.          // Цикл обработки сообщений
  64.          while (GetMessage(&msg, NULL, 0, 0))
  65.          {
  66.                  TranslateMessage(&msg);
  67.                  DispatchMessage(&msg);
  68.          }
  69.  
  70.          return 0;
  71. }
  72.  
  73. // определяем процедуру обратного вызова (WinApi)
  74.  
  75. LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  76. {
  77.          switch (uMsg)
  78.          {
  79.          case WM_CREATE:
  80.          {
  81.  
  82.                  HWND hButton = CreateWindow(
  83.                         "BUTTON",
  84.                         "MessageBox!",
  85.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  86.                         0, 0, 150, 30, hwnd, reinterpret_cast<HMENU>(1337), nullptr, nullptr 
  87.                  );
  88.  
  89.                  HWND lButton = CreateWindow(
  90.                         "BUTTON",
  91.                         "MessageBoxA!",
  92.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  93.                         480, 0, 150, 30, hwnd, reinterpret_cast<HMENU>(1336), nullptr, nullptr
  94.                  );
  95.  
  96.                  HWND pButton = CreateWindow(
  97.                         "BUTTON",
  98.                         "MessageBoxW!",
  99.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  100.                         0, 350, 150, 30, hwnd, reinterpret_cast<HMENU>(1335), nullptr, nullptr
  101.                  );
  102.  
  103.                  HWND RRButton = CreateWindow(
  104.                         "BUTTON",
  105.                         "MessageBeep!",
  106.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  107.                         480, 350, 150, 30, hwnd, reinterpret_cast<HMENU>(1334), nullptr, nullptr
  108.                  );
  109.                  // Здесь будем создавать элементы управления окна
  110.                  break;
  111.          }
  112.  
  113.          case WM_COMMAND:
  114.          {
  115.                  switch (LOWORD(wParam))
  116.                  {
  117.                  case 1337:
  118.                         {
  119.                         MessageBox(hwnd, "MessageBox", "ne",MB_OK);
  120.                         }
  121.                         break;
  122.  
  123.                  case 1336:
  124.                         {
  125.                         MessageBoxA(hwnd, "MessageBoxA", "ne", MB_OK);
  126.                         }
  127.                         break;
  128.  
  129.                  case 1335:
  130.                         {
  131.                         MessageBoxW(hwnd, L"MessageBoxW", L"ne", MB_OK);
  132.                         }
  133.                         break;
  134.                  case 1334:
  135.                         {
  136.                         MessageBeep(MB_OK );
  137.                         }
  138.                         break;
  139.                         // Обработка команд (нажатие кнопок, мыши, полей ввода и т.д.)
  140.                  }
  141.  
  142.                  break;
  143.          }
  144.  
  145.          case WM_DESTROY: // Обработка нажатия кнопки закрытия окна
  146.          {
  147.                  // команда Закрыть окно
  148.                  PostQuitMessage(0);
  149.                  return 0;
  150.                  break;
  151.          }
  152.          }
  153.  
  154.          return DefWindowProc(hwnd, uMsg, wParam, lParam);
  155. }




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 14 августа 2019 22:45
· Личное сообщение · #2

Принципиально использовать именно эти библиотеки? Есть Blackbone, она несколько сложнее, но зато значительно функциональней, и в ней в том числе примеры есть для хука чужих процессов.

| Сообщение посчитали полезным: plutos, sty


Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 14 августа 2019 23:00 · Поправил: UniSoft
· Личное сообщение · #3

google что-ли забанили?
https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra

Code:
  1. // Создаем окно при помощи шаблона
  2. // Visual Studio C++ WinApi
  3.  
  4. // Подключаем библиотеки Windows для Win32
  5. #include <windows.h>
  6.  
  7. // Подключаем библиотеки MinHook
  8. #include "MinHook.h"
  9. #if defined _M_X64
  10. #pragma comment(lib, "libMinHook.x64.lib")
  11. #elif defined _M_IX86
  12. #pragma comment(lib, "libMinHook.x86.lib")
  13. #endif
  14.  
  15. // Объявим прототип функции
  16. typedef int (WINAPI *MESSAGEBOXA)(HWND, LPCSTR, LPCSTR, UINT);
  17. // Указатель для вызова оригинальной функции MessageBoxA
  18. MESSAGEBOXA fpMessageBoxA = NULL;
  19.  
  20. // Объявляем прототип CALLBACK функции
  21. LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  22.  
  23. // Функция которая "перекрывает" MessageBoxA.
  24. int WINAPI DetourMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
  25. {
  26.          // если (lpCaption == "ne") то заменим его на "Hooked!", иначе выводим как есть
  27.          if (lpCaption && *lpCaption == 'n')
  28.                  lpCaption = "Hooked!";
  29.          
  30.          return fpMessageBoxA(hWnd, lpText, lpCaption, uType);
  31. }
  32.  
  33. // Функция WinAPI для точки входа в программу
  34. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  35. {
  36.          // Инициализируем MinHook
  37.                   if (MH_Initialize() != MH_OK)
  38.                         return -1;
  39.                   
  40.                   // Поставим хук на MessageBoxA
  41.                   if (MH_CreateHookApi(L"user32.dll", "MessageBoxA", &DetourMessageBoxA, &fpMessageBoxA) != MH_OK)
  42.                   {
  43.                         MH_Uninitialize(); // Деинициализируем MinHook
  44.                         return -1;
  45.                   }
  46.                   
  47.                   // вот и все хук(и) установлены, осталось их включить
  48.                   // можно включить только интересующие:
  49.                   //  if (MH_EnableHook(&MessageBoxA) != MH_OK) return -1;
  50.                   // либо просто сразу все
  51.                   MH_EnableHook(MH_ALL_HOOKS);
  52.  
  53.                   // Регистрация класса окна
  54.          // Объявляем переменную типа WNDCLASSEX
  55.  
  56.          WNDCLASSEX wClass;
  57.          ZeroMemory(&wClass, sizeof(WNDCLASSEX)); // Обнуляем память
  58.  
  59.          // Заполняем структуру WNDCLASSEX
  60.          wClass.cbSize = sizeof(WNDCLASSEX); // Размер равен размеру структуры
  61.          wClass.hbrBackground = (HBRUSH)COLOR_WINDOW; // Определяем фон окна
  62.          wClass.hInstance = hInstance; // hInstance window
  63.          wClass.lpfnWndProc = (WNDPROC)WndProc; // Процедура обработки окна
  64.          wClass.lpszClassName = "My Window Class"; // Имя класса
  65.  
  66.  
  67.          // Если произошла ошибка, то выводим сообщение
  68.          if (!RegisterClassEx(&wClass))
  69.          {
  70.                  int nResult = GetLastError();
  71.                  MessageBox(NULL, "Класс окна не был создан!", "Ошибка", MB_ICONERROR);
  72.          }
  73.  
  74.          // Создаем окно при помощи функции WinApi CreateWindowEx
  75.          HWND hWindow = CreateWindowEx(NULL,
  76.                  "My Window Class", // Имя класса, который мы определили ранее
  77.                  "Мое первое окно с WinApi", // Заголовок окна
  78.                  WS_OVERLAPPEDWINDOW,
  79.                  300, // x координата по горизонтали
  80.                  200, // y координата по вертикали
  81.                  640, // ширина создаваемого окна
  82.                  480, // высота создаваемого окна
  83.                  NULL,
  84.                  NULL,
  85.                  hInstance, // переменная экземпляра приложения
  86.                  NULL);
  87.  
  88.          // Если окно не было создано, то выдаем сообщение
  89.          if (!hWindow)
  90.          {
  91.                  int nResult = GetLastError();
  92.                  MessageBox(NULL, "Окно не было создано!", "Ошибка", MB_ICONERROR);
  93.          }
  94.  
  95.          // Показываем окно
  96.          ShowWindow(hWindow, nShowCmd);
  97.  
  98.          // Объявляем переменную для сообщений типа MSG
  99.          MSG msg;
  100.          // Обнуляем память по размеру структуры MSG
  101.          ZeroMemory(&msg, sizeof(MSG));
  102.  
  103.          // Цикл обработки сообщений
  104.          while (GetMessage(&msg, NULL, 0, 0))
  105.          {
  106.                  TranslateMessage(&msg);
  107.                  DispatchMessage(&msg);
  108.          }
  109.                   
  110.                   // Отключаем все установленные хуки (они выключаются, но не удаляются, можно снова включить)
  111.                   MH_DisableHook(MH_ALL_HOOKS);
  112.                   
  113.                   // Деинициализируем MinHook
  114.                   MH_Uninitialize();
  115.  
  116.          return 0;
  117. }
  118.  
  119. // определяем процедуру обратного вызова (WinApi)
  120.  
  121. LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  122. {
  123.          switch (uMsg)
  124.          {
  125.          case WM_CREATE:
  126.          {
  127.  
  128.                  HWND hButton = CreateWindow(
  129.                         "BUTTON",
  130.                         "MessageBox!",
  131.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  132.                         0, 0, 150, 30, hwnd, reinterpret_cast<HMENU>(1337), nullptr, nullptr 
  133.                  );
  134.  
  135.                  HWND lButton = CreateWindow(
  136.                         "BUTTON",
  137.                         "MessageBoxA!",
  138.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  139.                         480, 0, 150, 30, hwnd, reinterpret_cast<HMENU>(1336), nullptr, nullptr
  140.                  );
  141.  
  142.                  HWND pButton = CreateWindow(
  143.                         "BUTTON",
  144.                         "MessageBoxW!",
  145.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  146.                         0, 350, 150, 30, hwnd, reinterpret_cast<HMENU>(1335), nullptr, nullptr
  147.                  );
  148.  
  149.                  HWND RRButton = CreateWindow(
  150.                         "BUTTON",
  151.                         "MessageBeep!",
  152.                         WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  153.                         480, 350, 150, 30, hwnd, reinterpret_cast<HMENU>(1334), nullptr, nullptr
  154.                  );
  155.                  // Здесь будем создавать элементы управления окна
  156.                  break;
  157.          }
  158.  
  159.          case WM_COMMAND:
  160.          {
  161.                  switch (LOWORD(wParam))
  162.                  {
  163.                  case 1337:
  164.                         {
  165.                         MessageBox(hwnd, "MessageBox", "ne",MB_OK);
  166.                         }
  167.                         break;
  168.  
  169.                  case 1336:
  170.                         {
  171.                         MessageBoxA(hwnd, "MessageBoxA", "ne", MB_OK);
  172.                         }
  173.                         break;
  174.  
  175.                  case 1335:
  176.                         {
  177.                         MessageBoxW(hwnd, L"MessageBoxW", L"ne", MB_OK);
  178.                         }
  179.                         break;
  180.                  case 1334:
  181.                         {
  182.                         MessageBeep(MB_OK );
  183.                         }
  184.                         break;
  185.                         // Обработка команд (нажатие кнопок, мыши, полей ввода и т.д.)
  186.                  }
  187.  
  188.                  break;
  189.          }
  190.  
  191.          case WM_DESTROY: // Обработка нажатия кнопки закрытия окна
  192.          {
  193.                  // команда Закрыть окно
  194.                  PostQuitMessage(0);
  195.                  return 0;
  196.                  break;
  197.          }
  198.          }
  199.  
  200.          return DefWindowProc(hwnd, uMsg, wParam, lParam);
  201. }


| Сообщение посчитали полезным: plutos, sty


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 14 августа 2019 23:29
· Личное сообщение · #4

user99 пишет:
Есть Blackbone, она несколько сложнее


Если ты вот про это, то и правда годная штука!

--> Blackbone <-- Windows memory hacking library

-----
Give me a HANDLE and I will move the Earth.




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 15 августа 2019 09:15
· Личное сообщение · #5

UniSoft, могу предположить автору нужно хукнуть чужой процесс, а не свой собственный. MinHook в примерах не содержит такого, т.е. нужно самому писать подгрузку своей библиотеки в чужой процесс.

plutos, про нее. сам разбирал эту библиотеку когда не мог понять, почему мои хуки на x64 не работают




Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 15 августа 2019 12:03 · Поправил: UniSoft
· Личное сообщение · #6

user99 пишет:
могу предположить автору нужно хукнуть чужой процесс, а не свой собственный. MinHook в примерах не содержит такого, т.е. нужно самому писать подгрузку своей библиотеки в чужой процесс.

Да вроде условие четко описано
...есть код. Набросал. Как используя библиотеку MinHook хукнуть что то от туда?
Ну даже если и другой процесс, принцип то тот-же, а внедрение dll это уже другая задача.

user99 пишет:
Есть Blackbone

Как по мне, так она сильно навороченная... избыточная для простых задач...
MinHook же интересна своим минимализмом и простотой.



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 15 августа 2019 23:35
· Личное сообщение · #7

UniSoft, в MinHook есть пример хукающий свой собственный MessageBox, навряд ли автор настолько глуп, что не может запустить готовый пример, так что скорей всего проблема с хуком чужого процесса. Blackbone, как я и писал, "несколько сложнее", но других готовых библиотек с встроенной возможностью внедрения в чужой процесс я не знаю. в любом случае ждем автора, а то он куда-то запропастился



Ранг: -26.7 (нарушитель), 7thx
Активность: 0.060.08
Статус: Участник

Создано: 17 августа 2019 06:36
· Личное сообщение · #8

Еще вот эту библиотеку с похожим функционалом хвалят. Вроде бы неплохо документирована и примеров в комплекте куча. Бесплатна, правда, только не для коммерческого использования.

--> microsoft / Detours <--

| Сообщение посчитали полезным: BlackCode


Ранг: 71.5 (постоянный), 95thx
Активность: 0.10.38
Статус: Участник

Создано: 17 августа 2019 08:32
· Личное сообщение · #9

ТС трудно самому реализовать хук через сплайсинг, или через VEH?



Ранг: -18.1 (нарушитель), 1thx
Активность: 0.070.08
Статус: Участник

Создано: 06 ноября 2019 21:18
· Личное сообщение · #10

UniSoft, > ваш код <, который вы привели в качестве примера - не рабочий. Может поправите? Или как всегда - опять мне спасать престиж exelab'а? У Плутоса до компиляции тоже, видимо, дело еще не дошло.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 06 ноября 2019 23:15 · Поправил: plutos
· Личное сообщение · #11

sim_19 пишет:
который вы привели в качестве примера - не рабочий


напишите конкретно, какой toolchain использовали и перечень ошибок
also, OS version.

-----
Give me a HANDLE and I will move the Earth.





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 06 ноября 2019 23:36
· Личное сообщение · #12

demontronpc
и нефик лезть, если нет понятия

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 69.9 (постоянный), 83thx
Активность: 0.140.73
Статус: Участник

Создано: 06 ноября 2019 23:45
· Личное сообщение · #13

plutos это неравнодушный к вам тролль dma/sty, не тратьте время.

| Сообщение посчитали полезным: Orlyonok


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 06 ноября 2019 23:56 · Поправил: plutos
· Личное сообщение · #14

morgot пишет:
это неравнодушный к вам тролль dma/sty, не тратьте время.


я это понимаю, но может и правда у него выскакивают ошибки, пусть напишет, посмотрим, поможем, если сможем.

-----
Give me a HANDLE and I will move the Earth.




Ранг: -18.1 (нарушитель), 1thx
Активность: 0.070.08
Статус: Участник

Создано: 07 ноября 2019 00:29
· Личное сообщение · #15

VS_2010, 2019. OS W7 32/64

Проекта VS 2010, думаю, будет достаточно. Меня там интересует подмена по строке.

P.S. Плутос, если сильно "влом" можете не заморачиваться - сам разберусь, тем более, что обращение было не к вам. Просто, вы поставили лайк, вот мне и стало интересно компилировали вы или нет?

fc62_07.11.2019_EXELAB.rU.tgz - MinHook.rar




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 07 ноября 2019 00:35 · Поправил: plutos
· Личное сообщение · #16

sim_19 пишет:

P.S. Плутос, если сильно "влом" можете не заморачиваться - сам разберусь, тем более, что обращение было не к вам


Да, влом, тем более, что вам нужнa не столько помощь, сколько повод поговорить: ведь так и не видим перечня ошибок!
И впредь, пожалуйста, без крайней нужды, не используте мой nick name!

-----
Give me a HANDLE and I will move the Earth.




Ранг: -18.1 (нарушитель), 1thx
Активность: 0.070.08
Статус: Участник

Создано: 07 ноября 2019 01:16
· Личное сообщение · #17

plutos пишет:
ведь так и не видим перечня ошибок!


Для меня там интерес представляет ошибка из-за которой не происходит хука по строке. Там можно по комментарию сориентироваться: // если (lpCaption == "ne") то заменим его на "Hooked!", иначе выводим как есть.

P.S. А, вообще, я думаю, что если будет заменен не рабочий код, на рабочий - форум от этого только выиграет. Есть ведь молодые, начинющие любители, у которых от постов Инди "волосы дыбом встают", а уж что-то спросить на форуме, для них, вообще, на уровне подвига. Вот и ходят как читатели и в конце концов - "плюют" и забывают про exelab.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 07 ноября 2019 03:03
· Личное сообщение · #18

Закрыт старый топик.
sty отдохнет месяц, за систематический троллинг клерка, о чем был неоднократно предупрежден.


 eXeL@B —› Вопросы новичков —› Помощь по хукам . MinHook или другие.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати