Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/27: Рейтинг темы: голосов - 27, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 20.05.2014
Сообщений: 10

Перехват API функции

27.05.2014, 12:09. Показов 5657. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем! Уважаемые форумчене помогите решить задачу, я взял функцию MessageBox и перехватил её. Объясните нубу как перехватить любую другую функцию API, с этой я разобрался, а другие не как не выходит реализовать, кому не сложно, подскажите как изменить участок когда внизу так, чтобы осуществлялся перехват функции EditBox или любой другой. Если не затруднит, выложите пожалуйста скрин работы программы перехвата функции EditBox.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#undef UNICODE // позволяет сделать не Unicode-проект
#include <windows.h> //WinAPI совокупность библиотек Windows
#include <cstdio> //содержит константы, объявления функций и типов, используемых для различных операций стандартного ввода и вывода.
 
#defineSIZE 6 //Число байт, необходимое для перенаправления
 
typedef int (WINAPI *pMessageBoxW)(HWND, LPCWSTR, LPCWSTR, UINT);// объявление которое начинается спецификатором typedef и состоит из последовательностей разнообразных спецификаторов объявления и описателей
int WINAPI MyMessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);
 
void Begin Redirect(LPVOID);
 
pMessageBoxWpOrigMBAddress = NULL;
BYTEoldBytes[SIZE] = {0}; //Здесть будут размещены перезаписанные байты
BYTEJMP[SIZE] = {0};    //Это справедливо JMP для нашего кода
DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE; /*Параметры защиты памяти*/
chardebugBuffer[128]; //Used for DbgView
 
INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
{
    switch(Reason)
    {
    case DLL_PROCESS_ATTACH:
        pOrigMBAddress = (pMessageBoxW) //Get MessageBoxW pointer
            GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxW");
        if(pOrigMBAddress != NULL)
            BeginRedirect(MyMessageBoxW);   //Valid? Redirect
        break;
    case DLL_PROCESS_DETACH:
        memcpy(pOrigMBAddress, oldBytes, SIZE);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}
 
voidBeginRedirect(LPVOID newFunction)
{
    sprintf_s(debugBuffer, 128, "pOrigMBAddress: %x", pOrigMBAddress);
    OutputDebugString(debugBuffer);
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; //JMP <NOP> RET for now
    memcpy(JMP, tempJMP, SIZE); //Копируемдляудобства
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); //Получимадресразницы
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, PAGE_EXECUTE_READWRITE, &oldProtect);
            /*Меняем настройки памяти, чтобы убедиться, что мы можем записать в JMP*/
    memcpy(oldBytes, pOrigMBAddress, SIZE); /*КопируемстарыебайтыпередтемкакписатьJMP*/
    sprintf_s(debugBuffer, 128, "Old bytes: %x%x%x%x%x", oldBytes[0], oldBytes[1],
        oldBytes[2], oldBytes[3], oldBytes[4], oldBytes[5]);
    OutputDebugString(debugBuffer);
    memcpy(&JMP[1], &JMPSize, 4); //Пишем обращение к JMP
    sprintf_s(debugBuffer, 128, "JMP: %x%x%x%x%x", JMP[0], JMP[1],
        JMP[2], JMP[3], JMP[4], JMP[5]);
    OutputDebugString(debugBuffer);
    memcpy(pOrigMBAddress, JMP, SIZE); //Пишем в память процессора
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL);
}
 
int  WINAPIMyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uiType)
{
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, myProtect, NULL); /*Сновазаписываемичитаем*/ memcpy(pOrigMBAddress, oldBytes, SIZE); //ОтцепимАпи
    MessageBoxW(NULL, L"HOOK Complete", L"Hooked MBW", MB_ICONEXCLAMATION);
    intretValue = MessageBoxW(hWnd, lpText, lpCaption, uiType); /*Получаемзначениепрерывания*/
    memcpy(pOrigMBAddress, JMP, SIZE); //Rehook API
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); //Нормальные настройки
    returnretValue; //Вернуть то что должно быть возвращено 
 
Пп
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.05.2014, 12:09
Ответы с готовыми решениями:

Перехват API
Сразу код ) DWORD dwProtect = PAGE_READWRITE; BYTE old; BYTE * fPtr; #pragma pack(push, 1)

Перехват API, Рихтер
Всем доброго времени суток! Собственно такой вопросик... я вот читаю сейчас Рихтера и мне интересен его перехват. Захотелось проделать то...

Перехват API вызовов
Здравствуйте! Пытаюсь перехватить вызов функции CreateFileW и заменить на свою MyCreateFileW. Для этого в процесс(тестовая программа,...

3
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
29.05.2014, 16:59
Никак. Только зная адрес и что-там твориться, а для этого нужно копаться в IDA.
+ ни факт, что вообще будет работать в "другом" месте.
- Баловство это. Пользы никакой.
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
29.05.2014, 17:28
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата Сообщение от NigaFury Посмотреть сообщение
Доброго времени суток всем! Уважаемые форумчене помогите решить задачу, я взял функцию MessageBox и перехватил её. Объясните нубу как перехватить любую другую функцию API
Точно также как и первую..
Вот используй https://github.com/martona/mhook/ и не мучайся.

Цитата Сообщение от oxyfat Посмотреть сообщение
- Баловство это. Пользы никакой.
От перехватов польза есть, если понимать зачем это все нужно.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
31.05.2014, 00:23
Цитата Сообщение от NigaFury Посмотреть сообщение
как перехватить любую другую функцию API
найти её адрес. Почитайте Поиск intermodular calls. Как найти адрес, по которому загружен TerminateProcess? у меня всё никак времени нет реализовать задуманное.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2014, 00:23
Помогаю со студенческими работами здесь

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

Перехват API с возвратом значения
Я тут решил разобраться в перехвате API с помощью инжектированной dll. Спустя 2 дня написал перехват openProcess для диспетчера задач. Всё...

Перехват API функций. Таблица импорта
Необходимо лoггиpoвaть вызовы некоторых API-шных функций (для примера CloseHandle) в заданном процессе. После прочтения материала из...

Перехват API вызовов через таблицу импорта
Доброго времени суток. Есть следующая задача. Нужно перехватить вызов некоторых определённых функций из определённого приложения и заменить...

Перехват api-вызова. Ошибка при выполнении
Здравствуйте, есть dll-ка, которая успешно внедряется во все(или почти все) оконные приложения с помощью хуков. Суть ее в том, что она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru