Сейчас на форуме: ManHunter, rmn, _MBK_, tyns777 (+10 невидимых)

 eXeL@B —› Программирование —› Protect Process
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 14:21 · Поправил: OnLyOnE
· Личное сообщение · #1

Собственно задача состоит в том, чтобы защитить свой процесс от завершения в диспетчере задач и не только.
Примером может служить процесс smss.exe и реакция диспетчера задач на попытку его завершения.
Сразу говорю, гуглил .. много рассуждений на данную тему, но примера рабочего кода так и не нашел.(может хреново искал?)
В общем хотелось бы получить максимально развернутый ответ на поставленный вопрос с примером рабочего кода (язык не важен).
Из того что почерпнул в гугле и на васме, что можно хучить TerminateProcess и DebugExitProcess.
Вот интересно, есть другие способы кроме хука? Более "цивилизованные"?

P.S. Сразу оговорюсь, мой процесс -> сервис

-----
aLL rIGHTS rEVERSED!




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 апреля 2012 15:14 · Поправил: tihiy_grom
· Личное сообщение · #2

запускай 2 сервиса, чтобы один восстанавливал другого




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 апреля 2012 15:35
· Личное сообщение · #3

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




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 15:56 · Поправил: OnLyOnE
· Личное сообщение · #4

tihiy_grom пишет:
запускай 2 сервиса, чтобы один восстанавливал другого

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

Эт уже побывал... работает... но как бы тоже метод не исключительный по красоте реализации
Archer пишет:
ограничить юзера в правах только, не давай админа

тоже не вариант, увы..
P.S. Пока, в качестве хоть какой-то защиты прикрутил вот такое решение... оно не препятствует завершению процесса,
но делает BSOD системе при завершении моего процесса
Code:
  1. IsCriticalProcess proc OnOff
  2.  
  3.                  local hToken:dword
  4.                  local tkp:TOKEN_PRIVILEGES
  5.  
  6.                  invoke RtlZeroMemory,addr tkp,sizeof tkp
  7.                  invoke GetCurrentProcess
  8.                  lea ebx,hToken
  9.                  invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY,ebx 
  10.                  .if eax == NULL
  11.                   call LastError
  12.                  .endif
  13.                  invoke LookupPrivilegeValue,NULL,chr$("SeDebugPrivilege"),addr tkp.Privileges[0].Luid
  14.                  .if eax == NULL
  15.                   call LastError
  16.                  .endif           
  17.                  mov tkp.PrivilegeCount,1 
  18.                  mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED 
  19.                  invoke AdjustTokenPrivileges,hToken,FALSE,addr tkp,sizeof tkp,NULL,0
  20.                  invoke CloseHandle,hToken
  21.                  .if eax == NULL
  22.                   call LastError
  23.                  .endif                         
  24.                  invoke RtlSetProcessIsCritical,OnOff,NULL,FALSE
  25.                  ret
  26.  
  27. IsCriticalProcess endp

НО вопрос по теме остается открытым, т.е. требующего вариантов решения...

-----
aLL rIGHTS rEVERSED!




Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 07 апреля 2012 16:01 · Поправил: TryAga1n
· Личное сообщение · #5

Похукать NtOpenProcess, ZwTerminateProcess




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 16:02
· Личное сообщение · #6

TryAga1n пишет:
Похукать NtOpenProcess

Пример кода, как?

-----
aLL rIGHTS rEVERSED!




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 07 апреля 2012 16:11
· Личное сообщение · #7

Бред конечно, но например создай тред который со Sleep,100 будет проверять все процессы и если там есть TerminateProcess(и все остальные), блокировать их типа ret в начале.




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 07 апреля 2012 16:13
· Личное сообщение · #8

OnLyOnE
Не заморачивайся на защите а то получится как nProtect GameGuard,
пиши дровину и прячь свой процесс как олю прячет фантик хотя утиль от руссиновича всёравно найдёт его
tihiy_grom пишет:
запускай 2 сервиса, чтобы один восстанавливал другого

да заморожу я эти два процесса а потом кильну,даже пикнуть неуспеют...

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 07 апреля 2012 16:15 · Поправил: TryAga1n
· Личное сообщение · #9

Только через драйвер
http://somebastardstolemyname.wordpress.com/2008/10/04/c-ntopenprocess-hook/
-
Вообще вопрос этот чисто VX'ерский, так что стоит подомогаться до СЛиВок, он много может рассказать))




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 16:30
· Личное сообщение · #10

Vovan666 пишет:
Бред конечно, но например создай тред который со Sleep,100 будет проверять все процессы и если там есть TerminateProcess(и все остальные), блокировать их типа ret в начале.

Не айс если честно ... так можно и систему подвесить, если во всех процессах хутчить TerminateProcess и иже с ними..
ClockMan пишет:
пиши дровину и прячь свой процесс как олю прячет фантик

да мог бы я спрятать, и пример исходника дровины есть... но пока хочу той реализации о которой писал выше..
TryAga1n пишет:
Вообще вопрос этот чисто VX'ерский, так что стоит подомогаться до СЛиВок, он много может рассказать))

Ну... не VX'ерский... , просто от "продвинутых" пользователей которые суют нос куда не следует .

-----
aLL rIGHTS rEVERSED!




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 апреля 2012 16:32
· Личное сообщение · #11

OnLyOnE пишет:
Ну... не VX'ерский... , просто от "продвинутых" пользователей которые суют нос куда не следует .

ну тогда 2 контролирующих друг друга сервиса тебе вполне хватит




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 17:42
· Личное сообщение · #12

tihiy_grom пишет:
ну тогда 2 контролирующих друг друга сервиса тебе вполне хватит

ну не хочу я писать отладчик..плюс ресурсы дополнительные будет жрать такой тандем

-----
aLL rIGHTS rEVERSED!





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 07 апреля 2012 19:20
· Личное сообщение · #13

Поставь обработчик на закрытие твоего сервиса - открытие его снова.



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 07 апреля 2012 19:38
· Личное сообщение · #14

А утилита от Ms-Rem'a не лечит такое?




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 19:54 · Поправил: OnLyOnE
· Личное сообщение · #15

Dart Sergius пишет:
Поставь обработчик на закрытие твоего сервиса - открытие его снова.

Это, я так понял, во втором процессе? Можно..
NikolayD пишет:
А утилита от Ms-Rem'a не лечит такое?

Ну не буду же я таскать с вместе со своим сервисом какую-то утилиту?
P.S.
Но я так и не увидел ни одного даже самого маленького кусочка кода реализации одного из вариантов.
Слова.. слова...
P.P.S. Тайно надеюсь, что топ прочтет глубокоуважаемый системный гуру ntldr и посоветует дельное..

-----
aLL rIGHTS rEVERSED!





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 07 апреля 2012 20:44
· Личное сообщение · #16

OnLyOnE, а в сервисы не обрабатывают сами своё закрытие? Что если заменить обработчик системный на закрытие - своим?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 апреля 2012 20:53
· Личное сообщение · #17

Можно выставить автоматический рестарт сервиса, если он помер.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 21:27
· Личное сообщение · #18

Dart Sergius пишет:
OnLyOnE, а в сервисы не обрабатывают сами своё закрытие? Что если заменить обработчик системный на закрытие - своим?

естественно есть обработчик,но если мне самому надо будет нужно остановить сервис, я хрен это сделаю если в обработчике намучу рестарт, если я тебя правильно понял..
Archer пишет:
Можно выставить автоматический рестарт сервиса, если он помер.

Тоже самое, мне надо к примеру самому прибить сервис... ?..

-----
aLL rIGHTS rEVERSED!





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 апреля 2012 21:42
· Личное сообщение · #19

Помер!=корректно был завершён. Если сам начнёшь тоже прибивать через пень-колоду, таки да, тоже перезапустится.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 07 апреля 2012 21:55
· Личное сообщение · #20

Archer пишет:
Помер!=корректно был завершён. Если сам начнёшь тоже прибивать через пень-колоду, таки да, тоже перезапустится.

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

-----
aLL rIGHTS rEVERSED!





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 07 апреля 2012 21:56
· Личное сообщение · #21

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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 07 апреля 2012 22:12
· Личное сообщение · #22

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

| Сообщение посчитали полезным: OnLyOnE


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 07 апреля 2012 22:21 · Поправил: ARCHANGEL
· Личное сообщение · #23

OnLyOnE
--> Здесь <-- Ms-Rem показывает, как написать простенький драйвер, перехватывающий NtOpenProcess и не дающий диспетчерам задач из ринг3 грохать твой процесс. В конце есть сорцы. А с перезапуском - мне как-то не очень сама идея. Для того, чтобы нехорошие перцы-малварщики так не делали (не перезапускали свои малварные процессы), можно просто через CreateFile открыть Pe-файл с dwShareMode == 0 и никакой перезапуск такому сервису не поможет. Ибо CreateProcess нормально не отработает по понятным причинам. В случае же драйверного перехвата желательно не давать открыть и csrss.exe, ибо в нём есть все описатели процессов, через которые тоже можно грохнуть защищаемый тобой процесс.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 07 апреля 2012 23:09
· Личное сообщение · #24

Придет ntldr и скажет, что выхода нет

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

По нормальному я бы делал Длл с основной начинкой, она как сервис по умолчанию не будет видна в таск менеджере, далее наделать нужных гуи стабов, скажем ГУИ для управления, ГУИ с основным функционалом, далее накатать протокол общения через named pipes, ввести туда стандарт безопасности, таким образом без особого реверса только ты будешь общаться со своим сервисом, через протокол реализовать управление завершения или изменения параметра авторестарта.

Далее остальная начинка сервиса развертывает все стабы гуи скажем через планировщик задач, либо открытие ехе черех сторонний процесс через инжект и конект к сервису с проверкой. Если даже гуй будет леквидирован пользователем, он не завершит весь главный сервис, сервис легко запустит вновь нужный ему стаб для работы с пользователем. Если же адепт полезет в сервисы проверять или будет наводка на именно тот сервис, то сервис в списке сервисов можно скрыть через структуру SERVICE_RECORD, по принципу сокрытия тоже самое, что сокрытие в таскменеджере, нужно будет лишь перебрать их и найти свой сервис.

Вот статья на эту тему http://www.codeproject.com/Articles/46670/Service-Hiding

Также можно посмотреть плагины оллидбг там есть кажется сокрытие через хук опенпроцесс и NtQueryInformationProcess

Сам сервис при перезапуске

Code:
  1.  
  2. mov    Action0.aType, SC_ACTION_RESTART  
  3.  mov    Action0.Delay, 0h               
  4. mov    Action1.aType, SC_ACTION_RESTART  
  5. mov    Action1.Delay, 0h               
  6. mov    Action2.aType, SC_ACTION_RESTART  
  7. mov    Action2.Delay, 0h               
  8. mov    lpInfo1.dwResetPeriod, 1h      
  9. mov    lpInfo1.lpRebootMsg, 0            
  10. mov    lpInfo1.lpCommand, 0              
  11. mov    lpInfo1.cActions, 3               
  12. lea    eax, Action0                      
  13. mov    lpInfo1.lpsaActions, eax          
  14. invoke ChangeServiceConfig2, ServiceHandle, 2, addr lpInfo1
  15. ret


Все остальное через ControlService управляется как стандартный сервис. Клиент - Сервер техникой и легкой игрой с перехватами можно сделать нормальное сокрытие ИМХО

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: OnLyOnE, _ruzmaz_


Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 08 апреля 2012 01:12
· Личное сообщение · #25

Archer пишет:
Можно выставить автоматический рестарт сервиса, если он помер

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

но опять это всё обходится штатными утилями виндовс

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 08 апреля 2012 08:06
· Личное сообщение · #26

Archer пишет:
Почитай мой пост выше ещё раз. Я не имел в виду обработчики. А имел в виду стандартную виндовую фичу перезапуска сервисов в случае сбоев. Если происходит сбой (внезапно сервис сдох), винда его перезапустит, никакие обработчики трогать не надо.

Я понял, вариант неплохой скорее всего его и реализую.
mak
спасибо за код.

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 08 апреля 2012 09:18
· Личное сообщение · #27

Сделал
Для "продвинутых" юзверей действительно оптимальное решение "не убиваемого" процесса.
Вот мой код (может кому будет интересно)
Code:
  1. SERVICE_FAILURE_ACTIONS struct
  2. dwResetPeriod dd ?
  3. lpRebootMsg dd ?
  4. lpCommand dd ?
  5. cActions dd ?
  6. lpsaActions dd ?
  7. SERVICE_FAILURE_ACTIONS ends
  8.  
  9. SC_ACTION struct
  10. aType dd ?
  11. Delay dd ?
  12. SC_ACTION ends
  13.  
  14. SC_ACTIONS struct
  15. Action0 SC_ACTION <>
  16. Action1 SC_ACTION <>
  17. Action2 SC_ACTION <>
  18. SC_ACTIONS ends
  19.  
  20. SC_ACTION_RESTART = 1
  21.  
  22. .data
  23.  
  24. lpInfo SERVICE_FAILURE_ACTIONS <0>
  25. Actions SC_ACTIONS <>
  26.  
  27. .code
  28.                               mov hServiceBase,FUNC(OpenSCManager,NULL,NULL,SC_MANAGER_ALL_ACCESS)
  29.                               .if hServiceBase == NULL
  30.                                call LastError
  31.                                invoke ExitProcess,-1 
  32.                               .endif
  33.                               mov hService,FUNC(CreateService,hServiceBase,addr ServiceName,addr ServiceDisplayName,SERVICE_ALL_ACCESS,\
  34.                               SERVICE_WIN32_SHARE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,addr WindowsPath,NULL,NULL,NULL,NULL,NULL)
  35.                               .if hService == NULL
  36.                                call LastError
  37.                                invoke ExitProcess,-1 
  38.                               .endif
  39.                               mov Actions.Action0.aType,SC_ACTION_RESTART
  40.                               mov Actions.Action0.Delay,NULL
  41.                               mov Actions.Action1.aType,SC_ACTION_RESTART
  42.                               mov Actions.Action1.Delay,NULL
  43.                               mov Actions.Action2.aType,SC_ACTION_RESTART
  44.                               mov Actions.Action2.Delay,NULL
  45.                               mov lpInfo.dwResetPeriod,0
  46.                               mov lpInfo.lpRebootMsg,0
  47.                               mov lpInfo.lpCommand,0
  48.                               mov lpInfo.cActions,3
  49.                               lea eax,Actions
  50.                               mov lpInfo.lpsaActions,eax                  
  51.                               invoke ChangeServiceConfig2,hService,SERVICE_CONFIG_FAILURE_ACTIONS,addr lpInfo
  52.                               .if eax == NULL
  53.                                call LastError
  54.                               .endif                     
  55.                               invoke StartService,hService,NULL,NULL
  56.                               .if eax == NULL
  57.                                call LastError
  58.                               .endif                     
  59.                               invoke CloseServiceHandle,hService
  60.                               invoke CloseServiceHandle,hServiceBase


-----
aLL rIGHTS rEVERSED!




Ранг: 13.8 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 08 апреля 2012 17:50 · Поправил: cosinus
· Личное сообщение · #28

Дык не решилась проблемка-то.
Касаемо действий венды при сбое сервиса, то можно и в реестре сразу править ключи. Которые можно отловить RegMon'ом. Но это "кто-как-хочет".
Но если реально надо защитить процес от кыляния в "диспетчере задач" и других ринг3-утилитах, то лучше сделать так, чтобы имени этого процесса в этих утилита небыло
tasklist в командной строке и tasklist /svc
Или же "прятаться" ещё глубже, в тех "отличиях" выводимых консолью.
Тоесть лучше спрятаться, тогда перед тем чтобы кильнуть - следует поискать. И поиск через EPROCESS может обламаться
Думаю у меня получилось изложить ход мысли.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 апреля 2012 18:04
· Личное сообщение · #29

cosinus
Если уж развивать это направление, то любой "продвинутый" юзверь может качнуть RKU, перечислить все процессы и сделать Force Kill + File Erase, и если сервис представлен самостоятельным ехе-файлом, то можно сразу начинать отпевать его. И никакие трюки с EPROCESS тут не работают, ибо RKU юзает списки планировщика.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 08 апреля 2012 19:47
· Личное сообщение · #30

ARCHANGEL пишет:
то любой "продвинутый" юзверь

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

-----
aLL rIGHTS rEVERSED!



. 1 . 2 . >>
 eXeL@B —› Программирование —› Protect Process
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати