Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1

CreateProcessNotify

24.05.2011, 23:58. Показов 7866. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла необходимость блокировать запуск некоторых приложений ( часть курсовой работы ), изначально была мысль просто делать перехват CreateProcess, но наткнулся на нехитрый аналог делать CreateProcessNotifyEx в "User Mode". Суть этого метода это создать dll c экспортируемой функцией
C++
1
2
3
4
extern "C" NTSTATUS __stdcall CreateProcessNotify ( 
    LPCWSTR lpApplicationName, 
    ULONG uReason 
    ) {...}
И прописать эту dll в
Code
1
2
Ключ: HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls
Тип значения: REG_EXPAND_SZ
При этом наша dll будет внедрена в приложения которые могут создать процесс..

Написал я соответственно такую dll
Код
LockProcess.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef LockProcess_h__
#define LockProcess_h__
 
#define BUFFER_SIZE 512 
 
WCHAR   lpNamePipe[]    = L"\\\\.\\pipe\\LockProcessPipe";
 
WCHAR   lpPipeBufferRead [BUFFER_SIZE] = { 0 };
WCHAR   lpPipeBufferWrite[BUFFER_SIZE] = { 0 };
 
#endif // LockProcess_h__

maindll.cpp
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <Windows.h>
#include "LockProcess.h"
 
 
typedef LONG NTSTATUS;
 
#define STATUS_SUCCESS         ((NTSTATUS)0x00000000L) 
#define STATUS_UNSUCCESSFUL    ((NTSTATUS)0xC0000001L)
 
 
#define APPCERT_IMAGE_OK_TO_RUN   0x00000001L
#define APPCERT_CREATION_ALLOWED  0x00000002L
#define APPCERT_CREATION_DENIED   0x00000003L
 
HANDLE hLocalMutex = NULL;
 
extern "C" NTSTATUS __stdcall CreateProcessNotify ( 
    LPCWSTR lpApplicationName, 
    ULONG uReason 
    ) 
{
    DWORD BytesRead = 0;
 
    switch(uReason) 
    {
    case APPCERT_IMAGE_OK_TO_RUN:
        {
            WaitForSingleObject(hLocalMutex, INFINITE);
 
            wcscpy(lpPipeBufferWrite, lpApplicationName);
 
            if( CallNamedPipeW( lpNamePipe, lpPipeBufferWrite, BUFFER_SIZE, 
                lpPipeBufferRead, BUFFER_SIZE, 
                &BytesRead, NMPWAIT_NOWAIT) == FALSE )
            {
                OutputDebugStringW(L"CreateProcessNotify: !ERROR. CallNamedPipeW");
                ReleaseMutex(hLocalMutex);
                return STATUS_SUCCESS;
            }
 
            if( !wcscmp(lpPipeBufferRead, L"STATUS_UNSUCCESSFUL") ) 
            {
                OutputDebugStringW(L"CreateProcessNotify: LOCK PROCESS");
                ReleaseMutex(hLocalMutex);
                return STATUS_UNSUCCESSFUL;
            }
 
            ReleaseMutex(hLocalMutex);
 
            return STATUS_SUCCESS;
        } 
 
    
    case APPCERT_CREATION_ALLOWED:
 
        OutputDebugStringW(L"CreateProcessNotify: APPCERT_CREATION_ALLOWED");
        return STATUS_SUCCESS;
 
    case APPCERT_CREATION_DENIED:
 
        OutputDebugStringW(L"CreateProcessNotify: APPCERT_CREATION_DENIED");
        return STATUS_SUCCESS;
 
    default:
        return STATUS_SUCCESS;
    }
}
 
 
 
BOOL APIENTRY DllMain( 
    HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
{
    OutputDebugStringW(L"CreateProcessNotify: DllMain");
 
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hLocalMutex = CreateMutexW(NULL, FALSE, L"LocalMutex_LockProcess");
        if(hLocalMutex == NULL)
            OutputDebugStringW(L"CreateProcessNotify: ERROR! CreateMutexW");
        break;
 
    case DLL_THREAD_ATTACH:
        break;
 
    case DLL_THREAD_DETACH:
        break;
 
    case DLL_PROCESS_DETACH:
        CloseHandle(hLocalMutex);
        break;
    }
 
    return TRUE;
}

maindll.def
C++
1
2
EXPORTS
    CreateProcessNotify


Работает это все вродь нормально, процессы блокируются.. Но как я уже говорил это часть курсовой и мне необходимо объяснить как это работает. Вот здесь и проблема, я толком не нашел описания этого дела..

Я так понимаю что если операционная система в ветке реестра AppCertDlls находит путь к dll, то она в таблице экспорта этой dll ищет по имени функцию CreateProcessNotify и дальше где то регистрирует ее адрес, для последующего вызова..
Другого нормального объяснения я пока не придумал. Если кто то знает как это на самом деле работает прошу объяснить.
0
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 2
02.07.2014, 19:47
111

Добавлено через 9 минут
Не умею писать на С++ но хочется кое что заблокировать на таком серёъном уровне (для меня он серьезный).
И у меня есть пара вопросов
1) Какой процесс блокирует именно этот код.
2) Что за строчка такая что она означает "L"\\\\.\\pipe\\LockProcessPipe";"
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
03.07.2014, 15:30  [ТС]
Цитата Сообщение от saha1010 Посмотреть сообщение
Не умею писать на С++ но хочется кое что заблокировать
Зачем?
Цитата Сообщение от saha1010 Посмотреть сообщение
1) Какой процесс блокирует именно этот код.
Как бы любой..
Цитата Сообщение от saha1010 Посмотреть сообщение
2) Что за строчка такая что она означает "L"\\\\.\\pipe\\LockProcessPipe";"
Имя именованного канала для общения с сервисом.. http://msdn.microsoft.com/en-u... s.85).aspx

PS. этот способ не документирован и его использование не рекомендуется. Для этого есть спец средства в ядре.
0
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 2
04.07.2014, 00:19
Цитата Сообщение от ISergey Посмотреть сообщение
Не умею писать на С++ но хочется кое что заблокировать
Зачем?
Чтобы не использовали программы посторонние на работе. Много чего пробовал все находят и отключают.

Цитата Сообщение от ISergey Посмотреть сообщение
1) Какой процесс блокирует именно этот код.
Как бы любой..
А можно только 1 процесс конкретный или программу или 2 например game.exe ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru