Как запретить чужой программе закрыться?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как запретить чужой программе закрыться?

Сообщение arthur2 » 10.01.2011 (Пн) 16:23

Скажем, на примере блокнота: вот я запустил блокнот. Как сделать так, чтобы пользователь не смог его закрыть стандартным способом Убиение процесса не в счёт - речь именно запрете штатного выхода - по крестику, Альт-Ф4 или через меню Файл>Выход
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как запретить чужой программе закрыться?

Сообщение alibek » 10.01.2011 (Пн) 17:48

Перехватить и заблокировать сообщение WM_CLOSE.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 10.01.2011 (Пн) 19:29

А как перехватить, если субклассить чужое окно нельзя? Хук, что ли, ставить?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 10.01.2011 (Пн) 20:17

arthur2 писал(а):А как перехватить, если субклассить чужое окно нельзя?

Чего это нельзя? Всё можно. Сабклассинг — создание подкласса класса окна путём замены процедуры класса на свою процедуру, использующую оригинальную процедуру класса. В этом определении нет дифференцирования на свои и чужие окна, значит оно имеет искусственное происхождение. А конкретно: оконная процедура (что очевидно) должна быть в АП процесса, владеющего потоком, владеющим окном. Так что если окно чужого процесса, то WP надо поместить в его (чужого процесса) АП.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 10.01.2011 (Пн) 20:31

Хакер писал(а):Так что если окно чужого процесса, то WP надо поместить в его (чужого процесса) АП
Понятно :) А как такое сделать? Без асма возможно?
Артур
 
   

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Re: Как запретить чужой программе закрыться?

Сообщение Demonx » 10.01.2011 (Пн) 21:47

Изображение

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 10.01.2011 (Пн) 21:54

в этом примере - левая dll без исходников
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 10.01.2011 (Пн) 22:09

arthur2 писал(а):А как такое сделать? Без асма возможно?

Без асма — запросто. Я бы перефразировал вопрос: а зачем асм?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как запретить чужой программе закрыться?

Сообщение alibek » 10.01.2011 (Пн) 22:18

arthur2 писал(а):А как такое сделать? Без асма возможно?

Статью GSerg-а почитай.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 10.01.2011 (Пн) 23:16

Ещё бы знать, которую, и как её найти :oops:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 11.01.2011 (Вт) 0:41

alibek писал(а):Статью GSerg-а почитай.

Мне кажется у него такой не было. Было у ANDLL-а, но с асмом.

Впрочем, отвечая на вопрос прямо: для того, чтобы поместить WP в АП чужого процесса, нужно всего две функции: VirtualAllocEx и WriteProcessMemory. Переспрошу: и зачем тут асм?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 11.01.2011 (Вт) 6:09

Хакер писал(а):Переспрошу: и зачем тут асм?
Решение задачи не представлял даже теоретически, вот и предположил.

Сейчас тоже ещё не очень представляю. Кстати, а для таких действий, скажем, в семерке какие нужны права? А то хук мне не дают ставить, даже если запустить его от администратора.
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как запретить чужой программе закрыться?

Сообщение Twister » 11.01.2011 (Вт) 9:54

А вообще вопрос-то в чём? Как внедриться или как сабклассить?

Если в первом, то нужно малость доп. инфы - ты ли запускаешь процесс (или внедриться надо в уже запущенный), какие права в системе, требуется ли корректная обработка UAC на Vista+?

Если во втором, то могу подсобить готовым примером. Правда с моей стороны не совсем этично выкладывать именно такой код, ну да ладно, тут же все свои :)
Трудится у нас на фирме одна девочка. Девочкой назвать её сложно, а вот сволочью в самый раз - почти все сотрудники на неё зуб точат. А она сидит и пальцы гнёт, ей всё по барабану, она любимица начальства. И решили мы девочку наказать доступными программерам способами. Сначала пару раз "контакт" вскрывали, а потом я на коленке написал маленькую dll... Есть у нас одна программулина, основной рабочий инструмент для всех. И для девочки в том числе. Управление программулиной в основном осуществляется с помощью псевдо-тулбара, каждая кнопочка которого - окно класса TcxButton определённого размера. Так вот dll'ка добавляет к этим кнопочкам эффект заедания, т.е. чтобы нажать на кнопку нужно раз десять кликнуть мышкой. :)

Работает dll примерно так:
    Загружается в АП целевого процесса
    Ставит локальный CBT-хук для отлова оконных сообщений
    Обработчик CBT-хука ловит момент передачи фокуса окнам
    Если это нужное нам окно, то оно сабклассится (только один раз, естественно)
    Новая оконная процедура фильтрует сообщения WM_LBUTTONDOWN и WM_LBUTTONUP, давая им нормально отработать в одном из восьми случаев

ЗЫ. Там чистый API, так что про незнание Делфей ничего говорить не стоит ;)
Вложения
dll.rar
(39.14 Кб) Скачиваний: 68
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 11.01.2011 (Вт) 18:32

Twister писал(а):А вообще вопрос-то в чём? Как внедриться или как сабклассить?
Как внедриться :)

Twister писал(а):ты ли запускаешь процесс (или внедриться надо в уже запущенный), какие права в системе, требуется ли корректная обработка UAC на Vista+?

Я запускаю. Семерка со стандантными правами. Запускающий процесс может быть от имени администратора, запускаемый - с минимальными правами. UAC включен. Способ хотелось бы "законный" :)
Если это хук, то хук в семерке ставить не дают. Причем, молча - и Run As Administrator не помогает. Если отключить UAC - тогда дают, но хочется с включеным.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 11.01.2011 (Вт) 18:47

arthur2 писал(а):Как внедриться :)

Выделить в чужом процессе память с помощью VirtualAllocEx. Скопировать туда функцию (WindowProc) с помощью WriteProcessMemory.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как запретить чужой программе закрыться?

Сообщение Antonariy » 11.01.2011 (Вт) 21:58

А как узнать размер процедуры?
Лучший способ понять что-то самому — объяснить это другому.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 11.01.2011 (Вт) 22:03

Xакер Суть твоего варианта я понял :) Кстати,
arthur2 писал(а):а для таких действий, скажем, в семерке какие нужны права?
И ещё - как узнать, сколько байт копировать? То есть, сколько занимает в памяти та или иная функция? Что мне приходит в голову - от Addressof одной и до Addressof следующей?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 11.01.2011 (Вт) 22:35

Antonariy писал(а):А как узнать размер процедуры?

Код: Выделить всё
Sub A
   fooooo barr
End Sub:Sub End_of_A:end sub

SizeOfA = AddressOf End_of_A - AddressOf A 'по смыслу
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 11.01.2011 (Вт) 23:32

Ну вот - значит я правильно сообразил :) Запись прикольная :D

А как всё-таки насчёт прав на такую фишку?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 11.01.2011 (Вт) 23:38

arthur2 писал(а):А как всё-таки насчёт прав на такую фишку?

Все права всегда указываются в описании API-функций. Если новомодные системы безопасности в пост-XP-системах используют стандартную модель прав, то всё окей, а если нет, я не знаю, так как не имел дело с системами безопасности (вроде UAC) в пост-Xp-системах (как и с самими системами).

Для выделения памяти в чужом процессе его хендл должен быть открыт с правом PROCESS_VM_OPERATION.
Для записи в память чужого процесса его хендл должен иметь это же право, плюс ещё право PROCESS_VM_WRITE.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как запретить чужой программе закрыться?

Сообщение Twister » 12.01.2011 (Ср) 7:16

Эм, arthur2, а ты собрался просто так вот взять первую попавшуюся процедуру и запустить её в чужом процессе? :wink:

Если это хук, то хук в семерке ставить не дают. Причем, молча - и Run As Administrator не помогает. Если отключить UAC - тогда дают, но хочется с включеным.
Нужно добавить соответствующий манифест, тогда будет "не молча".

Я запускаю.
Тогда я рекомендую не заморачиваться с внедрением кода процедуры окна. Тебе такой код всё равно придётся писать базонезависимым.

Напиши библиотеку, запускай свой процесс с флагом CREATE_SUSPENDED, запиши в АП процесса строку с путём к dll, меняй EIP основного потока на адрес LoadLibraryW (надо позаботиться о том, чтобы на стеке лежал адрес строки и корректный адрес возврата) и отпускай поток.
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 12.01.2011 (Ср) 7:19

Twister писал(а):Эм, arthur2, а ты собрался просто так вот взять первую попавшуюся процедуру и запустить её в чужом процессе? :wink:

Twister, ты обломал весь кайф открытия того, что абы-какую процедуру нельзя тупо скопировать в чужое АП, у Артура, и весь кайф созерцания процесса открытия и описания мыслей по этому поводу Артуром — у меня.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как запретить чужой программе закрыться?

Сообщение Twister » 12.01.2011 (Ср) 7:35

Twister, ты обломал весь кайф
Нижайше кланяюсь и говорю "ну, сорри" :lol:
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 12.01.2011 (Ср) 7:36

На самом деле, что-нибудь вроде If msg_id = WM_CLOSE then exit function можно внедрять спокойно. А чтобы внедрять что-нибудь хитрое и сложное, вызывающее кучу API, я как раз и написал двухтысячестрочного монстра.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как запретить чужой программе закрыться?

Сообщение Twister » 12.01.2011 (Ср) 7:41

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запретить чужой программе закрыться?

Сообщение Хакер » 12.01.2011 (Ср) 7:48

Twister писал(а):кто-то должен заюзать SetWindowLong-функцию внутри целевого процесса

Внутри целевого процесса внутри внедряемой функции? Зачем?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 12.01.2011 (Ср) 8:06

Twister писал(а):Нужно добавить соответствующий манифест
Угу, я тоже так думал. Но вот тут мы до этого манифеста так и не добрались:
viewtopic.php?p=6745313#p6745313
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 12.01.2011 (Ср) 8:08

Хакер писал(а):Twister, ты обломал весь кайф открытия того, что абы-какую процедуру нельзя тупо скопировать в чужое АП, у Артура, и весь кайф созерцания процесса открытия и описания мыслей по этому поводу Артуром — у меня.
Кайф у тебя какой-то садисткий. Впрочем, давно подозревал.
Артур
 
   

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как запретить чужой программе закрыться?

Сообщение Twister » 12.01.2011 (Ср) 8:12

Хакер писал(а):
Twister писал(а):кто-то должен заюзать SetWindowLong-функцию внутри целевого процесса

Внутри целевого процесса внутри внедряемой функции? Зачем?
Ключевые слова здесь - внутри целевого процесса. SetWindowLong с параметром GWL_WNDPROC не сработает для окон чужого процесса. Значит вызывать её нужно во внедряемом коде. Следовательно, копировать нужно две функции: 1ая - установщик новой процедуры окна, 2ая - процедура окна. При этом еще нужна область глобальных данных, где бы 1ая процедура сохранила адрес оригинальной WndProc, а 2ая оттуда бы его брала. На асме и других человеческих языках это всё уместится в один блок данных, но как быть с глобальной внедряемой переменной в VB я не знаю, если только "костыли" юзать.
А я все практикую лечение травами...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как запретить чужой программе закрыться?

Сообщение arthur2 » 12.01.2011 (Ср) 8:21

Twister писал(а):меняй EIP основного потока на адрес LoadLibraryW (надо позаботиться о том, чтобы на стеке лежал адрес строки и корректный адрес возврата)
Что такое EIP?
Как получить корректный адрес возврата? и как положить на стек нужный адрес?
Артур
 
   

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Mail.ru [бот] и гости: 50

    TopList