Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Как узнать уровень защиты процесса не используя GetProcessInformation (эта функция минимум для Windows 8)?

24.12.2021, 11:05. Показов 4844. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня тут такой вопрос, нигде не нашёл ответа в Интернете. Как узнать уровень защищённости процесса, например системный он или нет, ну там есть несколько уровней разной защиты. Использование GetProcessInformation мне не подходит там для Win 8. Мне надо для семёрки хотя бы. А лучше и для XP. Рекомендовали функцию NtQueryInformationProcess или ZwQueryInformationProcess с кодом ProcessProtectionInformation (61). Но когда я пробовал и долго мучился у меня ничего не получилось, лично у меня, что в XP, что в Win 7 выдаёт ошибку &HC0000003 короче мол такого параметра нету, хотя даже в MSDN есть описание для ZwQueryInformationProcess, но у меня не работает. И нигде не нашёл рабочих примеров для NtQueryInformationProcess с кодом ProcessProtectionInformation именно. Может, что подскажете!?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2021, 11:05
Ответы с готовыми решениями:

Как узнать уровень громкости Windows 7 ?
Пожалуйста.

Обход UAC на Windows 10 pro (Максимальный уровень защиты)
Друзья, всем привет! (надеюсь не создал 1000 тему:-|) Прошу помочь. На рабочем ноуте установлена Win 10 pro 18363.1082. Админка на...

Можно ли, используя библиотеку BASS, узнать уровень входного сигнала?
Привет всем. Может кто подскажет, можно ли используя библиотеку bass узнать уровень входного сигнала.... Например, подключен микрофон... На...

45
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
24.12.2021, 18:58
Узнать уровень не получится, т.к. уровни были введены в 8.1, но можно узнать защищен ли процесс или нет. Для этого нужно запросить ZwQueryInformationProcess(ProcessBasicIn formation, PROCESS_EXTENDED_BASIC_INFORMATION).
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2021, 21:35  [ТС]
Спасибо конечно за направление, но как обычно для VB нигде ничего не найти. Теперь не могу найти описание структуры PROCESS_EXTENDED_BASIC_INFORMATION. Как объявить эту структуру даже не понимаю.
Такой вариант не прошёл, сам придумывал...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Type PROCESS_EXTENDED_BASIC_INFORMATION
    BasicInfo As PROCESS_BASIC_INFORMATION
    IsProtectedProcess As Currency
    IsWow64Process As Currency
    IsProcessDeleting As Currency
    IsCrossSessionCreate As Currency
    IsFrozen As Currency
    IsBackground As Currency
    IsStronglyNamed As Currency
    IsSecureProcess As Currency
    IsSubsystemProcess As Currency
    SpareBits As Currency
End Type
As Long тоже не проходил, подумал 8 байт надо вместо 4, пока не знаю как эту структуру в VB6 описать или в любом другом VB хотябы всё равно не могу найти пока в Интернете
0
Эксперт по электронике
6552 / 3180 / 334
Регистрация: 28.10.2011
Сообщений: 12,452
Записей в блоге: 7
24.12.2021, 21:58
Цитата Сообщение от HackerVlad Посмотреть сообщение
Такой вариант не прошёл
С чего ему проходить если у вас вместо битовых полей обычные?
IsProtectedProcess и то что ниже исключите из структуры, а данные битовых полей извлекайте логическими операторами из поля Flags.
Кстати, где поля Size и Flags?
Структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
    SIZE_T Size;    // Ignored as input, written with structure size on output
    PROCESS_BASIC_INFORMATION BasicInfo;
    union {
        ULONG Flags;
        struct {
            ULONG IsProtectedProcess : 1;
            ULONG IsWow64Process : 1;
            ULONG IsProcessDeleting : 1;
            ULONG IsCrossSessionCreate : 1;
            ULONG IsFrozen : 1;
            ULONG IsBackground : 1;
            ULONG IsStronglyNamed : 1;
            ULONG IsSecureProcess : 1;
            ULONG IsSubsystemProcess : 1;
            ULONG SpareBits : 23;
        } DUMMYSTRUCTNAME;
    } DUMMYUNIONNAME;
} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2021, 22:10  [ТС]
Да, и эту структуру я не смог переписать на VB. Этот код на С++ я видел.

Но и не только в этом загвоздка. Любая структура, как известно это лишь какое-то заранее определённое количество байт в памяти отведённое и зарезервированное. Может быть таким образом наплевать как описывается структура, если скармливать байтовый массив, это самый простой способ, как я решил и поступить в своих испытаниях. И вот что вышло.

Функция ZwQueryInformationProcess с параметром класса ProcessBasicInformation (ноль) подходит только структура в 24 байта.
Специально перебирал циклом несколько тысяч и с успехом выдало только 24 байта если. Структура в 24 байта это только структура PROCESS_BASIC_INFORMATION

Её легко найти в Интернете
Visual Basic
1
2
3
4
5
6
7
8
Private Type PROCESS_BASIC_INFORMATION
    ExitStatus      As Long
    PEBBaseAddress  As Long
    AffinityMask    As Long
    BasePriority    As Long
    UniqueProcessId As Long
    ParentProcessId As Long
End Type
Хотя даже она описана неправильно, скорее всего, учитывая что процесс родитель здесь UniqueProcessId вместо ParentProcessId, даже в кодах уважаемого The Trck'a. Может там со смещениями и напутано, но главное что работает. Короче, суть не в этом.

Суть в том, что с параметром ProcessBasicInformation подходит только эта структура PROCESS_BASIC_INFORMATION, но не PROCESS_EXTENDED_BASIC_INFORMATION. И вот тут я не понимаю.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
24.12.2021, 22:56
Visual Basic
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
Option Explicit
 
Private Const PROCESS_QUERY_LIMITED_INFORMATION     As Long = &H1000
 
Private Type PROCESS_BASIC_INFORMATION
    ExitStatus                      As Long
    PebBaseAddress                  As Long
    AffinityMask                    As Long
    BasePriority                    As Long
    UniqueProcessId                 As Long
    InheritedFromUniqueProcessId    As Long
End Type
 
Private Type PROCESS_EXTENDED_BASIC_INFORMATION
    Size                            As Long
    BasicInfo                       As PROCESS_BASIC_INFORMATION
    Flags                           As Long
End Type
 
Private Declare Function NtQueryInformationProcess Lib "ntdll" ( _
                         ByVal ProcessHandle As OLE_HANDLE, _
                         ByVal InformationClass As Long, _
                         ByRef ProcessInformation As Any, _
                         ByVal ProcessInformationLength As Long, _
                         ByRef ReturnLength As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" ( _
                         ByVal dwDesiredAccess As Long, _
                         ByVal bInheritHandle As Long, _
                         ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
                         ByVal hObject As OLE_HANDLE) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
 
Private Sub Form_Load()
    Dim tInf        As PROCESS_EXTENDED_BASIC_INFORMATION
    Dim hProcess    As OLE_HANDLE
    
    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, GetCurrentProcessId)
    If hProcess = 0 Then
        Stop
    End If
       
    tInf.Size = Len(tInf)
    
    If NtQueryInformationProcess(hProcess, 0, tInf, Len(tInf), 0&) < 0 Then
        CloseHandle hProcess
        Stop
    End If
    
    CloseHandle hProcess
    
    Debug.Print "Protected: "; tInf.Flags And 1
    
End Sub
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2021, 22:59  [ТС]
Беру свои слова обратно насчёт напутано со смещениями, то что я сказал, я просто столкнулся с чудесами.

Вот написал функцию для получения процесса родителя, это очень простая функция

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Public Function GetProcessParentId(pid As Long) As Long
    Dim hProcess As Long
    Dim Pbi As PROCESS_BASIC_INFORMATION
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
    
    If hProcess > 0 Then
        NtQueryInformationProcess hProcess, ProcessBasicInformation, VarPtr(Pbi), Len(Pbi), ByVal 0&
        GetProcessParentId = Pbi.UniqueProcessId
        CloseHandle hProcess
    End If
End Function
Чудо вот в чём, если объявлено, как у меня:
Visual Basic
1
Private Declare Function NtQueryInformationProcess Lib "ntdll.dll" (ByVal hProcess As Long, ByVal ProcessInformationClass As Long, ProcessInformation As Any, ByVal ProcessInformationLength As Long, ReturnLength As Long) As Long
Через As Any

То тогда, если я вызываю

Visual Basic
1
NtQueryInformationProcess hProcess, ProcessBasicInformation, VarPtr(Pbi), Len(Pbi), ByVal 0&
Обращаю внимание вызов VarPtr(Pbi) без ByVal, как у меня было то тогда структура наполняется неправильно)
и тогда Pbi.ParentProcessId ничем не наполняется (вместо процесса-родителя) а тогда Pbi.UniqueProcessId получает процесс родителя вместо своего процесса. Как только я написал ByVal, только потом я заметил эту ошибку так сразу структура начала заполняться правильно. И тогда надо правильно было мне написать

Visual Basic
1
NtQueryInformationProcess hProcess, ProcessBasicInformation, ByVal VarPtr(Pbi), Len(Pbi), ByVal 0&
тогда Pbi.ParentProcessId получается правильное значение, главное это ByVal

Так что извиняюсь. Вот кому если надо, хотя сто раз все это знают. Функция определения процесса родителя (правильный вариант):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' Получить pid процесса-родителя
Public Function GetProcessParentId(pid As Long) As Long
    On Error Resume Next
    
    Dim hProcess As Long
    Dim Pbi As PROCESS_BASIC_INFORMATION
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
    
    If hProcess > 0 Then
        NtQueryInformationProcess hProcess, ProcessBasicInformation, ByVal VarPtr(Pbi), Len(Pbi), ByVal 0&
        GetProcessParentId = Pbi.ParentProcessId
        CloseHandle hProcess
    End If
End Function

Извините что отвлёкся от темы. Всё равно не понимаю как использовать PROCESS_EXTENDED_BASIC_INFORMATION.

Добавлено через 51 секунду
Спасибо за новый код, сейчас попробую.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
24.12.2021, 23:04
Цитата Сообщение от HackerVlad Посмотреть сообщение
То тогда, если я вызываю
Visual Basic
1
NtQueryInformationProcess hProcess, ProcessBasicInformation, VarPtr(Pbi), Len(Pbi), ByVal 0&
Ну так неверно же. Зачем VarPtr тут если объявлено через Any?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
24.12.2021, 23:18
Структуры кстати неправильно объявлены, т.к. не учитывается их различие в 64-х битных процессах.
Для 32 бит может и совпадают смещения полей, а для 64 бит - нет.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2021, 23:20  [ТС]
точно, я об этом не подумал, это только если объявлено As Long.

тогда будет правильно без VarPtr даже, если As Any:

Code
1
NtQueryInformationProcess hProcess, ProcessBasicInformation, Pbi, Len(Pbi), ByVal 0&
Хотя и с VarPtr тоже работает в As Any как надо, сейчас надеюсь правильно выделил код в форуме)))))
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
24.12.2021, 23:20
Someone007, правильно объявлены структуры. VB6 не компилирует под x64.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
24.12.2021, 23:21
Цитата Сообщение от The trick Посмотреть сообщение
VB6 не компилирует под x64.
Ясно, каменный век...
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.12.2021, 23:35  [ТС]
Уважаемый The trick, а можете, пожалуйста, объяснить для меня, для незнающего человека что значит OLE_HANDLE, очень удивился что не Long
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
24.12.2021, 23:42
Цитата Сообщение от HackerVlad Посмотреть сообщение
Уважаемый The trick, а можете, пожалуйста, объяснить для меня, для незнающего человека что значит OLE_HANDLE, очень удивился что не Long
Да это алиас Long'а для 32 бит. Просто лучше отражает суть типа и гипотетически (если когда-либо можно будет компилить код по x64) меньше мороки с переобъявлениями структур. Лучше вообще иметь все алиасы сишных типов:

Но в VB6 нельзя объявлять их, только в TLB.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.12.2021, 00:06  [ТС]
Спасибо большое за помощь, я бы никогда не догадался объявить такую структуру и вызвать её без ошибки.

Особенно шокировало, что структура эта занимает 32 байта, не 24 и работает оказывается без ошибки.
Оказывается есть волшебная строчка tInf.Size = Len(tInf) куда заносится информация, я очень удивился, хотя думал что я хороший программист)))

Подведём итоги. tInf.Flags возвращает число, с которым нужно дальше работать, которое может показать ни только IsProtectedProcess проверяя единичку но и все остальные флаги. Я всё правильно понял надеюсь. Вообще я всё это затеял, чтобы написать функцию которая определит является ли какой-то процесс системным даже с включенными привилегиями.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.12.2021, 00:10
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вообще я всё это затеял, чтобы написать функцию которая определит является ли какой-то процесс системным даже с включенными привилегиями.
Вообще таким образом проверяет процессы Process Explorer из пакета Sysinternals. Также он запрашивает ProcessProtectionInformation и выдает уровень если доступно.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.12.2021, 00:15  [ТС]
А ProcessProtectionInformation (61) только для минимум Windows 8.1?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.12.2021, 00:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
А ProcessProtectionInformation (61) только для минимум Windows 8.1?
Ну да, т.к. эту фичу добавили начиная с этой версии. Вообще можешь просто выполнять запрос, если прошел - определять уровень, нет - чекать PROCESS_EXTENDED_BASIC_INFORMATION.
0
25.12.2021, 00:34

Не по теме:

Цитата Сообщение от Someone007 Посмотреть сообщение
Ясно, каменный век
Не совсем. 1998 год.
"Каменный век" по современным меркам это DOS.

0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
25.12.2021, 01:04  [ТС]
Самое смешное, что своей цели я так и не добился, оказывается у меня в системе (Windows 7) абсолютно все процессы не защищённые. Написал функцию, вот она:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function IsProcessProtected(pid As Long) As Boolean
    Dim hProcess As Long
    Dim tInf As PROCESS_EXTENDED_BASIC_INFORMATION
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
    
    If hProcess > 0 Then
        tInf.Size = Len(tInf)
        
        NtQueryInformationProcess hProcess, ProcessBasicInformation, tInf, Len(tInf), ByVal 0&
        
        If (tInf.Flags And 1) Then
            IsProcessProtected = True
        End If
        
        CloseHandle hProcess
    End If
End Function
Выдаёт всем процессам что они не защищённые))) Вот это прикол, а я хотел узнать системный ли процесс)))
Но зато если поменять на If (tInf.Flags And 2) Then то тогда например правильно выдаёт какой процесс 32-битный (IsWow64Process (0x002)). Больше полезности тут я пока не нашёл. В этой структуре нету информации о том, является ли процесс системным?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.12.2021, 01:04
Помогаю со студенческими работами здесь

Драйвер для защиты процесса
Пример: http://delphiexpert.ru/isxodnik-drajver-dlya-perexvata-zaversheniya-proczessa-s-primerom.html Это для Win XP а на 7 не работает!...

Защита книги макросом. Разный уровень защиты на листах. Как реализовать?
Всем здравствуйте! Прошу помочь с решением следующей задачи: Есть данный макрос, который вставлен в модуль Эта книга Private Sub...

Связь процесса-родителя и процесса-ребенка через pipe, используя для синхронизации семафоры
#include &lt;sys/types.h&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int fd, result; size_t...

Создание процесса из программы для защиты основного от несанкционированного завершения
Решил написать для своей программы систему защиты от убийства процесса. Хочу создавать из программы процесс, который будет следить за...

Организуйте двустороннюю поочередную связь процесса-родителя и процесса-ребенка через pipe, используя для синх
/* Программа 05-3.с, осуществляющая однонаправленную связь через pipe между процессом-родителем и процессом-ребенком */ #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru