Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Получение информации о другом процессе

17.05.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Возможность получения информации о стороннем процессе раскрывает перед программистами и пользователями широкие возможности. Это могут быть продвинутые менеджеры процессов, антивирусные и антитроянские программы, утилиты для реверсной инженерии и многое другое. У меня, к примеру, подобные функции используются в программе Quick Task Terminator. Давайте посмотрим, как это делается. Для начала надо описать структуры, необходимые для работы с процессами. В стандартном комплекте FASM их, естественно, нет, но это и неудивительно.
  1. ; Структура для получения данных о процессе под Win32
  2. struct PROCESS_BASIC_INFORMATION
  3.     ExitStatus       dd ?
  4.     PebBaseAddress   dd ?
  5.     AffinityMask     dd ?
  6.     BasePriority     dd ?
  7.     uUniqueProcessId dd ?
  8.     uInheritedFromUniqueProcessId dd ?
  9. ends
  10.  
  11. ; Структура PEB процесса под Win32
  12. ; Process Enviroment Block или блок окружения процесса
  13. ; Содержит все параметры пользовательского режима, ассоциированные
  14. ; системой с текущим процессом
  15. struct PEB
  16.     InheritedAddressSpace    db ?
  17.     ReadImageFileExecOptions db ?
  18.     BeingDebugged            db ?
  19.     b003                     db ?
  20.     Mutant                   dd ?
  21.     ImageBaseAddress         dd ?
  22.     Ldr                      dd ?
  23.     ProcessParameters        dd ?
  24. ends
  25.  
  26. ; Юникодная строка в Win32
  27. struct UNICODE_STRING
  28.     Length                   dw ?
  29.     MaximumLength            dw ?
  30.     Buffer                   dd ?
  31. ends
  32.  
  33. ; Структура RTL_USER_PROCESS_PARAMETERS под Win32
  34. struct RTL_USER_PROCESS_PARAMETERS
  35.     MaximumLength            dd ?
  36.     Length                   dd ?
  37.     Flags                    dd ?
  38.     DebugFlags               dd ?
  39.     ConsoleHandle            dd ?
  40.     ConsoleFlags             dd ?
  41.     StdInputHandle           dd ?
  42.     StdOutputHandle          dd ?
  43.     StdErrorHandle           dd ?
  44.     CurrentDirectoryPath     UNICODE_STRING
  45.     CurrentDirectoryHandle   dd ?
  46.     DllPath                  UNICODE_STRING
  47.     ImagePathName            UNICODE_STRING
  48.     CommandLine              UNICODE_STRING
  49. ends
В сегменте данных на основании структур опишем необходимые нам массивы для чтения данных о процессе.
  1. section '.data' data readable writeable
  2. ...
  3. ; Данные о 32-битных процессах
  4. Info            PROCESS_BASIC_INFORMATION
  5. peb             PEB
  6. pparam          RTL_USER_PROCESS_PARAMETERS
Подготовительный этап завершен, можно переходить к основной части. Получение информации о процессе выполняется в несколько стадий. Сперва надо открыть процесс для чтения и получения данных, затем с помощью функции NtQueryInformationProcess надо прочитать общую информацию о процессе в структуру PROCESS_BASIC_INFORMATION (с параметром ProcessBasicInformation). Имейте в виду, что приложение, которое выполняет такой запрос, должно обладать соответствующими привилегиями. Затем надо прочитать блок окружения процесса PEB, который находится по адресу, определенному в PebBaseAddress структуры PROCESS_BASIC_INFORMATION. Дальше нам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS, адрес которой определен в структуре PEB параметром ProcessParameters. На самом деле в PEB содержится гораздо больше различных значений, но нас интересует только эта структура. Именно в ней записана нужная нам информация - путь к исполняемому файлу процесса и его командная строка.

Читать статью целиком »
Просмотров: 10490 | Комментариев: 6

Исследование защиты программы APIS32

16.04.2013 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы APIS32

APIS32 - утилита для просмотра функций API, используемых тем или иным приложением Windows. Вам достаточно выбирать нужные вам функции из списка, запускаете программу-жертву, а APIS32 выдаст полный отчет о всех вызовах этих функций из нее. Если я не ошибаюсь, это одна из первых программ такого рода, но автор явно погорячился, сделав ее платной. Инструменты для реверса просто обязаны быть бесплатными.

Читать статью целиком »
Просмотров: 9385 | Комментариев: 7

Управление другим приложением из своей программы

12.02.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
Под управлением сторонним приложением я подразумеваю некие действия своей программы, эмулирующие действия живого человека. Например, нажатия на кнопки в диалоговых окнах. Попробуем сделать это на примере лоадера для популярного файлового менеджера Total Commander. Кто пользуется им, тот знает, что единственное различие между полной и незарегистрированной версией в том, что триалка при запуске показывает наг-скрин с предложением купить программу или нажать для продолжения одну из трех кнопок с цифрами. Конечно, кнопку можно нажать самостоятельно, но можно доверить это лоадеру.


Наг-скрин Total Commander

Чтобы работать с содержимым окна, сперва надо узнать его хэндл. Проще всего воспользоваться функцией FindWindow, указав в качестве параметра наименование класса наг-скрина. Его можно посмотреть при помощи моей программы WinDowzer или любой другой аналогичной программы. Противное окно имеет название класса TNASTYNAGSCREEN, первый шаг сделан. Теперь нам надо узнать хэндл нужной кнопки, для этого нужно изучить все связи родительских и дочерних объектов окна.

Читать статью целиком »
Просмотров: 10917 | Комментариев: 7

Как узнать, что программа запущена под Администратором

20.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать, что программа запущена под Администратором

Иногда требуется узнать, запущена ли ваша программа под учетной записью с правами Администратора, или же от обычного пользователя. Для чего это нужно? Например, некоторые операции с реестром или файлами требуют права Администратора. При попытке выполнить их обычному пользователю вернется ошибка ERROR_ACCESS_DENIED, но для более точного анализа ситуации надо будет проверить права доступа и уведомить об этом пользователя. Проверить, что программа запущена под Администратором, можно несколькими способами.

Читать статью целиком »
Просмотров: 11322 | Комментариев: 25

Принудительное завершение процесса

20.08.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Принудительное завершение процесса

Рано или поздно в программистской практике возникает задача по управлению процессами, в частности их принудительного завершения. Для дочерних процессов, порожденных собственным приложением, обычно хватает вызова TerminateProcess, но в некоторых случаях требуется принудительно завершить чужой процесс. Зная идентификатор процесса сделать это не составит большого труда. Открываем процесс функцией OpenProcess с правами PROCESS_TERMINATE, а затем, в случае успеха, отдаем полученный хэндл функции TerminateProcess. Вроде бы все просто, но не тут-то было.

Читать статью целиком »
Просмотров: 8819 | Комментариев: 18

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.12 сек. / MySQL: 3 (0.0058 сек.) / Память: 4.5 Mb
Наверх