Что нового

[Процессы] Запрос Handle процесса

skorpion_0077

Новичок
Сообщения
16
Репутация
0
Добрый вечер. Возникла проблема:
Допустим, есть некий процесс (например notepad.exe), как, с помощью ф-ии DllCall, запросить Handle этого процесса?
У меня есть вот такая реализация, но она спрашивает только handle процесса скомпилированного скрипта:
Код:
DllCall("kernel32.dll", "handle", "GetCurrentProcess")


Заранее спасибо.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
InnI
Что значит "$iAccess" в первом параметре? И как его правильно задать?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
skorpion_0077
Что значит "$iAccess" в первом параметре?
Фактически, для каких целей вы открываете процесс (читать, писать, завершать). Находятся в ProcessConstants.au3. Подробно расписаны здесь: Process Security and Access Rights

как его правильно задать?
Перечислить нужные варианты через BitOR() или, при наличии соответствующих прав доступа, указать $PROCESS_ALL_ACCESS.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
InnI, разобрался, спасибо.

Но появилась ошибка со всем кодом, на строчке >1000, хотя всего строк 40.
Код:
#include <ProcessConstants.au3>
#include <WinAPI.au3>
MsgBox(0+64, "test", "1111")

sNonKillableProcess()

Func _ProcessGetHandle($ioProcName)
    Local $sStatus = Run(@ComSpec & " /c WMIC PROCESS WHERE Name='" & $ioProcName & "' GET handlecount", @SystemDir, @SW_HIDE, 8)
    Local $sBuf
    While 1
        $sBuf &= StdoutRead($sStatus)
        If @Error then ExitLoop ; We have lift off, let's go!
    WEnd
    $sBuf = StringStripCR($sBuf)
    $sBuf = StringRegExpReplace($sBuf, "HandleCount", "")
    $sBuf = StringStripWS($sBuf, 3)
    Return $sBuf
EndFunc

Func sNonKillableProcess()
	Local $sProcessHandle , $sSignedvalue , $ProcessIoPriority , $sProcessInformationLength , $sStruct

	If Not @Compiled Then Exit

	$sProcessHandle = _WinAPI_OpenProcess($READ_CONTROL, 0, _ProcessGetHandle("notepad.exe"))

	$sSignedvalue = 0x8000F129 ;

	$ProcessIoPriority = 0x21

	$sProcessInformationLength = 0x4

	$sStruct = DLLStructCreate("Byte[4]")

	DllStructSetData($sStruct, 1, $sSignedvalue)

	$sRet = DllCall ("ntdll.dll" , "none" , "ZwSetInformationProcess" , "int" , $sProcessHandle[0] , "int" , _
	$ProcessIoPriority , "int" , DllStructGetPtr($sStruct) , "int" , $sProcessInformationLength)

EndFunc




Добавлено:
Сообщение автоматически объединено:

Декомпильнул мой exe и на той строке, где была ошибка, там описана некая процедура связанная с ProcessConstants.au3
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
skorpion_0077
на строчке >1000, хотя всего строк 40
Не нужно компилировать скрипт. Запускайте прямо из редактора SciTE нажатием F5. Тогда в консоле редактора увидите ошибку и точную строку скрипта.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
InnI

Вот ошибка:
Subscript used on non-accessible variable.:
$sRet = DllCall ("ntdll.dll" , "none" , "ZwSetInformationProcess" , "int" , $sProcessHandle[0] , "int" , $ProcessIoPriority , "int" , DllStructGetPtr($sStruct) , "int" , $sProcessInformationLength)
$sRet = DllCall ("ntdll.dll" , "none" , "ZwSetInformationProcess" , "int" , $sProcessHandle^ ERROR
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
skorpion_0077
Вы вообще понимаете, чем отличается "process identifier" от "process handle"?
Ваша функция _ProcessGetHandle() возвращает количество дескрипторов, принадлежащих процессу (кстати, это аналог _WinAPI_EnumProcessHandles). А функция _WinAPI_OpenProcess работает с PID процесса
Код:
$sProcessHandle = _WinAPI_OpenProcess($READ_CONTROL, 0, ProcessExists("notepad.exe"))
И при чём тут $READ_CONTROL ? :stars:


Добавлено:
Сообщение автоматически объединено:

skorpion_0077
Вам нужно получше изучить AutoIt, прежде, чем лезть в процессы. Компьютер ведь угробите и не заметите.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
InnI, изменил на
Код:
$sProcessHandle = _WinAPI_OpenProcess($PROCESS_VM_READ, 0, ProcessExists("notepad.exe"))


Ошибка таже

Убрал ноль в квадратных скобках, запустилось,
skorpion_0077 [?]
цели я не достиг, процесс "notepad.exe" можно убить.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
skorpion_0077
Категорию константы на этот раз угадали, вот только она дает не те полномочия.

На будущее:
$PROCESS_ALL_ACCESS - если не уверены в том, что вам надо.

Код:
Global Const $PROCESS_ALL_ACCESS = 0x1F0FFF


P.S. Эта списанная чушь у автора, который в свою очередь скопировал бездумно древний код, не поможет сделать процесс "не убиваемым".
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
firex, нет, скрипт работает, но, повторяюсь, работает только для самого скрипта.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
skorpion_0077
Что конкретно то работает? Достаточно прибить главный поток приложения и оно тут же завершает свою работу.

Код:
#Include <ProcessConstants.au3>
#Include <WinAPIEx.au3>

Local $hProc, _
	$iPID = @AutoItPID ; ProcessExists('some.exe')
; ---
$hProc = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, False, $iPID)
If $hProc Then
	$aRet = DllCall("ntdll.dll", "long", "NtSetInformationProcess", _
		"handle" , $hProc, _
		"ulong" , 33, _
		"long*", -2147421911, _
		"ulong" , 4 _
		)
	If Not @Error And Not $aRet[0] Then _
		MsgBox(64, '', 'Success!')

	_WinAPI_CloseHandle($hProc)
EndIf


P.S. Не занимайтесь ерундой, если пользователь захочет прибить ваш процесс - он вправе это сделать.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
firex, я понимаю. Это всё в ознакомительных целях.

Приведённый выше код тоже работает только для текущего процесса?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
skorpion_0077
Учитесь искать информацию.
Вот ваша функция: https://fuckav.ru/showthread.php?t=18410
А в ответе #6 модифицированная под любой процесс.

skorpion_0077
тоже работает только для текущего процесса?
Зачем эти глупые вопросы? Запустите и проверьте.
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
InnI [?]

Я оттуда и пришёл ;)
Запустил - работает, огромное спасибо за терпение!

Но, возник конфликт подключаемых библиотек,

Мои инклуды:
Код:
#Include <Misc.au3>
#Include <ProcessConstants.au3>
#Include <WinAPIEx.au3>


Также, есть ф-ия
Код:
_winapi_wow64enablewow64fsredirection($benable)


А также ваша. При компиляции, autoit ругается на то, что ф-ия "_winapi_wow64enablewow64fsredirection" уже объявлена.


Добавлено:
Сообщение автоматически объединено:

Разобрался, подключил #include <WinAPI.au3> и убрал #Include <WinAPIEx.au3>
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
skorpion_0077 [?]
Приведённый выше код тоже работает только для текущего процесса?
Ну что за вопросы, мы разве в столе заказов? Вы на код то взгляните еще раз - для любого процесса (раскомментировать строку в шапке, указать имя процесса).
 
Автор
S

skorpion_0077

Новичок
Сообщения
16
Репутация
0
firex

Да, извиняюсь, сглупил. Ещё раз спасибо за помощь и терпение!
Вопрос считаю разрешенным.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
skorpion_0077
Это всё в ознакомительных целях
Чтобы ваши, исключительно ознакомительные, цели не перешли на тёмную сторону силы, приведу код для завершения подобных "неубиваемых" процессов
Код:
#include <WinAPIProc.au3>

Const $THREAD_TERMINATE = 0x01

$PID = ProcessExists("notepad.exe")

$aData = _WinAPI_EnumProcessThreads($PID)
For $i = 1 To $aData[0]
  $aResult = DllCall("kernel32.dll", "handle", "OpenThread", "dword", $THREAD_TERMINATE, "bool", 0, "dword", $aData[$i])
  DllCall("kernel32.dll", "bool", "TerminateThread", "handle", $aResult[0], "uint", 0)
Next
 
Верх