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

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

01.07.2022, 14:55. Показов 1883. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я, кажется, уже заколебал тут всех, но...

Пытаюсь перехватить функцию Sleep()

DLL загружается спокойно, отрабатывает нужные функции. Делал все по аналогии с этим кодом метод 1.

C++
1
2
3
4
5
    adr_rFunc = (DWORD)GetProcAddress(GetModuleHandle(L"user32.dll"), "Sleep");
    if (adr_rFunc == 0){
        MessageBox(NULL, L"Can`t get addres", L"Error!", MB_OK);
            return;
    }
Вот сам код, который ищет Sleep(), но выдает что не может найти данную функцию. Думаю, что либо функция не так называется, либо что sleep() не api (хотя вряд ли)...

Вопрос состоит в том, как перехватить её?

Тестирую на этом:
C++
1
2
3
4
5
6
7
8
9
10
#include <process.h>
#include <Windows.h>
#include <iostream>
 
void _sleep() { Sleep(2000); }
 
int main() {
    while (1) { printf("Process id: %d\n", _getpid()); _sleep(); }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2022, 14:55
Ответы с готовыми решениями:

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

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

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

9
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.07.2022, 15:02
Цитата Сообщение от SevaVerth Посмотреть сообщение
GetModuleHandle(L"user32.dll"), "Sleep"
Sleep function
DLL - Kernel32.dll; KernelBase.dll
1
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 34
01.07.2022, 15:17  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
DLL - Kernel32.dll; KernelBase.dll
А, и правда, не заметил.

А туда будет доступ? Мне кажется, что если опрашивать kernel32, то она может послать куда подальше.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.07.2022, 15:26
Цитата Сообщение от SevaVerth Посмотреть сообщение
Мне кажется, что если опрашивать kernel32, то она может послать куда подальше.
это библиотека пользовательского режима.
ничем не отличается от user32.dll и прочих других (подробнее можете почитать в моём блоге Стек вызовов Windows API)
Основные системные библиотеки пользовательского окружения: kernelbase.dll (до Windows 8 это была kernel32.dll и теперь она служит лишь стабом для совместимости), user32.dll, gdi32.dll, advapi32.dll, ntmarta.dll, shell32.dll и др.
смысл в том, что любая библиотека, загруженная в пользовательское адресное пространство, полностью доступна оному пользователю.
а библиотеки, загруженные в ядерное адресное пространство, доступны лишь самому ядру и драйверам режима ядра.
1
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 34
01.07.2022, 15:32  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
это библиотека пользовательского режима.
Просто у меня возникла проблема:
Code
1
Вызвано исключение по адресу 0x765F0F05 (kernel32.dll) в test_prog.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000001.
И как мне показалось, проблема именно в том, что нет доступа до kernel.32. Конечно, сейчас еще поразбираюсь, в чем может быть проблема.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.07.2022, 15:45
Цитата Сообщение от SevaVerth Посмотреть сообщение
в чем может быть проблема
в том, как вы пишите библиотеку хука.
применяйте VirtualProtectEx с уровнем защиты PAGE_EXECUTE_READWRITE
и не забывайте восстанавливать защиту, когда закончили работу с хуком.
1
0 / 0 / 0
Регистрация: 09.11.2016
Сообщений: 34
01.07.2022, 16:35  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
применяйте VirtualProtectEx
Если честно, не до конца могу понять как и с какими параметрами вызывать защиту.

Вот отредактировал код под Sleep() с того сайта

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
struct jmp_far
{
    BYTE instr_push;  //здесь будет код инструкции push
    DWORD arg;         //аргумент push
    BYTE  instr_ret;    //здесь будет код инструкции ret
};
 
BYTE old[6]; //область для хранения 6-ти затираемых байт начала функции
DWORD adr_rFunc; //будущий адрес оригинальной функции
DWORD written; //вспомогательная переменная
jmp_far jump; //здесь будет машинный код инструкции перехода
 
DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE;
 
void InterceptFunctions(void)
{
    DWORD op;
    //сначала получим абсолютный адрес функции для перехвата
    adr_rFunc = (DWORD)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "Sleep");
    if (adr_rFunc == 0){
        MessageBox(NULL, L"Can`t get addres", L"Error!", MB_OK);
            return;
    }
 
    VirtualProtect((LPVOID)adr_rFunc, sizeof(jmp_far), PAGE_EXECUTE_READWRITE, &oldProtect);
 
    jump.instr_push = 0x68;
    jump.arg = (DWORD)&Intercept_Sleep;
    jump.instr_ret = 0xC3;
 
    //Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции
    ReadProcessMemory(GetCurrentProcess(), (void*)adr_rFunc, (void*)&old, 6, &written);
 
    //Запишем команду перехода на нашу функцию поверх этих 6-ти байт
    WriteProcessMemory(GetCurrentProcess(), (void*)adr_rFunc, (void*)&jump, sizeof(jmp_far), &written);
 
    VirtualProtect((LPVOID)adr_rFunc, sizeof(jmp_far), oldProtect, NULL);
 
    }
 
//данное определение аналогично __srtdcall
BOOL WINAPI Intercept_Sleep(DWORD dwMilliseconds)
{
    VirtualProtect((LPVOID)adr_rFunc, sizeof(jmp_far), oldProtect, NULL);
 
    //Сначала восстанавливаем 6 первых байт функции. Это не обязательное 
    // действие, просто мы решили подшутить над пользователем, и все 
    // сообщения функции MessageBoxA переделать на свои, поэтому нам придется
    // вызвать оригинальную функцию, а для этого следует восстановить ее адрес:
    WriteProcessMemory(GetCurrentProcess(), (void*)adr_rFunc, (void*)&old, 6, &written);
 
    //Здесь вы можете порезвиться от души и выполнить любые, пришедшие вам 
    // в голову действия. Мы просто заменили сообщение функции на свое:
 
    MessageBox(NULL, L"WORKING", L"HUURRAAAHH", MB_OK);
 
    //Вызываем оригинальную функцию через указатель
    ((BOOL(__stdcall*)(DWORD))adr_rFunc)(dwMilliseconds);
 
    //Снова заменяем  6 байт функции на команду перехода на нашу функцию
    WriteProcessMemory(GetCurrentProcess(), (void*)adr_rFunc, (void*)&jump, 6, &written);
 
    VirtualProtect((LPVOID)adr_rFunc, sizeof(jmp_far), oldProtect, NULL);
 
    return TRUE;
}
Но все равно выводит ошибку.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
02.07.2022, 00:48
C++
1
2
3
4
5
6
7
8
9
10
#pragma pack(push, 1)
 
struct jmp_far
{
    BYTE instr_push;  //здесь будет код инструкции push
    DWORD arg;         //аргумент push
    BYTE  instr_ret;    //здесь будет код инструкции ret
};
 
#pragma pack(pop)
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
05.07.2022, 18:54
Цитата Сообщение от SevaVerth Посмотреть сообщение
BYTE instr_push;  //здесь будет код инструкции push
А процесс 32-битный? Под x64 это просто так работать не будет, там указатели 64 битные, они не влезают в DWORD
0
 Аватар для Morgot
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
06.07.2022, 15:07
SevaVerth, лично у меня в Sleep надо перехватывать или первые 5 байт, или больше; берите дизассемблер длин или смотрите вручную.

Добавлено через 2 минуты
SevaVerth, вообще, вам разобраться надо или просто получить результат? просто , если чисто результат - берите detours или minhook, там уже готово.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2022, 15:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru