Light-electric.com

IT Журнал
13 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Process all access

windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, PID, False): Process_all_Access не определен

опять я. Я продолжаю свое путешествие с C и Python.

Сегодня мне случилось делать отладчик. В настоящее время это то, что у меня есть

Именно здесь находится место ошибки, PROCESS_ALL_ACCESS не определен. Однако в библиотеке ctypes имеется вход этого ключевого слова. Я пытался использовать строки, байтовые строки, но безрезультатно. Вот некоторые дополнительные сведения о функции OpenProcess и о безопасности процесса и правах доступа

Поэтому я действительно спрашиваю: Что такое исправление ошибок?

Очень Признателен! -Нортон

EDIT: О да! вот мой сценарий Debugdeclares:

4 Ответов

Ваше сообщение об ошибке точно говорит вам, что не так: PROCESS_ALL_ACCESS не определен, потому что вы его нигде не определили. Я не знаю, что означает «in the ctypes library, there is an input of that keyword», но ctypes не дает вам его определения.

Фактически, единственное место в стандартной библиотеке Python, где упоминается PROCESS_ALL_ACCESS , находится в недокументированном расширении C, используемом модулем multiprocessing :

Использовать это, вероятно, плохая идея, потому что это, как уже было сказано, недокументировано.

Поскольку PROCESS_ALL_ACCESS -это макрос, нет никакого способа узнать его значение через что-то вроде ctypes во время выполнения, поэтому, если вы хотите его получить, вам придется посмотреть, что это такое для вашей системы, и определить его самостоятельно в своем коде. Хотя, вероятно, лучше прислушаться к предупреждению в документации, которую вы связали , и вместо этого выяснить минимальный набор прав доступа.

PROCESS_ALL_ACCESS = (0x000F0000L | 0x00100000L | 0xFFF)

так и должно быть.

проверка MSDN ссылка.

Для книги Grey Hat Python, вы должны прочитать WARNING на странице 30.

Загрузите my_debugger_defines.py и замените его своей текущей копией.

Похожие вопросы:

Как получить начальный / базовый адрес процесса? Например Solitaire.exe (solitaire.exe+BAFA8) #-*- coding: utf-8 -*- import ctypes, win32ui, win32process PROCESS_ALL_ACCESS = 0x1F0FFF HWND =.

У меня есть следующий код: import subprocess from ctypes import * #-Part where I get the PID and declare all variables-# OpenProcess = windll.kernel32.OpenProcess ReadProcessMemory =.

Я довольно новичок в C++, поэтому мой вопрос: есть ли альтернатива OpenProcess()?Игра не позволяет мне получить доступ к ней, попытался попросить меньший доступ, чем PROCESS_ACCESS_ALL, так как это.

Что-то странное происходит, когда я запускаю свою программу. Когда я запускаю его с помощью параметра Start Without Debugging в VS 2010, OpenProcess возвращает дескриптор процесса, как обычно, но.

Я пытаюсь загрузить список процессов, и он правильно работает на 32bit python. Однако, на 64bit, я не могу получить имя процесса в список. Код приведен ниже. Если я изменяю структуру szExeFile с.

Im пытается открыть процесс с помощью консольного приложения Wisual Studio 2012, c++ и получить ошибку 87: #include #include #include #define.

У меня есть эта проблема с функцией OpenProcess для win32 api. Программа предназначена для чтения целого числа из программы, заданной программой PID и адресом целого числа через userinput. int.

Мне нужно получить полный путь от A PID. Я проверил этот вопрос C++ Windows — как получить путь процесса из его PID и написал следующий код: function GetFullPathFromPID(PID: DWORD): string; var.

Я читал некоторые книги Хоглунда и думал, что у меня будет ‘go’ в его ‘simple debugger’. Во всяком случае, я пытался использовать линию hProcess = OpenProcess(PROCESS_ALL_ACCESS |.

Я пытаюсь сделать Python получить значение/данные из адреса, такого как 0x101BFFDC, который я нашел с помощью чит-движка для игры. Я провел много исследований и считаю, что мне нужно использовать.

Статья Создаем свой ботнет

Перейти к странице

Перейти к странице

SooLFaa

Добрый вечер господа. Сегодня я хотел бы поговорить не о взломе в чистом виде. Я думаю пришло время нам с Вами создать собственный БОТНЕТ . Эта тема, является не новой, но я бы хотел обратить внимание на то как именно начать создавать ботнет. Я уже являюсь ботоделом. И вот так выглядит, то что уже написано.

Ну что, пожалуй сразу к делу?

Ботнет будем строить на языке C# — так как этот лучший выбор для НЕБОЛЬШИХ Ботнетов (максимум 100к онлайн машин). Это связано с одним ограничением, что для работы бота у жертвы должен быт установлен .Net Framework – сегодня в эпоху Windows 10, это уже не является большой проблемой, однако знать об этом стоит.

Теперь же поговорим о главном, а именно о том, с чего начинают новички и как НЕ НАДО начинать . (По разрушаем некоторые мифы)

Миф 1: Крутой ботнет должен содержать много всяких плюшек (DDOS, лайки в вк, вызов калькулятора =)).

Опровергаем: Хороший ботнет это тот, который не падает и справляется со своей задачей. Поэтому, как и любой продукт сначала необходимо писать МИНИМАЛЬНО — НЕОБХОДИМЫЙ функционал, так как программиста очень тяжело остановить и ему хочется писать всё больше и больше кода. Это неправильно. Написать необходимо сначала каркас и возможность расширения функционала. Этим путем пойдем и мы. Ботнет должен работать сразу и писаться максимум за два – три дня.

Миф 2: Ботнет обязательно для DDOS – атак.

Опровергаем: Это тоже не верное суждение. Да, ботнеты обычно используются для DDOS атак и мы рассмотрим типы DDOS атак и даже напишем свои модули, но не это главное. Лично я использую ботнет для распределенного быстрого подбора хеш функций, брута сервисов и т.п. Так как согласитесь, на сколько бы быстрый не был бы Ваш процессор, 100 000 машин сбрутят быстрее чем 1 машина. И это лишь немногое, как его можно использовать

Миф 3: Написать ботнет – сложно и требует клоссальных знаний программирования и сетевых технологий.

Опровергаем: Отчасти это так, но на самом деле не нужно быть выдающимся программистом с великим стажем. Хватит понимания общих сетевых протоколов (такие HTTP), немного знаний криптографии (SSL), и уровень программирования хотя бы на понимание ООП.

Итак, что же такое ботнет? Это несколько машин, объединённых одним командным центром, для скрытой эксплуатации ресурсов выгодных владельцу ботнета.

Пожалуй, хватит разговоров, пора к делу:

Требования к сегодняшнему релизу:
1) Создать билд который по указанному пути будет брать команду для ботов
2) Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
3) ByPass Uac и AV
4) Запретить завершение процесса.
5) Реализовать поддержку первый команды «Update» — команда которая просто будет обновлять наш текущий клиент, новой версией.
6) Небольшую обфускацию исходников , чтобы нас не отреверсили так просто.

Создаем новый консольный проект.

Далее меняем в настройках проекта на приложение для Windows (Лайвхак, чтобы создать пустое приложение без поддержки телеметрии).

А вот теперь переходим в вопросы архитектуры.

Создаем папку Services в которой будет хранится наша бизнес логика и при добавлении новых возможностей в эту папку будем добавлять папки с новыми сервисами и классами. Начнем с первого пункта ТЗ. Создаим сервис «FileManager» , который будет читать команду по ссылке, а также интерфейс.

Далее код, для начала создадим заглушку на командном сервере (index.php).

Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
Создаем в FileManager новый метод

Читать еще:  No direct access

Теперь наш процесс сможет убить только опытный пользователь.

Профит: При нажатии на кнопку снять задачу получаем.

Для того чтобы забайпассить UAC нужно в реестре просто отключить его проверку.

Байпассить AV на этом этапе пока не нужно, т ак как билд чистый, сигнатуры неизвестны, антивирусы не видят.

Реализовать поддержку первый команды «Update» — команда которая просто будет обновлять наш текущий клиент, новой версией.

Небольшую обфускацию исходников, чтобы нас не отреверсили так просто.
Качаем .Net Reactor и ставим Protect . В дальнейших статьях рассмотрим собственные обфускаторы с помощью рефлексии.

Сравним обфусцированный и необфусцированный билды

Видим как билд палится без проблем

Вспоминаем наш метод Main, который теперь вот так выглядит в dotPeek

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

Георгий

VAVAN

Добрый вечер господа. Сегодня я хотел бы поговорить не о взломе в чистом виде. Я думаю пришло время нам с Вами создать собственный БОТНЕТ . Эта тема, является не новой, но я бы хотел обратить внимание на то как именно начать создавать ботнет. Я уже являюсь ботоделом. И вот так выглядит, то что уже написано.
Посмотреть вложение 8073
Ну что, пожалуй сразу к делу?

Ботнет будем строить на языке C# — так как этот лучший выбор для НЕБОЛЬШИХ Ботнетов (максимум 100к онлайн машин). Это связано с одним ограничением, что для работы бота у жертвы должен быт установлен .Net Framework – сегодня в эпоху Windows 10, это уже не является большой проблемой, однако знать об этом стоит.

Теперь же поговорим о главном, а именно о том, с чего начинают новички и как НЕ НАДО начинать . (По разрушаем некоторые мифы)

Миф 1: Крутой ботнет должен содержать много всяких плюшек (DDOS, лайки в вк, вызов калькулятора =)).

Опровергаем: Хороший ботнет это тот, который не падает и справляется со своей задачей. Поэтому, как и любой продукт сначала необходимо писать МИНИМАЛЬНО — НЕОБХОДИМЫЙ функционал, так как программиста очень тяжело остановить и ему хочется писать всё больше и больше кода. Это неправильно. Написать необходимо сначала каркас и возможность расширения функционала. Этим путем пойдем и мы. Ботнет должен работать сразу и писаться максимум за два – три дня.

Миф 2: Ботнет обязательно для DDOS – атак.

Опровергаем: Это тоже не верное суждение. Да, ботнеты обычно используются для DDOS атак и мы рассмотрим типы DDOS атак и даже напишем свои модули, но не это главное. Лично я использую ботнет для распределенного быстрого подбора хеш функций, брута сервисов и т.п. Так как согласитесь, на сколько бы быстрый не был бы Ваш процессор, 100 000 машин сбрутят быстрее чем 1 машина. И это лишь немногое, как его можно использовать

Миф 3: Написать ботнет – сложно и требует клоссальных знаний программирования и сетевых технологий.

Опровергаем: Отчасти это так, но на самом деле не нужно быть выдающимся программистом с великим стажем. Хватит понимания общих сетевых протоколов (такие HTTP), немного знаний криптографии (SSL), и уровень программирования хотя бы на понимание ООП.

Итак, что же такое ботнет? Это несколько машин, объединённых одним командным центром, для скрытой эксплуатации ресурсов выгодных владельцу ботнета.

Пожалуй, хватит разговоров, пора к делу:

Требования к сегодняшнему релизу:
1) Создать билд который по указанному пути будет брать команду для ботов
2) Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
3) ByPass Uac и AV
4) Запретить завершение процесса.
5) Реализовать поддержку первый команды «Update» — команда которая просто будет обновлять наш текущий клиент, новой версией.
6) Небольшую обфускацию исходников , чтобы нас не отреверсили так просто.

Далее меняем в настройках проекта на приложение для Windows (Лайвхак, чтобы создать пустое приложение без поддержки телеметрии).
Посмотреть вложение 8075

А вот теперь переходим в вопросы архитектуры.

Создаем папку Services в которой будет хранится наша бизнес логика и при добавлении новых возможностей в эту папку будем добавлять папки с новыми сервисами и классами. Начнем с первого пункта ТЗ. Создаим сервис «FileManager» , который будет читать команду по ссылке, а также интерфейс.

Process all access

This post will interest people using bypasses based on hi-jacking / using process handles existing natively in Windows’ system processes.
For those who do not know what I am talking about, I suggest that you read my following post:
https://www.unknowncheats.me/forum/c. d-process.html

On Windows 7, CSRSS gave us a process handle to every other process with PROCESS_ALL_ACCESS and it was quite practical.
On Windows 10 (and Windows 8 as well if I’m not mistaking), this system process is protected, apparently with some mechanism named «Protected Processes Light» (PPL)
There are apparently ways to remove this protection but since there are other processes that can give us these precious handles, I didn’t dig more.
If you are interested in removing that protection here is one interesting related read and a GitHub project:
http://www.alex-ionescu.com/?p=97
https://github.com/Mattiwatti/PPLKiller

Since CSRSS is out of reach without a trick, Window 10 (and 8?) cheaters are left with 2 options:

  1. Using LSASS that has read and write permission to other processes apparently only if they have network capabilities (it won’t have a handle to notepad for example). That’s not all access, but it’s enough for some cheats.
  2. Using SVCHOST that has a handle to every other process with PROCESS_ALL_ACCESS

Some other software (e.g. Anti Viruses) may also have process handles usable

One problem though, there are many, many SVCHOST processes.
Finding the one that has our precious process handle can be a tedious task if (like my friend for whom I am writing this post ) you are manually checking the handles of all SVCHOST processes manually.

Finding the SVCHOST with the process handle PROCESS_ALL_ACCESS

To do so, you will need Process Explorer, an official tool by Microsoft, part of the Sysinternals suite:
https://docs.microsoft.com/en-us/sys. ocess-explorer

  1. Start you game (or the process you want a handle to)
  2. Once it’s launched, go to Process Explorer, on the top menu, click «Find», then «Find Handle or DLL»
  3. A new window opens with a text box allowing you to search. Enter the process name of your target and click search or hit enter.
  4. Below the search box, the results will be displayed, click on the column «Type» to organise them by type (since we are only interested in handles to a process)
  5. You should have several SVCHOST with their process ID in the results, click on the first one.
  6. By clicking on the first one, in the main window underneath the search window it should have selected you the SVCHOST process you clicked on and on the bottom part of the window it should have highlighted the handle to your game.
  7. By default, Process Explorer will only show you the type and name of the handle, right click on the column titles and click «Select columns»
  8. Tick «Handle Value» and «Access Mask» then click Okay.
  9. You can now see the type, name, value and access right of the handle selected. PROCESS_ALL_ACCESS should be 0x001FFFFF.
  10. If the handle currently highlighted doesn’t have all access, then just click on the next SVCHOST found in the search window and check its access and repeat until you have found the right one (there should be only a few SVCHOST found anyway, 4 in my test)
Читать еще:  Как открыть файл access

Here is how I found a handle to the game DayZ Standalone with all access:

I hope that helps some of you

Привилегия Windows Vista/Windows 7: SeDebugPrivilege & OpenProcess

все, что я смог найти о эскалации к соответствующим привилегиям для моих нужд, согласилось с моими текущими методами, но проблема существует. Я надеюсь, может быть, у кого-то есть некоторый опыт Windows Vista/Windows 7 internals, который может светить некоторым светом, где есть только темнота. Я уверен, что это затянется, но, пожалуйста, потерпите.

контекст

я работаю на приложение, которое требует доступа к памяти других процессов на текущая машина. Это, очевидно, требует прав администратора. Это также требует SeDebugPrivilege (нет, это не опечатка в размере SetDebugPrivilege ), который я считаю, что приобретаю правильно, хотя я сомневаюсь, что больше привилегий не нужно и, следовательно, причина моих проблем. Код до сих пор успешно работал во всех версиях Windows XP, а также в моей тестовой 32-битной и 64-битной средах Windows 7.

будет всегда запуск с правами администратора. Это можно предположить на протяжении всего поста.

  • эскалация текущего процесса Access Token включить SeDebugPrivilege прав.
  • используя EnumProcesses чтобы создать список текущих PIDs в системе
  • открыть с помощью OpenProcess С PROCESS_ALL_ACCESS права доступа
  • используя ReadProcessMemory для чтения памяти другого процесса.

    проблема:

    все работает отлично во время разработки и моего личного тестирования (включая Windows XP 32 & 64, Windows Vista 32 и Windows 7 x64). Однако во время тестового развертывания на обеих машинах Windows Vista (32-разрядная версия) и Windows 7 (64-разрядная версия) коллеги, похоже, проблема привилегий/прав с OpenProcess сбой с общим Access Denied ошибка. Это происходит как при запуске от имени ограниченного пользователя (как и следовало ожидать), так и при запуске явно от имени администратора (щелкните правой кнопкой мыши → запуск Администратор!—29—> и при запуске из командной строки уровня администратора).

    однако эта проблема была непродуктивной для меня в моей тестовой среде. Я был свидетелем проблемы из первых рук, поэтому я верю, что проблема существует. Единственная разница, которую я могу различить между фактической средой и моей тестовой средой, заключается в том, что фактический ошибка возникает при использовании учетной записи администратора домена в приглашении UAC, тогда как мои тесты (которые работают без ошибок) используйте учетную запись локального администратора в приглашении UAC.

    похоже, что, хотя используемые учетные данные позволяют UAC «работать от имени администратора», процесс все еще не получает правильные права на возможность OpenProcess на другой процесс. Я недостаточно знаком с внутренностями Vista / Windows 7, чтобы знать, что это может быть, и я надеюсь, что у кого-то есть представление о том, что может быть причиной.

    в Кикер!—21—>

    человек, который сообщил об этой ошибке, и чья среда может регулярно воспроизводить эту ошибку, имеет небольшое приложение с именем RunWithDebugEnabled который является небольшой загрузочной программой, которая, как представляется, наращивает свои собственные привилегии, а затем запускает исполняемый файл, переданный ему (таким образом, наследуя расширенные привилегии). При запуске с этой программой, используя те же учетные данные администратора домена в приглашении UAC, программа работает правильно и может успешно звоните OpenProcess и работает по назначению.

    так что это определенно проблема с получением правильных привилегий, и известно, что учетная запись администратора домена и учетная запись администратора, которая должна иметь доступ к правильным правам. (Очевидно, получение этого исходного кода было бы здорово, но меня бы здесь не было, если бы это было возможно).

    Примечания

    как уже отмечалось, ошибки, сообщенные неудачным OpenProcess попытки Access Denied . Согласно документации MSDN OpenProcess :

    если вызывающий объект включил привилегию SeDebugPrivilege, запрошенный доступ предоставляется независимо от содержимого дескриптора безопасности.

    это приводит меня к мысли, что, возможно, есть проблема в этих условиях либо с (1) получением SeDebugPrivileges или (2), требующие других привилегий, которые имеют не упоминается ни в одной документации MSDN и может отличаться между учетной записью администратора домена и учетной записью локального администратора

    Пример Кода:

    спасибо!

    если кто-то имеет некоторое представление о том, какие возможные разрешения, привилегии, права и т. д. что мне может не хватать, чтобы правильно открыть другой процесс (при условии, что исполняемый файл был правильно » запущен как Administrator » ed) в Windows Vista и Windows 7 при вышеуказанных условиях, было бы весьма признателен.

    меня бы здесь не было, если бы я не был абсолютно в тупике, но я надеюсь, что еще раз опыт и знания группы сияют ярко. Я благодарю вас за то, что вы нашли время прочитать эту стену текста. Только хорошие намерения ценятся, спасибо за то, что вы тип человека, который делает переполнение стека настолько полезным для всех!

    1 ответов

    Итак, после долгой отладки и беспокойства многих людей за информацию, я, наконец, смог выследить парня, который написал RunWithDebugEnabled application и получить краткое описание того, как он работает.

    проблема в данном случае заключается в том, что Debug programs привилегия в локальной политике для администратора домена была удалена, и, таким образом, SeDebugPrivilege маркер не присутствовал в маркере доступа процесса. Он не может быть включен, если его нет вообще, и я до сих пор не знаю, как добавить привилегия существующего маркера доступа.

    как работает текущая магия:
    Так что RunWithDebugEnabled magic приложение будет использовать свои права администратора, чтобы установить себя в качестве службы и запустить себя, таким образом, работает под SYSTEM учетная запись пользователя, а не администратора домена. С SYSTEM привилегии, приложение затем создает новый токен доступа, идентичный токену администратора, только с SeDebugPrivilege маркер присутствует. Этот новый токен используется для CreateProcessAsUser() и запустите программу с недавно включенным SeDebugPrivilege это отсутствовало раньше.

    мне на самом деле не нравится это «решение» здесь, и я продолжаю свой поиск «чистого» способа получить эту привилегию. Я опубликую это как еще один вопрос здесь, на SO, который я постараюсь вспомнить, чтобы связать здесь, а также помочь другим следовать и для дальнейшего использования.

    Я благодарю вас всех за ваше время и энергию, помогая отлаживать и решать эту проблему. Это действительно очень ценится!

    C/C++: Пишем процесс-менеджер

    Николай «G» Андреев

    Процесс. Как много в этом звуке. Я еще помню времена, когда у меня стоял Windows 95, и на компьютере творился сплошной хаос. Стоило зависнуть одной программе, как сразу вылетали все форточки. Стандартный таскменеджер не просто не справлялся с работой, он сам порой являлся причиной сбоя. Тогда-то я и задумался о том, как бы получить над системой больше власти. Облазив кучу ресурсов в инете и не найдя ничего путного, я понял, что надо писать свой менеджер, имеющий больше возможностей, чем обычный, и самое главное – стабильно работающий. И я его написал, причем пользуюсь им по сей день. А вот как он был создан — этим я поделюсь с тобой в этой статье.

    Читать еще:  Access is forbidden

    Мы научимся не только перечислять и выводить на экран все запущенные на данный момент процессы, но и по-разному манипулировать ими. Научимся «завершать задачу», менять приоритет процесса, его свойства и получать о нем любую информацию. Все эти навыки могут очень пригодиться при написании программ под windows.

    Сразу к делу. Сначала создадим форму и кинем на нее объект ListBox и объект Button. В листбокс запишем все текущие процессы, а кнопочка Button даст нам возможность убивать эти процессы. В коде мы создадим соответствующую оконную процедуру для обработки сообщений (например, сообщения о нажатии клавиши). Как это сделать, я не буду здесь описывать, просто загляни в майский выпуск твоего любимого журнала :).

    Способов перечислить процессы много. В Windows NT 4.0, например, доступен только один — воспользоваться функцией EnumProcesses из набора Process Status Application Programming Interface (в простонародье PSAPI). Он также доступен и в старших НТях, а в 9x — нет, так что, хотя этот способ и очень удобен, он, увы, отпадает. Есть способ порыться в реестре, в скрытом разделе HKEY_PERFOMANCE_DATA, но он также отпадает из-за сложности реализации. На наше счастье, яйцеголовые из Microsoft придумали универсальный способ и дали ему название ToolHelp API.

    Для использования этого способа подключим заголовочный файл tlhelp32.h к нашей программе. Он находится в стандартной поставке Platform SDK (прилагающейся к студии), но если вдруг компилятор его не найдет, посмотри на нашем диске — я его приложил к программе. Для перечисления процессов мы будем использовать три функции:

    CreateToolhelp32Snapshot — для получения «снимка» процессов;

    Process32First — для получения первого процесса из снимка;

    Process32Next — для получения оставшихся процессов.

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

    Итак, определим переменные: массив типа DWORD из, допустим, 1024 элементов и переменную типа PROCESSENTRY32, в которую у нас будут заноситься значения свойств и характеристик процесса.

    typedef struct tagPROCESSENTRY32 <

    typedef PROCESSENTRY32 *PPROCESSENTRY32;

    Создадим снимок процесса и начнем его исследовать. Воспользуемся для этого функцией CreateToolhelp32Snapshot, о которой я уже говорил раньше. В первом параметре мы передадим ей константу TH32CS_SNAPPROCESS, говорящую о нашем желании получить снимок именно процессов, а не модулей, нитей или чего-нибудь другого в этом роде. Второй параметр нас совершенно не интересует, поэтому передаем NULL. Функция вернет значение типа HANDLE, которое мы сохраним в какую-нибудь переменную и будем впоследствии его использовать.

    Получив снимок, можно начать перечислять процессы при помощи функции Process32First, в первом параметре которой мы передадим полученный HANDLE снимка, а во втором ссылку на переменную типа PROCESSENTRY32. Далее создадим цикл do — while, его условием является равенство нулю функции Process32Next. Там же в цикле будем заносить в массив DWORD значение члена th32ProcessID нашей структуры, увеличивать счетчик на 1 и ставить имя процесса в листбокс. В коде это выглядит так:

    // process — наша структура

    SendDlgItemMessage(hwnd, IDC_LISTBOX1, LB_ADDSTRING,

    SendDlgItemMessage(hwnd, IDC_LISTBOX1, LB_SETCURSEL,

    (WPARAM)SendDlgItemMessage(hw, IDC_LISTBOX1, LB_GETCOUNT, 0, 0)-1, 0

    где hwnd — описание нашего окна (формы), а IDC_LISTBOX1 — идентификатор листбокса. В итоге, для того, чтобы перечислить процессы и сообщить о них нашему таскменеджеру, необходимо всего лишь выполнить этот цикл. Но системные процессы не дадут доступа к своим свойствам, и мы не сможем ни закрыть их, ни даже посмотреть их имена. Как это исправить? Надо повысить привилегии процесса-менеджера до уровня отладчика. Звучит сложно, но на самом деле — раз плюнуть. Я написал небольшую функцию для изменения собственных привилегий. Запусти ее с параметром true, и получишь уровень отладчика, с false — ты его, соответственно, лишишься.

    Листинг функции, дающей привилегии отладчика нашей программе

    void EnableDebugPrivilege(bool fEnable)<

    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))<

    tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

    Хорошо, какие процессы есть в системе — мы знаем, но как ими манипулировать? Для этого нам нужно получить хэндл процесса. Только получив его, можно с ним что-нибудь сотворить. Делается это с помощью функции OpenProcess, передав которой параметры PROCESS_ALL_ACCESS, false и идентификатор процесса (из массива), получим дескриптор. Поскольку мы пишем менеджер процессов, то первое, что он должен уметь — эти процессы убивать (завершать). Завершить их совсем не сложно. Достаточно запустить функцию TerminateProcess с параметрами: хэндл процесса и код завершения (я пишу 0). Функция завершит процесс, а так как привилегии у нас высокие, то убиваемый процесс умрет без лишних слов.

    После того, как ты завершил работу с дескриптором процесса или любым другим хэндлом, стоит его закрыть с помощью функции CloseHandle.

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

    // вычисляем индекс выделенного элемента

    int index = SendDlgItemMessage(hwnd, IDC_LISTBOX1, LB_GETCOUNT, 0, 0);

    // открываем процесс из массива с этим индексом

    HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, false, idarray[index]);

    Так уж вышло, что я терпеть не могу стандартные системные утилиты Windows и всегда стараюсь написать свои. Так получилось и с процесс-менеджером. Я описал самую примитивную программу для манипулирования процессами, так что для твоего творчества остается уйма места. Например, ты можешь заменить listbox на listview и добавить к именам процессов их иконки или, например, создать возможность изменения приоритетов процесса с помощью функции SetPriorityClass. Если возникли какие-нибудь вопросы, идеи или замечания — пиши. Постараюсь ответить.

    На этом все. Удачного компилирования.

    Мне часто пишут письма с просьбой объяснить, как работает та или иная утилита, или чем руководствоваться при написании системных программ. В последнее время при ответе на такие письма я стал ограничиваться всего лишь ссылкой на одну великую книгу: «Programming Applications for Windows» (русское название — «Windows для профессионалов»), автором которой является редактор Microsoft Press Джеффри Рихтер. Эта книга является библией системного программирования под Windows. В ней читатель может найти ответы на все вопросы, возникающие при написании приложений. Безусловно, огромный интерес при прочтении книги вызывает целая глава о перехвате API функций, о технологии, позволяющей как угодно манипулировать системой. Книга содержит в себе огромное количество прекрасно оформленных исходников и будет полезна любому начинающему или продвинутому кодеру.

  • Ссылка на основную публикацию
    ВсеИнструменты
    Adblock
    detector