Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 299
1

Перехват API с возвратом значения

11.08.2017, 22:04. Просмотров 902. Ответов 7

Я тут решил разобраться в перехвате API с помощью инжектированной dll. Спустя 2 дня написал перехват openProcess для диспетчера задач. Всё работает хорошо, но как сделать так, что-бы кроме того, что бы он отменял килл процесса, ещё и возвращал "отказано в доступе"?
Код моей длл:
Кликните здесь для просмотра всего текста
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
#include "MinHook.h"
#include <string> 
 
 
 
#if defined _M_X64
#pragma comment(lib, "MinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "MinHook.x86.lib")
#endif
 
 
typedef BOOL (WINAPI *OPENPROCESS)(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId);
 
OPENPROCESS fpOpenProcess = NULL;
 
BOOL WINAPI DetourOpenProcess(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId)
{
    if (dwProcessId != GetCurrentProcessId()) {
        return fpOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
    }
    else return 0;
}
 
int init()
{
    if (MH_Initialize() != MH_OK)
    {
        return 1;
    }
 
    if (MH_CreateHook(&OpenProcess, &DetourOpenProcess,
        reinterpret_cast<void**>(&fpOpenProcess)) != MH_OK)
    {
        return 1;
    }
    if (MH_EnableHook(&OpenProcess) != MH_OK)
    {
        return 1;
    }
 
    return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        std::wstring s = L"I hook TerminateProcess! PID: ";
        s = s += (std::to_wstring(GetCurrentProcessId()));
 
        MessageBoxW(NULL, (LPCWSTR)s.c_str(), L"Hello", MB_OK);
 
        OutputDebugStringA("Attached :D!");
        init();
        OutputDebugStringA("Initiated Hook!");
        break;
    }
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2017, 22:04
Ответы с готовыми решениями:

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

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

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

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

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

7
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.08.2017, 22:10 2
Лучший ответ Сообщение было отмечено Zagadohnik37 как решение

Решение

Попробуй в DetourOpenProcess перед return 0 сделать так:
C
1
SetLastError(ERROR_ACCESS_DENIED);
1
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 299
11.08.2017, 22:50  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
SetLastError(ERROR_ACCESS_DENIED);
Спасибо, сработало. Кстати, а чему в данном случае ф-ция задаёт значение?

И да, можно как-нибудь перехватить возврат значения(нажатие кнопки(да/отмена)) в messagebox(W/A)?
Если да, то как? Просто исходя из моего кода, можно изменять только параметры вызываемой ф-ции...
0
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.08.2017, 23:59 4
Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
Кстати, а чему в данном случае ф-ция задаёт значение?
У каждого потока в Win32 есть специальное поле, где хранится код последней ошибки.
Он так и называется - last error. Когда какая-то функция завершается неудачей,
обычно зовут GetLastError, чтобы получить этот код и понять, в чем именно причина.
Здесь мы "искусственно" поставили last error = 5 (access denied).

Цитата Сообщение от Zagadohnik37 Посмотреть сообщение
можно как-нибудь перехватить возврат значения(нажатие кнопки(да/отмена)) в messagebox(W/A)?
Очевидно, подменить возвращаемое значение.
0
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 299
12.08.2017, 00:03  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Очевидно, подменить возвращаемое значение.
Так я что и спрашиваю, как это сделать исходя из моего кода, только при условии, что там будет перехват не openprocess, а messageboxw?
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 572
Завершенные тесты: 3
12.08.2017, 02:46 6
messageboxw возвращает int в зависимости от нажатой кнопки.
OpenProcess возвращает handle, а не BOOL.
1
Zagadohnik37
0 / 0 / 1
Регистрация: 23.01.2015
Сообщений: 299
12.08.2017, 13:06  [ТС] 7
lArtl, Случайно перепутал... Но вопрос остаётся тем же, как перехватить и подменить возвращаемое значение?
0
lArtl
220 / 100 / 45
Регистрация: 09.10.2014
Сообщений: 572
Завершенные тесты: 3
12.08.2017, 21:52 8
Да ты гонишь)
C++
1
2
3
4
5
6
7
8
9
10
11
typedef int (WINAPI *MyMessageBoxA)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
 
MyMessageBoxA fpMessageBoxA = NULL;
 
int WINAPI DetourMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
    int result = fpMessageBoxA(hWnd, lpText, lpCaption, uType)  // <--- вызывается оригинальная функция. В зависимости от 
                                                // нажатой кнопки (ОК, Cancel и т.д.) в result будет возвращено
                                                //значение
    return result; //Возвращаемое значение и его можно подменить.
}
К слову, можно вообще не вызывать оригинальную функцию.
Тут можно посмотреть все возвращаемые значения
0
12.08.2017, 21:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2017, 21:52

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

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

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


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

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

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