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

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

27.05.2014, 12:09. Показов 4940. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2014, 12:09
Ответы с готовыми решениями:

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

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

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

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

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

Решение

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

Цитата Сообщение от oxyfat Посмотреть сообщение
- Баловство это. Пользы никакой.
От перехватов польза есть, если понимать зачем это все нужно.
0
Эксперт С++
2420 / 2028 / 303
Регистрация: 03.05.2011
Сообщений: 4,520
Записей в блоге: 15
31.05.2014, 00:23 4
Цитата Сообщение от NigaFury Посмотреть сообщение
как перехватить любую другую функцию API
найти её адрес. Почитайте Поиск intermodular calls. Как найти адрес, по которому загружен TerminateProcess? у меня всё никак времени нет реализовать задуманное.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2014, 00:23

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.