информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыАтака на InternetСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Утекший код XP и Windows Server... 
 Дела виртуальные 
 Простое пробивание рабочего/провайдерского... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
ntdll.dll::NtSuspendProcess() 31.01.05 15:42  Число просмотров: 1188
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
про Win95/98/Me ничего сказать не могу
<programming>
[Win32] Возможно ли остановить все потоки какого-нибудь процесса одним вызовом API? 31.01.05 15:11  
Автор: HandleX <Александр Майборода> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Или перебирать все его потоки, делая им SuspendThread() ???

Как-то не нравится мне "растянутость" сего действа...
Потоки могут создаваться и уничтожаться очень быстро и их может быть тысячи... И кто-то после снятия снэпшота отойдёт в "мир иной", а кто-то новый родится ;-)

Заранее всем спасибо за ответы.
ntdll.dll::NtSuspendProcess() 31.01.05 15:42  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
про Win95/98/Me ничего сказать не могу
Ох, вещь... А прототипы можно к ней? И обратной к ней тоже (NtResumeProcess)? 31.01.05 15:50  
Автор: HandleX <Александр Майборода> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Мог бы догадаться :) 31.01.05 15:55  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
NTSTATUS STDCALL NtSuspendProcess(IN HANDLE Process);
NTSTATUS STDCALL NtResumeProcess(IN HANDLE Process);
И ещё: она в user mode вызывается? 31.01.05 15:55  
Автор: HandleX <Александр Майборода> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Все что в ntdll.dll только для user-mode (подсистема win32,... 31.01.05 15:59  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Все что в ntdll.dll только для user-mode (подсистема win32, для kernel-mode нужно subsystem='native').
Там еще много чего хорошего/удобного/полезного, я вот туда из delphi часто "хожу" :)
Минус (или плюс?) только один - ntdll.dll нет под win95/98/me.
Ну и напоследок: у замороженного таким способом процесса можно запустить отдельный поток(и) вызовом ResumeThread(), т.е... 31.01.05 16:06  
Автор: HandleX <Александр Майборода> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Она работает как обычный SuspendThread, увеличивая счётчик "саспендности" каждого потока, или же фиг вам до особого вызова ResumeProcess?

Если увеличивает счётчики потоков, значит их состояние как-бы запоминается до остановки, поскольку не нужно, чтобы уже остановленные потоки (до вызова SuspendProcess), вдруг, после вызова ResumeProcess(), ВСЕ ломанулись как бешенные ;-)
В NT у процесса нет понятия "замороженности", и насколько я... 31.01.05 17:46  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
В NT у процесса нет понятия "замороженности", и насколько я знаю в KPROCESS и ЕPROCESS нет полей, которые за это отвечают. Поэтому NtSuspendProcess() может только за-suspend-ить все треды. Другое дело, что при этом будет блокирована база данных диспетчера, и новые треды не должны создаваться при всем желании. Поэтому, думаю, что после NtSuspendProcess() можно бес проблем запустить отдельный поток через NTResumeThread().

Есть один "хитрый" момент в случае race между NtCreateThread() и NtSuspendProcess(). Когда suspend уже захватил блокировку, а create уже выполняется в режиме ядра и с race-опозданием дошел до той-же блокировки. Теоретически возможно, что create продолжит выполнение и создаст новый выполняющийся поток, сразу после того, как suspend остановит все существовавшие до этого потоки и отпустит блокировку. Но думаю, что такая ситуация предусмотренна и все продуманно.
Вроде можно 31.01.05 17:41  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Она работает как обычный SuspendThread, увеличивая счётчик
> "саспендности" каждого потока, или же фиг вам до особого
> вызова ResumeProcess?
Только что посмотрел, в цикле саспендятся все потоки процесса (ну а саспенд потока - это увеличение SuspendCount-а)
А блокировка есть какая-нибудь перед перебором (для обеспечения атомарности)? 31.01.05 17:50  
Автор: HandleX <Александр Майборода> Статус: The Elderman
Отредактировано 31.01.05 17:51  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Есть ExAquireRundownProtection 31.01.05 18:52  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Хотя не знаю, что это за защита, раз есть - значит скорее всего работает как предполагается
Всем спасибо, всё работает! 2 leo & amirul — many thanks!!! 31.01.05 19:26  
Автор: HandleX <Александр Майборода> Статус: The Elderman
Отредактировано 31.01.05 19:27  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Ты дизассемблировал или есть сорцы этой части W2K? 31.01.05 17:48  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Дизассемблировал, потому как именно этой функции в сырцах и нету 31.01.05 18:49  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Да собственно, там и дизассемблировать то нечего:

nt!PsSuspendProcess:
80607738 53               push    ebx
80607739 57               push    edi
8060773a 8b7c240c         mov     edi,[esp+0xc]
8060773e 8d9f80000000     lea     ebx,[edi+0x80]
80607744 8bcb             mov     ecx,ebx
80607746 e8c617f7ff       call    nt!ExAcquireRundownProtection (80578f11)
8060774b 84c0             test    al,al
8060774d 7426             jz      nt!PsSuspendProcess+0x3d (80607775)
8060774f 56               push    esi
80607750 6a00             push    0x0
80607752 eb09             jmp     nt!PsSuspendProcess+0x25 (8060775d)
80607754 6a00             push    0x0
80607756 56               push    esi
80607757 e89e48faff       call    nt!PsSuspendThread (805abffa)
8060775c 56               push    esi
8060775d 57               push    edi
8060775e e8384ef6ff       call    nt!PsGetNextProcessThread (8056c59b)
80607763 8bf0             mov     esi,eax
80607765 85f6             test    esi,esi
80607767 75eb             jnz     nt!PsSuspendProcess+0x1c (80607754)
80607769 8bcb             mov     ecx,ebx
8060776b e8d817f7ff       call    nt!ExReleaseRundownProtection (80578f48)
80607770 33c0             xor     eax,eax
80607772 5e               pop     esi
80607773 eb05             jmp     nt!PsSuspendProcess+0x42 (8060777a)
80607775 b80a0100c0       mov     eax,0xc000010a
8060777a 5f               pop     edi
8060777b 5b               pop     ebx
8060777c c20400           ret     0x4

nt!NtSuspendProcess:
8060777f 55               push    ebp
80607780 8bec             mov     ebp,esp
80607782 51               push    ecx
80607783 56               push    esi
80607784 64a124010000     mov     eax,fs:[00000124]
8060778a 8a8040010000     mov     al,[eax+0x140]
80607790 6a00             push    0x0
80607792 8845fc           mov     [ebp-0x4],al
80607795 8d4508           lea     eax,[ebp+0x8]
80607798 50               push    eax
80607799 ff75fc           push    dword ptr [ebp-0x4]
8060779c ff35587c5480     push    dword ptr [nt!PsProcessType (80547c58)]
806077a2 6800080000       push    0x800
806077a7 ff7508           push    dword ptr [ebp+0x8]
806077aa e83080f6ff       call    nt!ObReferenceObjectByHandle (8056f7df)
806077af 8bf0             mov     esi,eax
806077b1 85f6             test    esi,esi
806077b3 7c12             jl      nt!NtSuspendProcess+0x48 (806077c7)
806077b5 ff7508           push    dword ptr [ebp+0x8]
806077b8 e87bffffff       call    nt!PsSuspendProcess (80607738)
806077bd 8b4d08           mov     ecx,[ebp+0x8]
806077c0 8bf0             mov     esi,eax
806077c2 e80926eeff       call    nt!ObfDereferenceObject (804e9dd0)
806077c7 8bc6             mov     eax,esi
806077c9 5e               pop     esi
806077ca c9               leave
806077cb c20400           ret     0x4

---
Одним думаю не получицца 31.01.05 15:28  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Но можно извернуться - перехватить CreateThread (и соответствующую нативную ZwCreateThread) и замораживать сам процесс создания новых потоков Ж). А то что старые могут умереть к тому времени.. Ну чтож - это в принципе не так страшно, для профилактики можно приоритет процесса выставить в IDLE а свой - REALTIME.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach