1

Тема: AHK: Отказать доступ к отключению процесса.

Добрый вечер. Я сейчас пишу программное обеспечение для ПК. Мне необходимо, чтобы обычный диспетчер задач или тот же Process Hacker не мог отключить мой процесс. Если кто-то все еще не понял, то вот пример:
- Допустим, у вас запущен антивирус Avast. Вы хотите отключить его процесс, а там сообщение:
https://i.imgur.com/jYZevri.png


Если это невозможно, то подскажите, как можно сделать "реакцию" на отключение процесса.
- Например, зашли в диспетчер задач, нашли процесс "process.exe" -> "Снять задачу". А process.exe создает файл с текстом off. И только потом отключается.

Всем плюшек.

2

Re: AHK: Отказать доступ к отключению процесса.

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

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3 (изменено: morgan, 2019-01-23 17:38:47)

Re: AHK: Отказать доступ к отключению процесса.

belyankin12, я так уже делал Но сейчас мне нужно именно то, что выше.

4

Re: AHK: Отказать доступ к отключению процесса.

Правила пишет:

запрещается обсуждение способов осуществления любых форм компьютерного вредительства.

5

Re: AHK: Отказать доступ к отключению процесса.

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

6

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:
Правила пишет:

запрещается обсуждение способов осуществления любых форм компьютерного вредительства.

Avast - вредитель.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: morgan, 2021-04-17 17:39:25)

Re: AHK: Отказать доступ к отключению процесса.

0

8

Re: AHK: Отказать доступ к отключению процесса.

Morgan, Avast - вредитель.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

9

Re: AHK: Отказать доступ к отключению процесса.

Создавайте 2 процесса - пускай друг за другом следят.

10 (изменено: stealzy, 2019-01-24 21:50:37)

Re: AHK: Отказать доступ к отключению процесса.

morgan пишет:

А если какой-то человек просто вырубит процесс, то в файл ничего не сохранится и будет откат программы.

Человек просто так в диспетчер задач не лезет, сначала программу закрывают крестиком или из меню значка системного трея.
Вот тут и следует показать окошко с прогрессбаром "Идет сохранение конфигураци..."
А если человек вырубает из диспетчера, то очевидно что это сохранение/что-либо ему не нужно.

serzh82saratov, почему вы ко мне обращаетесь? Я вроде полезность аваста не обсуждал и вообще тема не про него.
Malcev, пример легитимного использования подобного приема привести не затруднит?

11

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

запрещается обсуждение способов осуществления любых форм компьютерного вредительства.

stealzy пишет:

serzh82saratov, почему вы ко мне обращаетесь?

stealzy пишет:

Malcev, пример легитимного использования подобного приема привести не затруднит?

Avast?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: stealzy, 2019-01-24 22:02:01)

Re: AHK: Отказать доступ к отключению процесса.

serzh82saratov, я должен домысливать, что вы имеете ввиду кучей цитирований?
Или по-вашему ТС пишет антивирус на AHK?
И уж если вы беретесь отвечать на вопрос которые задают не вам, вы уверены что аваст использует подобный прием? Очень сомневаюсь.

13

Re: AHK: Отказать доступ к отключению процесса.

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

14

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

шаловливых ручек ... закрытия процесса по ошибке

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

15

Re: AHK: Отказать доступ к отключению процесса.

stealzy
А что тут домысливать? Вы сразу утверждаете (не вступая в беседу) что желание чтобы процесс не закрывался - это вредительство. При этом в топике приведён пример применения распространённой не "вредной" программой.

stealzy пишет:

Или по-вашему ТС пишет антивирус на AHK?

Так это по вашему, я пока явных тому признаков не вижу, так зачем мне думать и гадать.

stealzy пишет:

вы уверены что аваст использует подобный прием? Очень сомневаюсь.

В чём вы сомневаетесь, если он через диспетчер не прибивается!

stealzy пишет:

И уж если вы беретесь отвечать на вопрос которые задают не вам

Как всё серьёзно...
И где в №4 был вопрос кому то?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: stealzy, 2019-01-24 22:36:44)

Re: AHK: Отказать доступ к отключению процесса.

serzh82saratov пишет:

если он через диспетчер не прибивается

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

serzh82saratov пишет:

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

ИМХО, пользователь ясно выражает свою волю, завершая процесс через диспетчер задач на своей машине.

17

Re: AHK: Отказать доступ к отключению процесса.

serzh82saratov пишет:
stealzy пишет:

Или по-вашему ТС пишет антивирус на AHK?

Тут я невнимательно прочитал, думал что вирус.

stealzy пишет:

АВ не держат для этой цели несколько процессов, перезапускающих друг друга

Позвольте, я такого и не говорил. Да и в данном контексте это вообще ничего не решает, если только они не будут клонами.

stealzy пишет:

ИМХО, пользователь ясно выражает свою волю, завершая процесс через диспетчер задач на своей машине.

Так может ТС для детей пишет, оппозиционеров или заключенных, им такое по закону не полагается.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18 (изменено: stealzy, 2019-01-25 01:19:48)

Re: AHK: Отказать доступ к отключению процесса.

serzh82saratov пишет:

Позвольте, я такого и не говорил

Я интересовался у Malcev примером легитимного использования перезапуска клонов, а вы мне привели в пример аваст.

По поводу заключенных детей оппозиционеров пофантазировать было бы можно, но... Вопросы прав пользователя решается администратором, а не разработчиком. Очевидно, что ТС им не является, иначе бы подобный вопрос даже не возник. Единственным правильным решением вопроса в таком случае будет обращание собственно к админу, а вот реализация разработчиком "желания чтобы процесс не закрывался" — это переизобретение malware однозначно

morgan пишет:

Я сейчас пишу программное обеспечение для ПК.

19

Re: AHK: Отказать доступ к отключению процесса.

Даже не знаю где потеряна нить..

stealzy пишет:

Я интересовался у Malcev ... а вы мне привели в пример аваст

Вы уже второй раз беспочвенно пытаетесь меня уличить во влезании в ваш разговоров с кем то?

Позвольте, я такого и не говорил

Ответ на

АВ не держат для этой цели несколько процессов, перезапускающих друг друга

А эта ваша цитата расположена сразу под моей. Так, как-то трудно сообразить к кому обращаются, не находите?

stealzy пишет:

когда подобные желания реализует разработчик

ИМХО это можно реализовать только на низком уровне, и если тут кто то и знает как, то ни за что не расскажет.
Это с родни как - сделать компилятор который сложно декомпилировать, а потом выложить на всеобщее обозрение.
Тема изначально бесперспективная, и может закончится только троллингом, или флудом наподобие нашего с вами.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: Malcev, 2019-01-25 01:46:13)

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

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

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

21

Re: AHK: Отказать доступ к отключению процесса.

Malcev

о-о-о-очень много записи переменных, а при корректном выходе - они записываются в файл.

Очень много, может записываться на диск довольно долго, а например Process Hacker может довольно быстро закрыть несколько выделенных процессов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Отказать доступ к отключению процесса.

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

23

Re: AHK: Отказать доступ к отключению процесса.

Malcev, хм, коварно .

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

24

Re: AHK: Отказать доступ к отключению процесса.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25

Re: AHK: Отказать доступ к отключению процесса.

Ну у нас же нету цели сделать неубиваемое приложение.
Такое в принципе невозможно сделать.
Усложнить можно различными способами, например перехватывать OpenProcess и TerminateProcess.
https://security.stackexchange.com/ques … 1006#31006

26

Re: AHK: Отказать доступ к отключению процесса.

Отличненько, простенький локер у нас готов. Предлагаю Malcev привести код сразу со скрытиями, блокировками и перезапуском. Не скромничайте.

Malcev пишет:

Ну вы об этом можете и не узнать.

Большинство доводилось завершать, а трюк встречался только у malware.
Вы так и не привели ни одной программы, использующей подобный метод. И не приведете, потому что как я уже писал, в операционных системах уже лет двадцать есть механизм разграничения прав, которым и пользуется нормальное по.

27 (изменено: Malcev, 2019-01-25 19:20:07)

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

Вы так и не привели ни одной программы, использующей подобный метод

А вы разве спрашивали меня об этом?
Я таких программ не знаю.

stealzy пишет:

Предлагаю Malcev привести код сразу со скрытиями, блокировками и перезапуском. Не скромничайте.

Этим вы сами можете заняться, а я приведу следующий код, который перенес с c++ отсюда:
https://stackoverflow.com/questions/618 … s-explorer

hProcess := DllCall("GetCurrentProcess")
dwAccessPermissions := (GENERIC_WRITE  := 0x40000000)|(PROCESS_ALL_ACCESS := 0x1F0FFF)|(WRITE_DAC := 0x00040000)|(DELETE := 0x00010000)|(WRITE_OWNER := 0x00080000)|(READ_CONTROL := 0x00020000)
VarSetCapacity(denyAccess, 16+4*A_PtrSize)
DllCall("advapi32\BuildExplicitAccessWithName", "ptr", &denyAccess, "str", "CURRENT_USER", "uint", dwAccessPermissions, "uint", DENY_ACCESS := 3, "uint", NO_INHERITANCE := 0)
DllCall("advapi32\SetEntriesInAcl", "uint", 1, "ptr", &denyAccess, "ptr", 0, "ptr*", pTempDacl)
DllCall("advapi32\SetSecurityInfo", "ptr", hProcess, "uint", SE_KERNEL_OBJECT := 6, "uint", DACL_SECURITY_INFORMATION := 0x00000004, "ptr", 0, "ptr", 0, "ptr", pTempDacl, "ptr", 0)
DllCall("LocalFree", "ptr", pTempDacl)
msgbox process will not close

28

Re: AHK: Отказать доступ к отключению процесса.

Не-а, не работает. Легко закрывается Диспетчером Задач, запущенным от администратора.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: Отказать доступ к отключению процесса.

А он так и должен работать с правами админа.

Note that this has no effect when running programs like Task Manager and Process Explorer as admin, because with SeDebugPrivilege, access checking is bypassed for processes and threads.

30

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:
VarSetCapacity(TRUSTEE, 8+A_PtrSize*3)

Это нигде не используется.

Malcev пишет:

А он так и должен работать с правами админа.

А смысл тогда?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Отказать доступ к отключению процесса.

teadrinker пишет:

Это нигде не используется.

Да, можно без нее.
Топистартер не писал, что пользователи могут что-либо запускать с правами администратора.
Можно конечно еще перехватывать TerminateProcess.
Но это уже по твоей части.

32

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

Топистартер не писал, что пользователи могут что-либо запускать с правами администратора.

На семёрке Диспетчер Задач автоматически с правами админа запускается, если юзер админ, на десятке можно повысить права, если нужно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

Да, можно без нее

TRUSTEE — это часть структуры EXPLICIT_ACCESS (denyAccess).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34 (изменено: Malcev, 2019-01-25 18:44:42)

Re: AHK: Отказать доступ к отключению процесса.

teadrinker пишет:

TRUSTEE — это часть структуры EXPLICIT_ACCESS (denyAccess).

Я знаю.

teadrinker пишет:

На семёрке Диспетчер Задач автоматически с правами админа запускается, если юзер админ, на десятке можно повысить права, если нужно.

Так я ж писал, что этот финт не рассчитан для админов.
Почему у тебя уверенность, что у топикстартера пользователи администраторы?
И понятно, что продвинутый пользователь с правами может обойти любую защиту.

35

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

Я знаю.

Так под неё нужно по идее место в EXPLICIT_ACCESS выделить.
Ну, если не для админа, то наверно подойдёт.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: AHK: Отказать доступ к отключению процесса.

Точно, я ее как пойнтер посчитал.
А как для структуры в структуре считаются оффсеты?
От главной структуры или вложенной?

37 (изменено: teadrinker, 2019-01-25 19:11:39)

Re: AHK: Отказать доступ к отключению процесса.

От главной. Первый элемент TRUSTEE — пойнтер, так что она сразу должна размещаться с дополнительным оффсетом.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

38 (изменено: Malcev, 2019-01-25 19:21:42)

Re: AHK: Отказать доступ к отключению процесса.

Исправил. Хотя, похоже, это ни на что не влияло.

39 (изменено: stealzy, 2019-01-25 19:59:43)

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

А вы разве спрашивали меня об этом?

stealzy пишет:

пример легитимного использования подобного приема привести не затруднит?

Malcev пишет:

Почему у тебя уверенность, что у топикстартера пользователи администраторы?

Если пользователи админами не являются, ограничить их права админу не составляет проблем.

Malcev пишет:

Этим вы сами можете заняться

Предложение было риторическим.

40

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

пример легитимного использования подобного приема привести не затруднит?

Кстати, у IE работает подобный прием, попробуйте закрыть процесс вкладки и увидите как запустится новый.

stealzy пишет:

Если пользователи админами не являются, ограничить их права админу не составляет проблем.

Не у всех есть админы.

41 (изменено: stealzy, 2019-01-26 00:18:34)

Re: AHK: Отказать доступ к отключению процесса.

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

Malcev пишет:

Не у всех есть админы.

Это как? Либо пользователь сам является админом, либо им будет другой человек, другого не дано.

Давайте по пунктам:
1) Ни одна порядочная пользовательская программа не будет препятсвовать своему завершению из диспетчера задач.
2) Те непользовательские, кому важно поддерживать работу, делают путем повышения прав и с благославления администратора. Велосипед изобретать для этого не нужно.
Возражения есть?

42 (изменено: Malcev, 2019-01-26 00:13:06)

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

В IE главный процесс запускает вкладочный и только. IE не препятствует завершению своего главного процесса.

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

stealzy пишет:

Ни с точки зрения механизма, ни с точки зрения цели IE не подходит в качестве примера.

А как по вашему устроен там механизм - процессы по волшебной палочке появляются?
И какая цель у IE?

stealzy пишет:

Ни одна порядочная пользовательская программа не будет препятсвовать своему завершению из диспетчера задач.

Ie, возможно и хром, не проверял.

stealzy пишет:

Те, кому важно поддерживать работу, делают путем повышения прав и с благословления администратора. Велосипед изобретать для этого не нужно.

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

43 (изменено: stealzy, 2019-01-26 00:39:06)

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

Ie, возможно и хром

Оба отлично закрываются из диспетчера.

Malcev пишет:

в которых админа вообще нету

Значит они сами себе админы.

Malcev пишет:

я бы воспользовался своими идеями, а не загружал себя прочтением ненужной мне информации по администратированию сетей

Нужно читать талмуды, чтобы узнать, что пользователь не может завершить админский процесс (если пароль админа рядовым пользователям неизвестен)? Что админ не может завершить процесс учетки уровнем выше?
Мне добавить больше нечего, успехов.

Р.S.
Встречались машины, которые подцепили программы со "своими идеями", их владельцы были в восторге от результатов.

44

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

Оба отлично закрываются из диспетчера.

Попробуйте закрыть конкретно процесс вкладки, а не весь IE целиком.

stealzy пишет:

Значит они сами себе админы.

Работники сидят под пользовательскими аккаунтами.

stealzy пишет:

Нужно читать талмуды, чтобы узнать, что пользователь не может завершить админский процесс? Что админ не может завершить процесс учетки уровнем выше?

Везде есть свои тонкости и хитрости, возможно/наверняка и тут тоже.

stealzy пишет:

Мне добавить больше нечего, успехов.

А как же про цель и механизм работы ИЕ?

45 (изменено: stealzy, 2019-01-26 01:03:47)

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

В IE главный процесс запускает вкладочный и только. IE не препятствует завершению своего главного процесса.

Вроде не тоже самое, что клоны перезапускающие друг друга.

Насчет учетки system я вру, просто некоторые перезапускаются службами. Но раз работники под пользователями, это не проблема.
Тем не менее, не считаю порядочным программе бороться против администратора. Просто так к крайним мерам не прибегают, а если прибегают, то ответственность замыкается на администраторе.

46

Re: AHK: Отказать доступ к отключению процесса.

stealzy пишет:

Вроде не тоже самое, что клоны перезапускающие друг друга.

А разве есть разница кто перезапускает процессы - главное механизм такой же - IE следит за тем, чтобы количество вкладок равнялось количеству процессов.
Какую приследуют они этим цель - не знаю, у хрома кстати процессы вкладок нормально закрываются.
У нас же цель - сохранить информацию перед тем, как процесс принудительно закрыли.
А вы почему-то считаете, что мы обсуждаем и придумываем неубиваемый вирус.

47 (изменено: stealzy, 2019-01-26 01:34:20)

Re: AHK: Отказать доступ к отключению процесса.

Под пример программы, препятсвующей своему завершению IE не подходит, имхо. Не надо мне повторять про процесс вкладки в пятый раз, IE можно тупо закрыть крестиком или убить основной процесс.

Malcev пишет:

У нас же цель - сохранить информацию перед тем, как процесс принудительно закрыли.

Если процесс закрывают принудительно, значит администратора не интересует сохранение информации. В этом смысл слова принудительно. Окошко что идет закрытие и просьбу подождать при закрытии из gui программы некоторые делают, но не более.

48

Re: AHK: Отказать доступ к отключению процесса.

https://habr.com/ru/post/178393/
Попробовал сделать через MinHook враппер - работает.
https://www.autohotkey.com/boards/viewt … p;p=233987

49

Re: AHK: Отказать доступ к отключению процесса.

А что именно перехватил, TerminateProcess?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

50

Re: AHK: Отказать доступ к отключению процесса.

NtOpenProcess.
Но при инжекте autohotkey.dll в 64 битный процесс - процесс валится.
У тебя работает?

51

Re: AHK: Отказать доступ к отключению процесса.

Битность dll должна соответствовать битности скрипта и процесса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

52

Re: AHK: Отказать доступ к отключению процесса.

А у тебя работает - 64бит ahk, запускаем 64бит блокнот и инжектим 64 бит autohotkey.dll?
У меня все 64 битные процессы валятся.
Если работает, то скинь пожалуйста все ссылки.

53 (изменено: teadrinker, 2019-01-27 01:39:54)

Re: AHK: Отказать доступ к отключению процесса.

У меня работает с любыми процессами, только антивирус нужно предупредить.
Инжект такой функцией:

InjectAhkDll(PID,dll:="AutoHotkey.dll",script:=0, deleteThread := false)
{
   static PROCESS_ALL_ACCESS:=0x1F0FFF,MEM_COMMIT := 0x1000,MEM_RELEASE:=0x8000,PAGE_EXECUTE_READWRITE:=64
   ,hKernel32:=DllCall("LoadLibrary","Str","kernel32.dll","PTR"),LoadLibraryA:=DllCall("GetProcAddress","PTR",hKernel32,"AStr","LoadLibraryA","PTR")
   ,FreeLibrary:=DllCall("GetProcAddress","PTR",hKernel32,"AStr","FreeLibrary","PTR")
   ,TH32CS_SNAPMODULE:=0x00000008,INVALID_HANDLE_VALUE:=-1
   ,MAX_PATH:=260,MAX_MODULE_NAME32:=255,ModuleName:="",init:=VarSetCapacity(ModuleName,MAX_PATH*(A_IsUnicode?2:1))
   base:= deleteThread ? {__Call:"InjectAhkDll",__Delete:"InjectAhkDll"} : {__Call:"InjectAhkDll"}

   if IsObject(PID)
   {
      if (dll!="Exec" && script)
         return "Only Exec method can be used here!"

      hProc := DllCall("OpenProcess", "UInt", PROCESS_ALL_ACCESS, "Int",0, "UInt", PID.PID,"PTR")
      if !hProc
         return "Could not open process for PID: " PID.PID

      if (!script) ; Free Library in remote process (object is being deleted)
      {
         ; Terminate the thread in ahkdll
         hThread := DllCall("CreateRemoteThread", "PTR", hProc, "PTR", 0, "PTR", 0, "PTR", PID.ahkTerminate, "PTR", 0, "UInt", 0, "PTR", 0,"PTR")
         DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
         ,DllCall("CloseHandle", "PTR", hThread)

         ; Free library in remote process
         hThread := DllCall("CreateRemoteThread", "PTR", hProc, "UInt", 0, "UInt", 0, "PTR", FreeLibrary, "PTR", PID.hModule, "UInt", 0, "UInt", 0,"PTR")
         DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
         ,DllCall("CloseHandle", "PTR", hThread),DllCall("CloseHandle", "PTR", hProc)
         return
      }

      nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
      ,StrPut(script,&nScript)

      ; Reserve memory in remote process where our script will be saved
      if !pBufferRemote := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nScriptLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
         return "Could not reseve memory for process"
      ,DllCall("CloseHandle", "PTR", hProc)

      ; Write script to remote process memory
      DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferRemote, "Ptr", &nScript, "PTR", nScriptLength, "Ptr", 0)

      ; Start execution of code
      hThread := DllCall("CreateRemoteThread", "PTR", hProc, "PTR", 0, "PTR", 0, "PTR", PID.ahkExec, "PTR", pBufferRemote, "UInt", 0, "PTR", 0,"PTR")
      if !hThread
      {
         DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nScriptLength,MEM_RELEASE)
         ,DllCall("CloseHandle", "PTR", hProc)
         return "Could not execute script in remote process"
      }

      ; Wait for thread to finish
      DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)

      ; Get Exit code returned by ahkExec (1 = script could be executed / 0 = script could not be executed)
      DllCall("GetExitCodeThread", "PTR", hThread, "UIntP", lpExitCode)
      if !lpExitCode
         return "Could not execute script in remote process"

      DllCall("CloseHandle", "PTR", hThread)
      ,DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nScriptLength,MEM_RELEASE)
      ,DllCall("CloseHandle", "PTR", hProc)
      return
   }
   else if !hDll:=DllCall("LoadLibrary","Str",dll,"PTR")
      return "Could not find " dll " library", DllCall("CloseHandle", "PTR", hProc)
   else
   {
      hProc := DllCall("OpenProcess","UInt", PROCESS_ALL_ACCESS, "Int",0,"UInt", DllCall("GetCurrentProcessId"),"PTR")
      DllCall("GetModuleFileName","PTR",hDll,"PTR",&ModuleName,"UInt",MAX_PATH)
      DllCall("CloseHandle","PTR",hProc)
   }
   ; Open Process to PID
   hProc := DllCall("OpenProcess", "UInt", PROCESS_ALL_ACCESS, "Int",0, "UInt", PID,"PTR")
   if !hProc
      return "Could not open process for PID: " PID

   ; Reserve some memory and write dll path (ANSI)
   nDirLength := VarSetCapacity(nDir, StrLen(dll)+1, 0)
   ,StrPut(dll,&nDir,"CP0")

   ; Reserve memory in remote process
   if !pBufferRemote := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nDirLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
      return "Could not reseve memory for process", DllCall("CloseHandle", "PTR", hProc)

   ; Write dll path to remote process memory
   DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferRemote, "Ptr", &nDir, "PTR", nDirLength, "Ptr", 0)

   ; Start new thread loading our dll

   hThread:=DllCall("CreateRemoteThread","PTR",hProc,"PTR",0,"PTR",0,"PTR",LoadLibraryA,"PTR",pBufferRemote,"UInt",0,"PTR",0,"PTR")
   if !hThread
   {
      DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,"Uint",MEM_RELEASE)
      ,DllCall("CloseHandle", "PTR", hProc)
      return "Could not load " dll " in remote process"
   }
   ; Wait for thread to finish
   DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)

   ; Get Exit code returned by thread (HMODULE for our dll)
   DllCall("GetExitCodeThread", "PTR", hThread, "UInt*", hModule)

   ; Close Thread
   DllCall("CloseHandle", "PTR", hThread)

   if (A_PtrSize=8)
   { ; use different method to retrieve base address because GetExitCodeThread returns DWORD only
      hModule:=0,VarSetCapacity(me32, (A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), 0) ;W:1080:1064, A:564:548
      ;  Take a snapshot of all modules in the specified process.
      hModuleSnap := DllCall("CreateToolhelp32Snapshot","UInt", TH32CS_SNAPMODULE,"UInt", PID, "PTR" )
      if ( hModuleSnap != INVALID_HANDLE_VALUE )
      {
         ; reset hModule and set the size of the structure before using it.
         NumPut((A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), &me32, 0, "UInt") ;dwSize  ;W:1080:1064, A:564:548
         ;  Retrieve information about the first module,
         ;  and exit if unsuccessful
         if ( !DllCall("Module32First" (A_IsUnicode?"W":""),"PTR", hModuleSnap,"PTR", &me32 ) )
         {
            ; Free memory used for passing dll path to remote thread
            DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
            ,DllCall("CloseHandle","PTR", hModuleSnap ) ; Must clean up the snapshot object!
            return false
         }
         ;  Now walk the module list of the process,and display information about each module
         while(A_Index=1 || DllCall("Module32Next" (A_IsUnicode?"W":""),"PTR",hModuleSnap,"PTR", &me32 ) )
            if (StrGet(&me32+(A_PtrSize=8?48:32)+(A_IsUnicode?512:256))=dll) ;szExePath ;W:560:544, A:304:288
            {
               hModule := NumGet(me32, A_PtrSize=8?40:28, "Ptr") ;hModule
               break
            }
         DllCall("CloseHandle","PTR",hModuleSnap) ; clean up
      }
   }

   hDll:=DllCall("LoadLibrary","Str",dll,"PTR")

   ; Calculate pointer to ahkdll and ahkExec functions
   ahktextdll:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahktextdll","PTR")-hDll
   ahkExec:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahkExec","PTR")-hDll
   ahkTerminate:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahkTerminate","PTR")-hDll

   if script
   {
      nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
      ,StrPut(script,&nScript)
      ; Reserve memory in remote process where our script will be saved
      if !pBufferScript := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nScriptLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
         return "Could not reseve memory for process"
      ,DllCall("CloseHandle", "PTR", hProc)

      ; Write script to remote process memory
      DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferScript, "Ptr", &nScript, "PTR", nScriptLength, "Ptr", 0)
   }
   else
      pBufferScript:=0

   ; Run ahkdll function in remote thread
   hThread := DllCall("CreateRemoteThread","PTR",hProc,"PTR",0,"PTR",0,"PTR",ahktextdll,"PTR",pBufferScript,"PTR",0,"UInt",0,"PTR")
   if !hThread
   { ; could not start ahkdll in remote process
      ; Free memory used for passing dll path to remote thread
      DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
      DllCall("CloseHandle", "PTR", hProc)
      return "Could not start ahkdll in remote process"
   }
   DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
   DllCall("GetExitCodeThread", "PTR", hThread, "UIntP", lpExitCode)

   ; Release memory and handles
   DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
   DllCall("CloseHandle", "PTR", hThread)
   DllCall("CloseHandle", "PTR", hProc)

   if !lpExitCode ; thread could not be created.
      return "Could not create a thread in remote process"

   return {PID:PID,hModule:hModule,ahkExec:ahkExec,ahkTerminate:ahkTerminate,base:base}
}

Последний параметр — сохранять ли заинжектированный поток.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

54

Re: AHK: Отказать доступ к отключению процесса.

Понял в чем моя причина была.
Я запускал относительным путем:

rThread:=InjectAhkDll(pid, "AutoHotkeyMini" A_PtrSize*8 ".dll")

И по каким-то причинам так не работало на x64, а на x32 работало.

55 (изменено: serzh82saratov, 2019-01-27 12:41:15)

Re: AHK: Отказать доступ к отключению процесса.

Malcev
После инжекта надо выполнить код подобный этому:


code =
(LTrim
	SetWorkingDir, %A_ScriptDir%
	#Include %A_ScriptDir%\Lib\MinHook.ahk

	hook1 := New MinHook("user32.dll", "SetDlgItemTextW", "SetDlgItemTextW_Hook")
	hook1.Enable()
	return

	SetDlgItemTextW_Hook(hDlg, nIDDlgItem, lpString) {
		global hook1
		return DllCall(hook1.original, "ptr", hDlg, "int", nIDDlgItem, "str", "Hello ^_^")
	}
)
rThread.Exec(code)

Как выглядит запрос к MinHook и обработчик в случае NtOpenProcess, и почему NtOpenProcess а не TerminateProcess?
И в случае хука закрытия своего процесса, инжектить надо в свой же процесс?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

56 (изменено: serzh82saratov, 2019-01-27 13:03:00)

Re: AHK: Отказать доступ к отключению процесса.

InjectAhkDll от teadrinker из 53. Кстати какие отличия от идущей в комплекте? Кроме того что не требуются _Struct и sizeof.

Вот мой нерабочий наивный код, инжект в свой процесс в ожидании TerminateProcess.


code =
(LTrim
	SetWorkingDir, %A_ScriptDir%
	#Include %A_ScriptDir%\Lib\MinHook.ahk

	hook1 := New MinHook("Kernel32.dll", "TerminateProcess", "TerminateProcess_Hook")
	hook1.Enable()
	return


	TerminateProcess_Hook(hProcess, uExitCode) {
		global hook1
		MsgBox TerminateProcess_Hook
		return DllCall(hook1.original, "Ptr", hProcess, "Uint", uExitCode)
	}
)

if (A_Is64bitOS && A_PtrSize = 4)
{
	Run, %A_AhkPath%\..\AutoHotkeyU64.exe "%A_ScriptFullPath%", %A_ScriptDir%
	ExitApp
}

dllFile := FileExist("AutoHotkeyMini.dll") ? A_ScriptDir "\AutoHotkeyMini.dll"
          : (A_PtrSize = 8) ? A_ScriptDir "\ahkDll\x64\AutoHotkeyMini.dll"
          : A_ScriptDir "\ahkDll\x32\AutoHotkeyMini.dll"

pid := DllCall("GetCurrentProcessId")

rThread := InjectAhkDll(pid, dllFile, "") 
rThread.Exec(code)
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

57

Re: AHK: Отказать доступ к отключению процесса.

serzh82saratov пишет:

какие отличия от идущей в комплекте?

В моём варианте добавлен параметр «deleteThread».

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

58

Re: AHK: Отказать доступ к отключению процесса.

Я использовал переделанный код от jeeswg:
https://www.autohotkey.com/boards/viewt … mp;t=56720
Кстати, по этой ссылке показано как запускать ком объекты в захваченном процессе.
serzh82saratov, я подробно в этой теме не копался, я инжектил dll в таскменеджер и перенаправлял его запросы на открытие процессов, так как перед тем как что-то закрыть, он по идее должен их открыть.

hook1 := New MinHook("ntdll.dll", "NtOpenProcess", "MessageBoxW_Hook")

После перехвата надо проверять, что это за процесс и если процесс нужной нам программы, разрешать его открыть, в противном же случае запрещать.
Но я уже этим не стал заниматься - просто проверил, что процессы не закрываются.
Кстати, можно это сделать и без minhook:
https://autohotkey.com/board/topic/8530 … dir/page-4

59

Re: AHK: Отказать доступ к отключению процесса.

teadrinker пишет:

В моём варианте добавлен параметр «deleteThread».

Это будет значить, что поток вызвавший перехваченную функцию будет закрыт?
Malcev
Спасибо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

60 (изменено: teadrinker, 2019-01-27 18:18:39)

Re: AHK: Отказать доступ к отключению процесса.

Если true — созданный поток выполняет код до return и закрывается.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

61

Re: AHK: Отказать доступ к отключению процесса.

teadrinker, а у тебя на 64 битах такой код не валит блокнот?

#persistent
Run notepad.exe,,,PID
rThread:=InjectAhkDll(PID, ,"#Persistent`nMsgBox % A_WorkingDir")
InjectAhkDll(PID,dll:="AutoHotkey.dll",script:=0, deleteThread := false)
{
   ...
}

62

Re: AHK: Отказать доступ к отключению процесса.

Не валит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

63

Re: AHK: Отказать доступ к отключению процесса.

А как думаешь в связи с чем такое может быть?

64

Re: AHK: Отказать доступ к отключению процесса.

Наверно битности не совпадают.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

65 (изменено: Malcev, 2019-01-29 23:30:37)

Re: AHK: Отказать доступ к отключению процесса.

Так не работает:

#persistent
Run notepad.exe,,,PID
rThread:=InjectAhkDll(PID, "AutoHotkey.dll","#Persistent`nMsgBox % A_WorkingDir")
InjectAhkDll(PID,dll:="AutoHotkey.dll",script:=0, deleteThread := false)
{
   ...
}

Так работает:

#persistent
Run notepad.exe,,,PID
rThread:=InjectAhkDll(PID, A_ScriptDir "\AutoHotkey.dll","#Persistent`nMsgBox % A_WorkingDir")
InjectAhkDll(PID,dll:="AutoHotkey.dll",script:=0, deleteThread := false)
{
   ...
}

66

Re: AHK: Отказать доступ к отключению процесса.

Malcev пишет:

Понял в чем моя причина была.
Я запускал относительным путем:

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

67

Re: AHK: Отказать доступ к отключению процесса.

Ну да, непонятно почему так у меня происходит.

68

Re: AHK: Отказать доступ к отключению процесса.

А у всех по другому?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

69

Re: AHK: Отказать доступ к отключению процесса.

A_WorkingDir в скрипте проверял?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

70

Re: AHK: Отказать доступ к отключению процесса.

А у тебя тоже так?
teadrinker говорит, что у него работает.

71

Re: AHK: Отказать доступ к отключению процесса.

Нет, я полный путь к dll указывал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

72

Re: AHK: Отказать доступ к отключению процесса.

У меня не крашит, но и не работает хук.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

73

Re: AHK: Отказать доступ к отключению процесса.

InjectAhkDll от teadrinker.

#SingleInstance Force
#NoEnv
#Persistent 
code =
(LTrim
	SetWorkingDir, %A_ScriptDir%
	#Include %A_ScriptDir%\Lib\MinHook.ahk

	hook1 := New MinHook("user32.dll", "SetDlgItemTextW", "SetDlgItemTextW_Hook")
	hook1.Enable()
	return
	
	
	
	SetDlgItemTextW_Hook(hDlg, nIDDlgItem, lpString) {
		global hook1
		return DllCall(hook1.original, "ptr", hDlg, "int", nIDDlgItem, "str", "Hello ^_^")
	}
)

if (A_Is64bitOS && A_PtrSize = 4)
{
	Run, %A_AhkPath%\..\AutoHotkeyU64.exe "%A_ScriptFullPath%", %A_ScriptDir%
	ExitApp
}

Run, notepad,,, pid
WinWait, ahk_pid %pid%

dllFile := FileExist("AutoHotkeyMini.dll") ?  "\AutoHotkeyMini.dll"
          : (A_PtrSize = 8)                  ?  "\ahkDll\x64\AutoHotkeyMini.dll"
          :  "\ahkDll\x32\AutoHotkeyMini.dll"
rThread := InjectAhkDll(pid, dllFile, "")
rThread.Exec(code) 
WinMenuSelectItem,,, 5&, 3&
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

74

Re: AHK: Отказать доступ к отключению процесса.

teadrinker, а если полный путь не указывать, то у тебя крашит?

75

Re: AHK: Отказать доступ к отключению процесса.

Крашит.
У меня в примере "\ahkDll\x64\AutoHotkeyMini.dll" надо было убрать "\" в начале.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

76

Re: AHK: Отказать доступ к отключению процесса.

Значит, выходит, что баг.

77

Re: AHK: Отказать доступ к отключению процесса.

Да, у меня тоже крашит, наверно баг в функции, потом посмотрю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

78

Re: AHK: Отказать доступ к отключению процесса.

Добавьте:

   Loop, Files, %dll%, F
      dll := A_LoopFileLongPath
   ; Reserve some memory and write dll path (ANSI)
   nDirLength := VarSetCapacity(nDir, StrLen(dll)+1, 0)
   ,StrPut(dll,&nDir,"CP0")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

79

Re: AHK: Отказать доступ к отключению процесса.

А в чем причина такого поведения на x64?

80

Re: AHK: Отказать доступ к отключению процесса.

Скорее всего из-за этой строки:

if (StrGet(&me32+(A_PtrSize=8?48:32)+(A_IsUnicode?512:256))=dll)

StrGet возвращает полные пути.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

81

Re: AHK: Отказать доступ к отключению процесса.

Новую версию InjectAhkDll можешь привести, и небольшой ликбез: эта штука может выполнить динамичный код анк в новом процессе и в своём.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

82

Re: AHK: Отказать доступ к отключению процесса.

InjectAhkDll(PID,dll:="AutoHotkey64.dll",script:=0, deleteThread := false)
{
   static PROCESS_ALL_ACCESS:=0x1F0FFF,MEM_COMMIT := 0x1000,MEM_RELEASE:=0x8000,PAGE_EXECUTE_READWRITE:=64
   ,hKernel32:=DllCall("LoadLibrary","Str","kernel32.dll","PTR"),LoadLibraryA:=DllCall("GetProcAddress","PTR",hKernel32,"AStr","LoadLibraryA","PTR")
   ,FreeLibrary:=DllCall("GetProcAddress","PTR",hKernel32,"AStr","FreeLibrary","PTR")
   ,TH32CS_SNAPMODULE:=0x00000008,INVALID_HANDLE_VALUE:=-1
   ,MAX_PATH:=260,MAX_MODULE_NAME32:=255,ModuleName:="",init:=VarSetCapacity(ModuleName,MAX_PATH*(A_IsUnicode?2:1))
   base:= deleteThread ? {__Call:"InjectAhkDll",__Delete:"InjectAhkDll"} : {__Call:"InjectAhkDll"}

   if IsObject(PID)
   {
      if (dll!="Exec" && script)
         return "Only Exec method can be used here!"

      hProc := DllCall("OpenProcess", "UInt", PROCESS_ALL_ACCESS, "Int",0, "UInt", PID.PID,"PTR")
      if !hProc
         return "Could not open process for PID: " PID.PID

      if (!script) ; Free Library in remote process (object is being deleted)
      {
         ; Terminate the thread in ahkdll
         hThread := DllCall("CreateRemoteThread", "PTR", hProc, "PTR", 0, "PTR", 0, "PTR", PID.ahkTerminate, "PTR", 0, "UInt", 0, "PTR", 0,"PTR")
         DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
         ,DllCall("CloseHandle", "PTR", hThread)

         ; Free library in remote process
         hThread := DllCall("CreateRemoteThread", "PTR", hProc, "UInt", 0, "UInt", 0, "PTR", FreeLibrary, "PTR", PID.hModule, "UInt", 0, "UInt", 0,"PTR")
         DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
         ,DllCall("CloseHandle", "PTR", hThread),DllCall("CloseHandle", "PTR", hProc)
         return
      }

      nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
      ,StrPut(script,&nScript)

      ; Reserve memory in remote process where our script will be saved
      if !pBufferRemote := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nScriptLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
         return "Could not reseve memory for process"
      ,DllCall("CloseHandle", "PTR", hProc)

      ; Write script to remote process memory
      DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferRemote, "Ptr", &nScript, "PTR", nScriptLength, "Ptr", 0)

      ; Start execution of code
      hThread := DllCall("CreateRemoteThread", "PTR", hProc, "PTR", 0, "PTR", 0, "PTR", PID.ahkExec, "PTR", pBufferRemote, "UInt", 0, "PTR", 0,"PTR")
      if !hThread
      {
         DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nScriptLength,MEM_RELEASE)
         ,DllCall("CloseHandle", "PTR", hProc)
         return "Could not execute script in remote process"
      }

      ; Wait for thread to finish
      DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)

      ; Get Exit code returned by ahkExec (1 = script could be executed / 0 = script could not be executed)
      DllCall("GetExitCodeThread", "PTR", hThread, "UIntP", lpExitCode)
      if !lpExitCode
         return "Could not execute script in remote process"

      DllCall("CloseHandle", "PTR", hThread)
      ,DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nScriptLength,MEM_RELEASE)
      ,DllCall("CloseHandle", "PTR", hProc)
      return
   }
   else if !hDll:=DllCall("LoadLibrary","Str",dll,"PTR")
      return "Could not find " dll " library", DllCall("CloseHandle", "PTR", hProc)
   else
   {
      hProc := DllCall("OpenProcess","UInt", PROCESS_ALL_ACCESS, "Int",0,"UInt", DllCall("GetCurrentProcessId"),"PTR")
      DllCall("GetModuleFileName","PTR",hDll,"PTR",&ModuleName,"UInt",MAX_PATH)
      DllCall("CloseHandle","PTR",hProc)
   }
   ; Open Process to PID
   hProc := DllCall("OpenProcess", "UInt", PROCESS_ALL_ACCESS, "Int",0, "UInt", PID,"PTR")
   if !hProc
      return "Could not open process for PID: " PID
   
   Loop, Files, %dll%, F
      dll := A_LoopFileLongPath
   ; Reserve some memory and write dll path (ANSI)
   nDirLength := VarSetCapacity(nDir, StrLen(dll)+1, 0)
   ,StrPut(dll,&nDir,"CP0")

   ; Reserve memory in remote process
   if !pBufferRemote := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nDirLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
      return "Could not reseve memory for process", DllCall("CloseHandle", "PTR", hProc)

   ; Write dll path to remote process memory
   DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferRemote, "Ptr", &nDir, "PTR", nDirLength, "Ptr", 0)

   ; Start new thread loading our dll

   hThread:=DllCall("CreateRemoteThread","PTR",hProc,"PTR",0,"PTR",0,"PTR",LoadLibraryA,"PTR",pBufferRemote,"UInt",0,"PTR",0,"PTR")
   if !hThread
   {
      DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,"Uint",MEM_RELEASE)
      ,DllCall("CloseHandle", "PTR", hProc)
      return "Could not load " dll " in remote process"
   }
   ; Wait for thread to finish
   DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)

   ; Get Exit code returned by thread (HMODULE for our dll)
   DllCall("GetExitCodeThread", "PTR", hThread, "UInt*", hModule)

   ; Close Thread
   DllCall("CloseHandle", "PTR", hThread)

   if (A_PtrSize=8)
   { ; use different method to retrieve base address because GetExitCodeThread returns DWORD only
      hModule:=0,VarSetCapacity(me32, (A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), 0) ;W:1080:1064, A:564:548
      ;  Take a snapshot of all modules in the specified process.
      hModuleSnap := DllCall("CreateToolhelp32Snapshot","UInt", TH32CS_SNAPMODULE,"UInt", PID, "PTR" )
      if ( hModuleSnap != INVALID_HANDLE_VALUE )
      {
         ; reset hModule and set the size of the structure before using it.
         NumPut((A_PtrSize=8?48:32)+(A_IsUnicode?1032:516), &me32, 0, "UInt") ;dwSize  ;W:1080:1064, A:564:548
         ;  Retrieve information about the first module,
         ;  and exit if unsuccessful
         if ( !DllCall("Module32First" (A_IsUnicode?"W":""),"PTR", hModuleSnap,"PTR", &me32 ) )
         {
            ; Free memory used for passing dll path to remote thread
            DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
            ,DllCall("CloseHandle","PTR", hModuleSnap ) ; Must clean up the snapshot object!
            return false
         }
         ;  Now walk the module list of the process,and display information about each module
         while(A_Index=1 || DllCall("Module32Next" (A_IsUnicode?"W":""),"PTR",hModuleSnap,"PTR", &me32 ) )
            if (StrGet(&me32+(A_PtrSize=8?48:32)+(A_IsUnicode?512:256))=dll) ;szExePath ;W:560:544, A:304:288
            {
               hModule := NumGet(me32, A_PtrSize=8?40:28, "Ptr") ;hModule
               break
            }
         DllCall("CloseHandle","PTR",hModuleSnap) ; clean up
      }
   }

   hDll:=DllCall("LoadLibrary","Str",dll,"PTR")

   ; Calculate pointer to ahkdll and ahkExec functions
   ahktextdll:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahktextdll","PTR")-hDll
   ahkExec:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahkExec","PTR")-hDll
   ahkTerminate:=hModule+DllCall("GetProcAddress","PTR",hDll,"AStr","ahkTerminate","PTR")-hDll

   if script
   {
      nScriptLength := VarSetCapacity(nScript, (StrLen(script)+1)*(A_IsUnicode?2:1), 0)
      ,StrPut(script,&nScript)
      ; Reserve memory in remote process where our script will be saved
      if !pBufferScript := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "PTR", nScriptLength, "UInt", MEM_COMMIT, "UInt", PAGE_EXECUTE_READWRITE, "Ptr")
         return "Could not reseve memory for process"
      ,DllCall("CloseHandle", "PTR", hProc)

      ; Write script to remote process memory
      DllCall("WriteProcessMemory", "Ptr", hProc, "Ptr", pBufferScript, "Ptr", &nScript, "PTR", nScriptLength, "Ptr", 0)
   }
   else
      pBufferScript:=0

   ; Run ahkdll function in remote thread
   hThread := DllCall("CreateRemoteThread","PTR",hProc,"PTR",0,"PTR",0,"PTR",ahktextdll,"PTR",pBufferScript,"PTR",0,"UInt",0,"PTR")
   if !hThread
   { ; could not start ahkdll in remote process
      ; Free memory used for passing dll path to remote thread
      DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
      DllCall("CloseHandle", "PTR", hProc)
      return "Could not start ahkdll in remote process"
   }
   DllCall("WaitForSingleObject", "PTR", hThread, "UInt", 0xFFFFFFFF)
   DllCall("GetExitCodeThread", "PTR", hThread, "UIntP", lpExitCode)

   ; Release memory and handles
   DllCall("VirtualFreeEx","PTR",hProc,"PTR",pBufferRemote,"PTR",nDirLength,MEM_RELEASE)
   DllCall("CloseHandle", "PTR", hThread)
   DllCall("CloseHandle", "PTR", hProc)

   if !lpExitCode ; thread could not be created.
      return "Could not create a thread in remote process"

   return {PID:PID,hModule:hModule,ahkExec:ahkExec,ahkTerminate:ahkTerminate,base:base}
}

Ликбез пока не могу, работы завал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

83

Re: AHK: Отказать доступ к отключению процесса.

В своём понял как. А этим можно создать новый отдельный поток, ну чтобы два цикла работали, ну вы меня поняли.


#SingleInstance Force
#NoEnv
#Persistent 
code =
(LTrim
	
	MsgBox 1
)

if (A_Is64bitOS && A_PtrSize = 4)
{
	Run, %A_AhkPath%\..\AutoHotkeyU64.exe "%A_ScriptFullPath%", %A_ScriptDir%
	ExitApp
}
 
pid := DllCall("GetCurrentProcessId")

dllFile := FileExist("AutoHotkeyMini.dll") ? A_ScriptDir "\AutoHotkeyMini.dll"
          : (A_PtrSize = 8) ? A_ScriptDir "\ahkDll\x64\AutoHotkeyMini.dll"
          : A_ScriptDir "\ahkDll\x32\AutoHotkeyMini.dll"
		  
rThread := InjectAhkDll(pid, dllFile, "")
rThread.Exec(code)
MsgBox 2
ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

84

Re: AHK: Отказать доступ к отключению процесса.

Написал  баг репорт на оф. форуме.

85

Re: AHK: Отказать доступ к отключению процесса.

Можно и без Loop, Files. В этой строке получают ModuleName:

DllCall("GetModuleFileName","PTR",hDll,"PTR",&ModuleName,"UInt",MAX_PATH)

а потом эта переменная нигде не используется. Можно

	else
	{
		hProc := DllCall("OpenProcess","UInt", PROCESS_ALL_ACCESS, "Int",0,"UInt", DllCall("GetCurrentProcessId"),"PTR")
		DllCall("GetModuleFileName","PTR",hDll,"PTR",&ModuleName,"UInt",MAX_PATH)
		DllCall("CloseHandle","PTR",hProc)
	}
	dll := StrGet(&ModuleName)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder